Files
kolmck/Addons/KOLBlockCipher.pas

7884 lines
327 KiB
ObjectPascal
Raw Normal View History

unit KOLBlockCipher;
{$A1}
interface
uses Windows, Messages, KOL;
type
// PBlockCipher64 = ^TBlockCipher64;
TBlockCipher64 = object(TObj)
protected
IV, CV: array[0..7] of byte;
procedure IncCounter;
public
// code
procedure InitKey(const Key; Size: longword);virtual;
procedure Reset;
{ Reset any stored chaining information }
procedure Burn;virtual;
{ Clear all stored key information and chaining information }
procedure SetIV(const Value);
{ Sets the IV to Value and performs a reset }
procedure GetIV(var Value);
{ Returns the current chaining information, not the actual IV }
procedure InitBlockCipher64(const Key; Size: longword; InitVector: pointer);
{ Do key setup based on the data in Key, size is in bits }
procedure EncryptCBC(const Indata; var Outdata; Size: longword);
{ Encrypt size bytes of data using the CBC method of encryption }
procedure DecryptCBC(const Indata; var Outdata; Size: longword);
{ Decrypt size bytes of data using the CBC method of decryption }
procedure EncryptCFB8bit(const Indata; var Outdata; Size: longword);
{ Encrypt size bytes of data using the CFB (8 bit) method of encryption }
procedure DecryptCFB8bit(const Indata; var Outdata; Size: longword);
{ Decrypt size bytes of data using the CFB (8 bit) method of decryption }
procedure EncryptCFBblock(const Indata; var Outdata; Size: longword);
{ Encrypt size bytes of data using the CFB (block) method of encryption }
procedure DecryptCFBblock(const Indata; var Outdata; Size: longword);
{ Decrypt size bytes of data using the CFB (block) method of decryption }
procedure EncryptOFB(const Indata; var Outdata; Size: longword);
{ Encrypt size bytes of data using the OFB method of encryption }
procedure DecryptOFB(const Indata; var Outdata; Size: longword);
{ Decrypt size bytes of data using the OFB method of decryption }
procedure EncryptCTR(const Indata; var Outdata; Size: longword);
{ Encrypt size bytes of data using the CTR method of encryption }
procedure DecryptCTR(const Indata; var Outdata; Size: longword);
{ Decrypt size bytes of data using the CTR method of decryption }
procedure EncryptECB(const Indata; var Outdata);virtual;
{ Override it! }
procedure DecryptECB(const Indata; var Outdata);virtual;
{ Override it! }
destructor Destroy; virtual;
end;
type
// PBlockCipher128 = ^TBlockCipher128;
TBlockCipher128 = object(TObj)
private
IV, CV: array[0..15] of byte;
procedure IncCounter;
public
procedure InitKey(const Key; Size: longword);virtual;
procedure Reset;
{ Reset any stored chaining information }
procedure Burn;
{ Clear all stored key information and chaining information }
procedure SetIV(const Value);
{ Sets the IV to Value and performs a reset }
procedure GetIV(var Value);
{ Returns the current chaining information, not the actual IV }
procedure InitBlockCipher128(const Key; Size: longword; InitVector: pointer);
{ Do key setup based on the data in Key, size is in bits }
procedure EncryptCBC(const Indata; var Outdata; Size: longword);
{ Encrypt size bytes of data using the CBC method of encryption }
procedure DecryptCBC(const Indata; var Outdata; Size: longword);
{ Decrypt size bytes of data using the CBC method of decryption }
procedure EncryptCFB8bit(const Indata; var Outdata; Size: longword);
{ Encrypt size bytes of data using the CFB (8 bit) method of encryption }
procedure DecryptCFB8bit(const Indata; var Outdata; Size: longword);
{ Decrypt size bytes of data using the CFB (8 bit) method of decryption }
procedure EncryptCFBblock(const Indata; var Outdata; Size: longword);
{ Encrypt size bytes of data using the CFB (block) method of encryption }
procedure DecryptCFBblock(const Indata; var Outdata; Size: longword);
{ Decrypt size bytes of data using the CFB (block) method of decryption }
procedure EncryptOFB(const Indata; var Outdata; Size: longword);
{ Encrypt size bytes of data using the OFB method of encryption }
procedure DecryptOFB(const Indata; var Outdata; Size: longword);
{ Decrypt size bytes of data using the OFB method of decryption }
procedure EncryptCTR(const Indata; var Outdata; Size: longword);
{ Encrypt size bytes of data using the CTR method of encryption }
procedure DecryptCTR(const Indata; var Outdata; Size: longword);
{ Decrypt size bytes of data using the CTR method of decryption }
procedure EncryptECB(const Indata; var Outdata);virtual;
{ Override it! }
procedure DecryptECB(const Indata; var Outdata);virtual;
{ Override it! }
destructor Destroy; virtual;
end;
//Blowfish cipher implementation
const
PBoxOrg: array[0..17] of DWord= (
$243f6a88, $85a308d3, $13198a2e, $03707344,
$a4093822, $299f31d0, $082efa98, $ec4e6c89,
$452821e6, $38d01377, $be5466cf, $34e90c6c,
$c0ac29b7, $c97c50dd, $3f84d5b5, $b5470917,
$9216d5d9, $8979fb1b);
SBoxOrg: array[0..3,0..255] of DWord= ((
$d1310ba6, $98dfb5ac, $2ffd72db, $d01adfb7,
$b8e1afed, $6a267e96, $ba7c9045, $f12c7f99,
$24a19947, $b3916cf7, $0801f2e2, $858efc16,
$636920d8, $71574e69, $a458fea3, $f4933d7e,
$0d95748f, $728eb658, $718bcd58, $82154aee,
$7b54a41d, $c25a59b5, $9c30d539, $2af26013,
$c5d1b023, $286085f0, $ca417918, $b8db38ef,
$8e79dcb0, $603a180e, $6c9e0e8b, $b01e8a3e,
$d71577c1, $bd314b27, $78af2fda, $55605c60,
$e65525f3, $aa55ab94, $57489862, $63e81440,
$55ca396a, $2aab10b6, $b4cc5c34, $1141e8ce,
$a15486af, $7c72e993, $b3ee1411, $636fbc2a,
$2ba9c55d, $741831f6, $ce5c3e16, $9b87931e,
$afd6ba33, $6c24cf5c, $7a325381, $28958677,
$3b8f4898, $6b4bb9af, $c4bfe81b, $66282193,
$61d809cc, $fb21a991, $487cac60, $5dec8032,
$ef845d5d, $e98575b1, $dc262302, $eb651b88,
$23893e81, $d396acc5, $0f6d6ff3, $83f44239,
$2e0b4482, $a4842004, $69c8f04a, $9e1f9b5e,
$21c66842, $f6e96c9a, $670c9c61, $abd388f0,
$6a51a0d2, $d8542f68, $960fa728, $ab5133a3,
$6eef0b6c, $137a3be4, $ba3bf050, $7efb2a98,
$a1f1651d, $39af0176, $66ca593e, $82430e88,
$8cee8619, $456f9fb4, $7d84a5c3, $3b8b5ebe,
$e06f75d8, $85c12073, $401a449f, $56c16aa6,
$4ed3aa62, $363f7706, $1bfedf72, $429b023d,
$37d0d724, $d00a1248, $db0fead3, $49f1c09b,
$075372c9, $80991b7b, $25d479d8, $f6e8def7,
$e3fe501a, $b6794c3b, $976ce0bd, $04c006ba,
$c1a94fb6, $409f60c4, $5e5c9ec2, $196a2463,
$68fb6faf, $3e6c53b5, $1339b2eb, $3b52ec6f,
$6dfc511f, $9b30952c, $cc814544, $af5ebd09,
$bee3d004, $de334afd, $660f2807, $192e4bb3,
$c0cba857, $45c8740f, $d20b5f39, $b9d3fbdb,
$5579c0bd, $1a60320a, $d6a100c6, $402c7279,
$679f25fe, $fb1fa3cc, $8ea5e9f8, $db3222f8,
$3c7516df, $fd616b15, $2f501ec8, $ad0552ab,
$323db5fa, $fd238760, $53317b48, $3e00df82,
$9e5c57bb, $ca6f8ca0, $1a87562e, $df1769db,
$d542a8f6, $287effc3, $ac6732c6, $8c4f5573,
$695b27b0, $bbca58c8, $e1ffa35d, $b8f011a0,
$10fa3d98, $fd2183b8, $4afcb56c, $2dd1d35b,
$9a53e479, $b6f84565, $d28e49bc, $4bfb9790,
$e1ddf2da, $a4cb7e33, $62fb1341, $cee4c6e8,
$ef20cada, $36774c01, $d07e9efe, $2bf11fb4,
$95dbda4d, $ae909198, $eaad8e71, $6b93d5a0,
$d08ed1d0, $afc725e0, $8e3c5b2f, $8e7594b7,
$8ff6e2fb, $f2122b64, $8888b812, $900df01c,
$4fad5ea0, $688fc31c, $d1cff191, $b3a8c1ad,
$2f2f2218, $be0e1777, $ea752dfe, $8b021fa1,
$e5a0cc0f, $b56f74e8, $18acf3d6, $ce89e299,
$b4a84fe0, $fd13e0b7, $7cc43b81, $d2ada8d9,
$165fa266, $80957705, $93cc7314, $211a1477,
$e6ad2065, $77b5fa86, $c75442f5, $fb9d35cf,
$ebcdaf0c, $7b3e89a0, $d6411bd3, $ae1e7e49,
$00250e2d, $2071b35e, $226800bb, $57b8e0af,
$2464369b, $f009b91e, $5563911d, $59dfa6aa,
$78c14389, $d95a537f, $207d5ba2, $02e5b9c5,
$83260376, $6295cfa9, $11c81968, $4e734a41,
$b3472dca, $7b14a94a, $1b510052, $9a532915,
$d60f573f, $bc9bc6e4, $2b60a476, $81e67400,
$08ba6fb5, $571be91f, $f296ec6b, $2a0dd915,
$b6636521, $e7b9f9b6, $ff34052e, $c5855664,
$53b02d5d, $a99f8fa1, $08ba4799, $6e85076a),(
$4b7a70e9, $b5b32944, $db75092e, $c4192623,
$ad6ea6b0, $49a7df7d, $9cee60b8, $8fedb266,
$ecaa8c71, $699a17ff, $5664526c, $c2b19ee1,
$193602a5, $75094c29, $a0591340, $e4183a3e,
$3f54989a, $5b429d65, $6b8fe4d6, $99f73fd6,
$a1d29c07, $efe830f5, $4d2d38e6, $f0255dc1,
$4cdd2086, $8470eb26, $6382e9c6, $021ecc5e,
$09686b3f, $3ebaefc9, $3c971814, $6b6a70a1,
$687f3584, $52a0e286, $b79c5305, $aa500737,
$3e07841c, $7fdeae5c, $8e7d44ec, $5716f2b8,
$b03ada37, $f0500c0d, $f01c1f04, $0200b3ff,
$ae0cf51a, $3cb574b2, $25837a58, $dc0921bd,
$d19113f9, $7ca92ff6, $94324773, $22f54701,
$3ae5e581, $37c2dadc, $c8b57634, $9af3dda7,
$a9446146, $0fd0030e, $ecc8c73e, $a4751e41,
$e238cd99, $3bea0e2f, $3280bba1, $183eb331,
$4e548b38, $4f6db908, $6f420d03, $f60a04bf,
$2cb81290, $24977c79, $5679b072, $bcaf89af,
$de9a771f, $d9930810, $b38bae12, $dccf3f2e,
$5512721f, $2e6b7124, $501adde6, $9f84cd87,
$7a584718, $7408da17, $bc9f9abc, $e94b7d8c,
$ec7aec3a, $db851dfa, $63094366, $c464c3d2,
$ef1c1847, $3215d908, $dd433b37, $24c2ba16,
$12a14d43, $2a65c451, $50940002, $133ae4dd,
$71dff89e, $10314e55, $81ac77d6, $5f11199b,
$043556f1, $d7a3c76b, $3c11183b, $5924a509,
$f28fe6ed, $97f1fbfa, $9ebabf2c, $1e153c6e,
$86e34570, $eae96fb1, $860e5e0a, $5a3e2ab3,
$771fe71c, $4e3d06fa, $2965dcb9, $99e71d0f,
$803e89d6, $5266c825, $2e4cc978, $9c10b36a,
$c6150eba, $94e2ea78, $a5fc3c53, $1e0a2df4,
$f2f74ea7, $361d2b3d, $1939260f, $19c27960,
$5223a708, $f71312b6, $ebadfe6e, $eac31f66,
$e3bc4595, $a67bc883, $b17f37d1, $018cff28,
$c332ddef, $be6c5aa5, $65582185, $68ab9802,
$eecea50f, $db2f953b, $2aef7dad, $5b6e2f84,
$1521b628, $29076170, $ecdd4775, $619f1510,
$13cca830, $eb61bd96, $0334fe1e, $aa0363cf,
$b5735c90, $4c70a239, $d59e9e0b, $cbaade14,
$eecc86bc, $60622ca7, $9cab5cab, $b2f3846e,
$648b1eaf, $19bdf0ca, $a02369b9, $655abb50,
$40685a32, $3c2ab4b3, $319ee9d5, $c021b8f7,
$9b540b19, $875fa099, $95f7997e, $623d7da8,
$f837889a, $97e32d77, $11ed935f, $16681281,
$0e358829, $c7e61fd6, $96dedfa1, $7858ba99,
$57f584a5, $1b227263, $9b83c3ff, $1ac24696,
$cdb30aeb, $532e3054, $8fd948e4, $6dbc3128,
$58ebf2ef, $34c6ffea, $fe28ed61, $ee7c3c73,
$5d4a14d9, $e864b7e3, $42105d14, $203e13e0,
$45eee2b6, $a3aaabea, $db6c4f15, $facb4fd0,
$c742f442, $ef6abbb5, $654f3b1d, $41cd2105,
$d81e799e, $86854dc7, $e44b476a, $3d816250,
$cf62a1f2, $5b8d2646, $fc8883a0, $c1c7b6a3,
$7f1524c3, $69cb7492, $47848a0b, $5692b285,
$095bbf00, $ad19489d, $1462b174, $23820e00,
$58428d2a, $0c55f5ea, $1dadf43e, $233f7061,
$3372f092, $8d937e41, $d65fecf1, $6c223bdb,
$7cde3759, $cbee7460, $4085f2a7, $ce77326e,
$a6078084, $19f8509e, $e8efd855, $61d99735,
$a969a7aa, $c50c06c2, $5a04abfc, $800bcadc,
$9e447a2e, $c3453484, $fdd56705, $0e1e9ec9,
$db73dbd3, $105588cd, $675fda79, $e3674340,
$c5c43465, $713e38d8, $3d28f89e, $f16dff20,
$153e21e7, $8fb03d4a, $e6e39f2b, $db83adf7),(
$e93d5a68, $948140f7, $f64c261c, $94692934,
$411520f7, $7602d4f7, $bcf46b2e, $d4a20068,
$d4082471, $3320f46a, $43b7d4b7, $500061af,
$1e39f62e, $97244546, $14214f74, $bf8b8840,
$4d95fc1d, $96b591af, $70f4ddd3, $66a02f45,
$bfbc09ec, $03bd9785, $7fac6dd0, $31cb8504,
$96eb27b3, $55fd3941, $da2547e6, $abca0a9a,
$28507825, $530429f4, $0a2c86da, $e9b66dfb,
$68dc1462, $d7486900, $680ec0a4, $27a18dee,
$4f3ffea2, $e887ad8c, $b58ce006, $7af4d6b6,
$aace1e7c, $d3375fec, $ce78a399, $406b2a42,
$20fe9e35, $d9f385b9, $ee39d7ab, $3b124e8b,
$1dc9faf7, $4b6d1856, $26a36631, $eae397b2,
$3a6efa74, $dd5b4332, $6841e7f7, $ca7820fb,
$fb0af54e, $d8feb397, $454056ac, $ba489527,
$55533a3a, $20838d87, $fe6ba9b7, $d096954b,
$55a867bc, $a1159a58, $cca92963, $99e1db33,
$a62a4a56, $3f3125f9, $5ef47e1c, $9029317c,
$fdf8e802, $04272f70, $80bb155c, $05282ce3,
$95c11548, $e4c66d22, $48c1133f, $c70f86dc,
$07f9c9ee, $41041f0f, $404779a4, $5d886e17,
$325f51eb, $d59bc0d1, $f2bcc18f, $41113564,
$257b7834, $602a9c60, $dff8e8a3, $1f636c1b,
$0e12b4c2, $02e1329e, $af664fd1, $cad18115,
$6b2395e0, $333e92e1, $3b240b62, $eebeb922,
$85b2a20e, $e6ba0d99, $de720c8c, $2da2f728,
$d0127845, $95b794fd, $647d0862, $e7ccf5f0,
$5449a36f, $877d48fa, $c39dfd27, $f33e8d1e,
$0a476341, $992eff74, $3a6f6eab, $f4f8fd37,
$a812dc60, $a1ebddf8, $991be14c, $db6e6b0d,
$c67b5510, $6d672c37, $2765d43b, $dcd0e804,
$f1290dc7, $cc00ffa3, $b5390f92, $690fed0b,
$667b9ffb, $cedb7d9c, $a091cf0b, $d9155ea3,
$bb132f88, $515bad24, $7b9479bf, $763bd6eb,
$37392eb3, $cc115979, $8026e297, $f42e312d,
$6842ada7, $c66a2b3b, $12754ccc, $782ef11c,
$6a124237, $b79251e7, $06a1bbe6, $4bfb6350,
$1a6b1018, $11caedfa, $3d25bdd8, $e2e1c3c9,
$44421659, $0a121386, $d90cec6e, $d5abea2a,
$64af674e, $da86a85f, $bebfe988, $64e4c3fe,
$9dbc8057, $f0f7c086, $60787bf8, $6003604d,
$d1fd8346, $f6381fb0, $7745ae04, $d736fccc,
$83426b33, $f01eab71, $b0804187, $3c005e5f,
$77a057be, $bde8ae24, $55464299, $bf582e61,
$4e58f48f, $f2ddfda2, $f474ef38, $8789bdc2,
$5366f9c3, $c8b38e74, $b475f255, $46fcd9b9,
$7aeb2661, $8b1ddf84, $846a0e79, $915f95e2,
$466e598e, $20b45770, $8cd55591, $c902de4c,
$b90bace1, $bb8205d0, $11a86248, $7574a99e,
$b77f19b6, $e0a9dc09, $662d09a1, $c4324633,
$e85a1f02, $09f0be8c, $4a99a025, $1d6efe10,
$1ab93d1d, $0ba5a4df, $a186f20f, $2868f169,
$dcb7da83, $573906fe, $a1e2ce9b, $4fcd7f52,
$50115e01, $a70683fa, $a002b5c4, $0de6d027,
$9af88c27, $773f8641, $c3604c06, $61a806b5,
$f0177a28, $c0f586e0, $006058aa, $30dc7d62,
$11e69ed7, $2338ea63, $53c2dd94, $c2c21634,
$bbcbee56, $90bcb6de, $ebfc7da1, $ce591d76,
$6f05e409, $4b7c0188, $39720a3d, $7c927c24,
$86e3725f, $724d9db9, $1ac15bb4, $d39eb8fc,
$ed545578, $08fca5b5, $d83d7cd3, $4dad0fc4,
$1e50ef5e, $b161e6f8, $a28514d9, $6c51133c,
$6fd5c7e7, $56e14ec4, $362abfce, $ddc6c837,
$d79a3234, $92638212, $670efa8e, $406000e0),(
$3a39ce37, $d3faf5cf, $abc27737, $5ac52d1b,
$5cb0679e, $4fa33742, $d3822740, $99bc9bbe,
$d5118e9d, $bf0f7315, $d62d1c7e, $c700c47b,
$b78c1b6b, $21a19045, $b26eb1be, $6a366eb4,
$5748ab2f, $bc946e79, $c6a376d2, $6549c2c8,
$530ff8ee, $468dde7d, $d5730a1d, $4cd04dc6,
$2939bbdb, $a9ba4650, $ac9526e8, $be5ee304,
$a1fad5f0, $6a2d519a, $63ef8ce2, $9a86ee22,
$c089c2b8, $43242ef6, $a51e03aa, $9cf2d0a4,
$83c061ba, $9be96a4d, $8fe51550, $ba645bd6,
$2826a2f9, $a73a3ae1, $4ba99586, $ef5562e9,
$c72fefd3, $f752f7da, $3f046f69, $77fa0a59,
$80e4a915, $87b08601, $9b09e6ad, $3b3ee593,
$e990fd5a, $9e34d797, $2cf0b7d9, $022b8b51,
$96d5ac3a, $017da67d, $d1cf3ed6, $7c7d2d28,
$1f9f25cf, $adf2b89b, $5ad6b472, $5a88f54c,
$e029ac71, $e019a5e6, $47b0acfd, $ed93fa9b,
$e8d3c48d, $283b57cc, $f8d56629, $79132e28,
$785f0191, $ed756055, $f7960e44, $e3d35e8c,
$15056dd4, $88f46dba, $03a16125, $0564f0bd,
$c3eb9e15, $3c9057a2, $97271aec, $a93a072a,
$1b3f6d9b, $1e6321f5, $f59c66fb, $26dcf319,
$7533d928, $b155fdf5, $03563482, $8aba3cbb,
$28517711, $c20ad9f8, $abcc5167, $ccad925f,
$4de81751, $3830dc8e, $379d5862, $9320f991,
$ea7a90c2, $fb3e7bce, $5121ce64, $774fbe32,
$a8b6e37e, $c3293d46, $48de5369, $6413e680,
$a2ae0810, $dd6db224, $69852dfd, $09072166,
$b39a460a, $6445c0dd, $586cdecf, $1c20c8ae,
$5bbef7dd, $1b588d40, $ccd2017f, $6bb4e3bb,
$dda26a7e, $3a59ff45, $3e350a44, $bcb4cdd5,
$72eacea8, $fa6484bb, $8d6612ae, $bf3c6f47,
$d29be463, $542f5d9e, $aec2771b, $f64e6370,
$740e0d8d, $e75b1357, $f8721671, $af537d5d,
$4040cb08, $4eb4e2cc, $34d2466a, $0115af84,
$e1b00428, $95983a1d, $06b89fb4, $ce6ea048,
$6f3f3b82, $3520ab82, $011a1d4b, $277227f8,
$611560b1, $e7933fdc, $bb3a792b, $344525bd,
$a08839e1, $51ce794b, $2f32c9b7, $a01fbac9,
$e01cc87e, $bcc7d1f6, $cf0111c3, $a1e8aac7,
$1a908749, $d44fbd9a, $d0dadecb, $d50ada38,
$0339c32a, $c6913667, $8df9317c, $e0b12b4f,
$f79e59b7, $43f5bb3a, $f2d519ff, $27d9459c,
$bf97222c, $15e6fc2a, $0f91fc71, $9b941525,
$fae59361, $ceb69ceb, $c2a86459, $12baa8d1,
$b6c1075e, $e3056a0c, $10d25065, $cb03a442,
$e0ec6e0e, $1698db3b, $4c98a0be, $3278e964,
$9f1f9532, $e0d392df, $d3a0342b, $8971f21e,
$1b0a7441, $4ba3348c, $c5be7120, $c37632d8,
$df359f8d, $9b992f2e, $e60b6f47, $0fe3f11d,
$e54cda54, $1edad891, $ce6279cf, $cd3e7e6f,
$1618b166, $fd2c1d05, $848fd2c5, $f6fb2299,
$f523f357, $a6327623, $93a83531, $56cccd02,
$acf08162, $5a75ebb5, $6e163697, $88d273cc,
$de966292, $81b949d0, $4c50901b, $71c65614,
$e6c6c7bd, $327a140a, $45e1d006, $c3f27b9a,
$c9aa53fd, $62a80f00, $bb25bfe2, $35bdd2f6,
$71126905, $b2040222, $b6cbcf7c, $cd769c2b,
$53113ec0, $1640e3d3, $38abbd60, $2547adf0,
$ba38209c, $f746ce76, $77afa1c5, $20756060,
$85cbfe4e, $8ae88dd8, $7aaaf9b0, $4cf9aa7e,
$1948c25c, $02fb8a8c, $01c36ae4, $d6ebe1f9,
$90d4f869, $a65cdea0, $3f09252d, $c208e69f,
$b74e6132, $ce77e25b, $578fdfe3, $3ac372e6));
type
PByteArray = ^TByteArray;
TByteArray = array[0..32767] of Byte;
type
PBlowfish = ^TBlowfish;
TBlowfish = object(TBlockCipher64)
protected
SBox: array[0..3,0..255] of DWord;
PBox: array[0..17] of DWord;
public
procedure Burn;virtual;
procedure InitKey(const Key; Size: longword);virtual;
procedure EncryptECB(const InData; var OutData);virtual;
procedure DecryptECB(const InData; var OutData);virtual;
destructor Destroy; virtual;
end;
//Cast128 cipher implementation
const
cast_sbox1: array[0..255]of DWord= (
$30FB40D4, $9FA0FF0B, $6BECCD2F, $3F258C7A,
$1E213F2F, $9C004DD3, $6003E540, $CF9FC949,
$BFD4AF27, $88BBBDB5, $E2034090, $98D09675,
$6E63A0E0, $15C361D2, $C2E7661D, $22D4FF8E,
$28683B6F, $C07FD059, $FF2379C8, $775F50E2,
$43C340D3, $DF2F8656, $887CA41A, $A2D2BD2D,
$A1C9E0D6, $346C4819, $61B76D87, $22540F2F,
$2ABE32E1, $AA54166B, $22568E3A, $A2D341D0,
$66DB40C8, $A784392F, $004DFF2F, $2DB9D2DE,
$97943FAC, $4A97C1D8, $527644B7, $B5F437A7,
$B82CBAEF, $D751D159, $6FF7F0ED, $5A097A1F,
$827B68D0, $90ECF52E, $22B0C054, $BC8E5935,
$4B6D2F7F, $50BB64A2, $D2664910, $BEE5812D,
$B7332290, $E93B159F, $B48EE411, $4BFF345D,
$FD45C240, $AD31973F, $C4F6D02E, $55FC8165,
$D5B1CAAD, $A1AC2DAE, $A2D4B76D, $C19B0C50,
$882240F2, $0C6E4F38, $A4E4BFD7, $4F5BA272,
$564C1D2F, $C59C5319, $B949E354, $B04669FE,
$B1B6AB8A, $C71358DD, $6385C545, $110F935D,
$57538AD5, $6A390493, $E63D37E0, $2A54F6B3,
$3A787D5F, $6276A0B5, $19A6FCDF, $7A42206A,
$29F9D4D5, $F61B1891, $BB72275E, $AA508167,
$38901091, $C6B505EB, $84C7CB8C, $2AD75A0F,
$874A1427, $A2D1936B, $2AD286AF, $AA56D291,
$D7894360, $425C750D, $93B39E26, $187184C9,
$6C00B32D, $73E2BB14, $A0BEBC3C, $54623779,
$64459EAB, $3F328B82, $7718CF82, $59A2CEA6,
$04EE002E, $89FE78E6, $3FAB0950, $325FF6C2,
$81383F05, $6963C5C8, $76CB5AD6, $D49974C9,
$CA180DCF, $380782D5, $C7FA5CF6, $8AC31511,
$35E79E13, $47DA91D0, $F40F9086, $A7E2419E,
$31366241, $051EF495, $AA573B04, $4A805D8D,
$548300D0, $00322A3C, $BF64CDDF, $BA57A68E,
$75C6372B, $50AFD341, $A7C13275, $915A0BF5,
$6B54BFAB, $2B0B1426, $AB4CC9D7, $449CCD82,
$F7FBF265, $AB85C5F3, $1B55DB94, $AAD4E324,
$CFA4BD3F, $2DEAA3E2, $9E204D02, $C8BD25AC,
$EADF55B3, $D5BD9E98, $E31231B2, $2AD5AD6C,
$954329DE, $ADBE4528, $D8710F69, $AA51C90F,
$AA786BF6, $22513F1E, $AA51A79B, $2AD344CC,
$7B5A41F0, $D37CFBAD, $1B069505, $41ECE491,
$B4C332E6, $032268D4, $C9600ACC, $CE387E6D,
$BF6BB16C, $6A70FB78, $0D03D9C9, $D4DF39DE,
$E01063DA, $4736F464, $5AD328D8, $B347CC96,
$75BB0FC3, $98511BFB, $4FFBCC35, $B58BCF6A,
$E11F0ABC, $BFC5FE4A, $A70AEC10, $AC39570A,
$3F04442F, $6188B153, $E0397A2E, $5727CB79,
$9CEB418F, $1CACD68D, $2AD37C96, $0175CB9D,
$C69DFF09, $C75B65F0, $D9DB40D8, $EC0E7779,
$4744EAD4, $B11C3274, $DD24CB9E, $7E1C54BD,
$F01144F9, $D2240EB1, $9675B3FD, $A3AC3755,
$D47C27AF, $51C85F4D, $56907596, $A5BB15E6,
$580304F0, $CA042CF1, $011A37EA, $8DBFAADB,
$35BA3E4A, $3526FFA0, $C37B4D09, $BC306ED9,
$98A52666, $5648F725, $FF5E569D, $0CED63D0,
$7C63B2CF, $700B45E1, $D5EA50F1, $85A92872,
$AF1FBDA7, $D4234870, $A7870BF3, $2D3B4D79,
$42E04198, $0CD0EDE7, $26470DB8, $F881814C,
$474D6AD7, $7C0C5E5C, $D1231959, $381B7298,
$F5D2F4DB, $AB838653, $6E2F1E23, $83719C9E,
$BD91E046, $9A56456E, $DC39200C, $20C8C571,
$962BDA1C, $E1E696FF, $B141AB08, $7CCA89B9,
$1A69E783, $02CC4843, $A2F7C579, $429EF47D,
$427B169C, $5AC9F049, $DD8F0F00, $5C8165BF
);
cast_sbox2: array[0..255] of DWord = (
$1F201094, $EF0BA75B, $69E3CF7E, $393F4380,
$FE61CF7A, $EEC5207A, $55889C94, $72FC0651,
$ADA7EF79, $4E1D7235, $D55A63CE, $DE0436BA,
$99C430EF, $5F0C0794, $18DCDB7D, $A1D6EFF3,
$A0B52F7B, $59E83605, $EE15B094, $E9FFD909,
$DC440086, $EF944459, $BA83CCB3, $E0C3CDFB,
$D1DA4181, $3B092AB1, $F997F1C1, $A5E6CF7B,
$01420DDB, $E4E7EF5B, $25A1FF41, $E180F806,
$1FC41080, $179BEE7A, $D37AC6A9, $FE5830A4,
$98DE8B7F, $77E83F4E, $79929269, $24FA9F7B,
$E113C85B, $ACC40083, $D7503525, $F7EA615F,
$62143154, $0D554B63, $5D681121, $C866C359,
$3D63CF73, $CEE234C0, $D4D87E87, $5C672B21,
$071F6181, $39F7627F, $361E3084, $E4EB573B,
$602F64A4, $D63ACD9C, $1BBC4635, $9E81032D,
$2701F50C, $99847AB4, $A0E3DF79, $BA6CF38C,
$10843094, $2537A95E, $F46F6FFE, $A1FF3B1F,
$208CFB6A, $8F458C74, $D9E0A227, $4EC73A34,
$FC884F69, $3E4DE8DF, $EF0E0088, $3559648D,
$8A45388C, $1D804366, $721D9BFD, $A58684BB,
$E8256333, $844E8212, $128D8098, $FED33FB4,
$CE280AE1, $27E19BA5, $D5A6C252, $E49754BD,
$C5D655DD, $EB667064, $77840B4D, $A1B6A801,
$84DB26A9, $E0B56714, $21F043B7, $E5D05860,
$54F03084, $066FF472, $A31AA153, $DADC4755,
$B5625DBF, $68561BE6, $83CA6B94, $2D6ED23B,
$ECCF01DB, $A6D3D0BA, $B6803D5C, $AF77A709,
$33B4A34C, $397BC8D6, $5EE22B95, $5F0E5304,
$81ED6F61, $20E74364, $B45E1378, $DE18639B,
$881CA122, $B96726D1, $8049A7E8, $22B7DA7B,
$5E552D25, $5272D237, $79D2951C, $C60D894C,
$488CB402, $1BA4FE5B, $A4B09F6B, $1CA815CF,
$A20C3005, $8871DF63, $B9DE2FCB, $0CC6C9E9,
$0BEEFF53, $E3214517, $B4542835, $9F63293C,
$EE41E729, $6E1D2D7C, $50045286, $1E6685F3,
$F33401C6, $30A22C95, $31A70850, $60930F13,
$73F98417, $A1269859, $EC645C44, $52C877A9,
$CDFF33A6, $A02B1741, $7CBAD9A2, $2180036F,
$50D99C08, $CB3F4861, $C26BD765, $64A3F6AB,
$80342676, $25A75E7B, $E4E6D1FC, $20C710E6,
$CDF0B680, $17844D3B, $31EEF84D, $7E0824E4,
$2CCB49EB, $846A3BAE, $8FF77888, $EE5D60F6,
$7AF75673, $2FDD5CDB, $A11631C1, $30F66F43,
$B3FAEC54, $157FD7FA, $EF8579CC, $D152DE58,
$DB2FFD5E, $8F32CE19, $306AF97A, $02F03EF8,
$99319AD5, $C242FA0F, $A7E3EBB0, $C68E4906,
$B8DA230C, $80823028, $DCDEF3C8, $D35FB171,
$088A1BC8, $BEC0C560, $61A3C9E8, $BCA8F54D,
$C72FEFFA, $22822E99, $82C570B4, $D8D94E89,
$8B1C34BC, $301E16E6, $273BE979, $B0FFEAA6,
$61D9B8C6, $00B24869, $B7FFCE3F, $08DC283B,
$43DAF65A, $F7E19798, $7619B72F, $8F1C9BA4,
$DC8637A0, $16A7D3B1, $9FC393B7, $A7136EEB,
$C6BCC63E, $1A513742, $EF6828BC, $520365D6,
$2D6A77AB, $3527ED4B, $821FD216, $095C6E2E,
$DB92F2FB, $5EEA29CB, $145892F5, $91584F7F,
$5483697B, $2667A8CC, $85196048, $8C4BACEA,
$833860D4, $0D23E0F9, $6C387E8A, $0AE6D249,
$B284600C, $D835731D, $DCB1C647, $AC4C56EA,
$3EBD81B3, $230EABB0, $6438BC87, $F0B5B1FA,
$8F5EA2B3, $FC184642, $0A036B7A, $4FB089BD,
$649DA589, $A345415E, $5C038323, $3E5D3BB9,
$43D79572, $7E6DD07C, $06DFDF1E, $6C6CC4EF,
$7160A539, $73BFBE70, $83877605, $4523ECF1
);
cast_sbox3: array[0..255] of DWord = (
$8DEFC240, $25FA5D9F, $EB903DBF, $E810C907,
$47607FFF, $369FE44B, $8C1FC644, $AECECA90,
$BEB1F9BF, $EEFBCAEA, $E8CF1950, $51DF07AE,
$920E8806, $F0AD0548, $E13C8D83, $927010D5,
$11107D9F, $07647DB9, $B2E3E4D4, $3D4F285E,
$B9AFA820, $FADE82E0, $A067268B, $8272792E,
$553FB2C0, $489AE22B, $D4EF9794, $125E3FBC,
$21FFFCEE, $825B1BFD, $9255C5ED, $1257A240,
$4E1A8302, $BAE07FFF, $528246E7, $8E57140E,
$3373F7BF, $8C9F8188, $A6FC4EE8, $C982B5A5,
$A8C01DB7, $579FC264, $67094F31, $F2BD3F5F,
$40FFF7C1, $1FB78DFC, $8E6BD2C1, $437BE59B,
$99B03DBF, $B5DBC64B, $638DC0E6, $55819D99,
$A197C81C, $4A012D6E, $C5884A28, $CCC36F71,
$B843C213, $6C0743F1, $8309893C, $0FEDDD5F,
$2F7FE850, $D7C07F7E, $02507FBF, $5AFB9A04,
$A747D2D0, $1651192E, $AF70BF3E, $58C31380,
$5F98302E, $727CC3C4, $0A0FB402, $0F7FEF82,
$8C96FDAD, $5D2C2AAE, $8EE99A49, $50DA88B8,
$8427F4A0, $1EAC5790, $796FB449, $8252DC15,
$EFBD7D9B, $A672597D, $ADA840D8, $45F54504,
$FA5D7403, $E83EC305, $4F91751A, $925669C2,
$23EFE941, $A903F12E, $60270DF2, $0276E4B6,
$94FD6574, $927985B2, $8276DBCB, $02778176,
$F8AF918D, $4E48F79E, $8F616DDF, $E29D840E,
$842F7D83, $340CE5C8, $96BBB682, $93B4B148,
$EF303CAB, $984FAF28, $779FAF9B, $92DC560D,
$224D1E20, $8437AA88, $7D29DC96, $2756D3DC,
$8B907CEE, $B51FD240, $E7C07CE3, $E566B4A1,
$C3E9615E, $3CF8209D, $6094D1E3, $CD9CA341,
$5C76460E, $00EA983B, $D4D67881, $FD47572C,
$F76CEDD9, $BDA8229C, $127DADAA, $438A074E,
$1F97C090, $081BDB8A, $93A07EBE, $B938CA15,
$97B03CFF, $3DC2C0F8, $8D1AB2EC, $64380E51,
$68CC7BFB, $D90F2788, $12490181, $5DE5FFD4,
$DD7EF86A, $76A2E214, $B9A40368, $925D958F,
$4B39FFFA, $BA39AEE9, $A4FFD30B, $FAF7933B,
$6D498623, $193CBCFA, $27627545, $825CF47A,
$61BD8BA0, $D11E42D1, $CEAD04F4, $127EA392,
$10428DB7, $8272A972, $9270C4A8, $127DE50B,
$285BA1C8, $3C62F44F, $35C0EAA5, $E805D231,
$428929FB, $B4FCDF82, $4FB66A53, $0E7DC15B,
$1F081FAB, $108618AE, $FCFD086D, $F9FF2889,
$694BCC11, $236A5CAE, $12DECA4D, $2C3F8CC5,
$D2D02DFE, $F8EF5896, $E4CF52DA, $95155B67,
$494A488C, $B9B6A80C, $5C8F82BC, $89D36B45,
$3A609437, $EC00C9A9, $44715253, $0A874B49,
$D773BC40, $7C34671C, $02717EF6, $4FEB5536,
$A2D02FFF, $D2BF60C4, $D43F03C0, $50B4EF6D,
$07478CD1, $006E1888, $A2E53F55, $B9E6D4BC,
$A2048016, $97573833, $D7207D67, $DE0F8F3D,
$72F87B33, $ABCC4F33, $7688C55D, $7B00A6B0,
$947B0001, $570075D2, $F9BB88F8, $8942019E,
$4264A5FF, $856302E0, $72DBD92B, $EE971B69,
$6EA22FDE, $5F08AE2B, $AF7A616D, $E5C98767,
$CF1FEBD2, $61EFC8C2, $F1AC2571, $CC8239C2,
$67214CB8, $B1E583D1, $B7DC3E62, $7F10BDCE,
$F90A5C38, $0FF0443D, $606E6DC6, $60543A49,
$5727C148, $2BE98A1D, $8AB41738, $20E1BE24,
$AF96DA0F, $68458425, $99833BE5, $600D457D,
$282F9350, $8334B362, $D91D1120, $2B6D8DA0,
$642B1E31, $9C305A00, $52BCE688, $1B03588A,
$F7BAEFD5, $4142ED9C, $A4315C11, $83323EC5,
$DFEF4636, $A133C501, $E9D3531C, $EE353783
);
cast_sbox4: array[0..255] of DWord = (
$9DB30420, $1FB6E9DE, $A7BE7BEF, $D273A298,
$4A4F7BDB, $64AD8C57, $85510443, $FA020ED1,
$7E287AFF, $E60FB663, $095F35A1, $79EBF120,
$FD059D43, $6497B7B1, $F3641F63, $241E4ADF,
$28147F5F, $4FA2B8CD, $C9430040, $0CC32220,
$FDD30B30, $C0A5374F, $1D2D00D9, $24147B15,
$EE4D111A, $0FCA5167, $71FF904C, $2D195FFE,
$1A05645F, $0C13FEFE, $081B08CA, $05170121,
$80530100, $E83E5EFE, $AC9AF4F8, $7FE72701,
$D2B8EE5F, $06DF4261, $BB9E9B8A, $7293EA25,
$CE84FFDF, $F5718801, $3DD64B04, $A26F263B,
$7ED48400, $547EEBE6, $446D4CA0, $6CF3D6F5,
$2649ABDF, $AEA0C7F5, $36338CC1, $503F7E93,
$D3772061, $11B638E1, $72500E03, $F80EB2BB,
$ABE0502E, $EC8D77DE, $57971E81, $E14F6746,
$C9335400, $6920318F, $081DBB99, $FFC304A5,
$4D351805, $7F3D5CE3, $A6C866C6, $5D5BCCA9,
$DAEC6FEA, $9F926F91, $9F46222F, $3991467D,
$A5BF6D8E, $1143C44F, $43958302, $D0214EEB,
$022083B8, $3FB6180C, $18F8931E, $281658E6,
$26486E3E, $8BD78A70, $7477E4C1, $B506E07C,
$F32D0A25, $79098B02, $E4EABB81, $28123B23,
$69DEAD38, $1574CA16, $DF871B62, $211C40B7,
$A51A9EF9, $0014377B, $041E8AC8, $09114003,
$BD59E4D2, $E3D156D5, $4FE876D5, $2F91A340,
$557BE8DE, $00EAE4A7, $0CE5C2EC, $4DB4BBA6,
$E756BDFF, $DD3369AC, $EC17B035, $06572327,
$99AFC8B0, $56C8C391, $6B65811C, $5E146119,
$6E85CB75, $BE07C002, $C2325577, $893FF4EC,
$5BBFC92D, $D0EC3B25, $B7801AB7, $8D6D3B24,
$20C763EF, $C366A5FC, $9C382880, $0ACE3205,
$AAC9548A, $ECA1D7C7, $041AFA32, $1D16625A,
$6701902C, $9B757A54, $31D477F7, $9126B031,
$36CC6FDB, $C70B8B46, $D9E66A48, $56E55A79,
$026A4CEB, $52437EFF, $2F8F76B4, $0DF980A5,
$8674CDE3, $EDDA04EB, $17A9BE04, $2C18F4DF,
$B7747F9D, $AB2AF7B4, $EFC34D20, $2E096B7C,
$1741A254, $E5B6A035, $213D42F6, $2C1C7C26,
$61C2F50F, $6552DAF9, $D2C231F8, $25130F69,
$D8167FA2, $0418F2C8, $001A96A6, $0D1526AB,
$63315C21, $5E0A72EC, $49BAFEFD, $187908D9,
$8D0DBD86, $311170A7, $3E9B640C, $CC3E10D7,
$D5CAD3B6, $0CAEC388, $F73001E1, $6C728AFF,
$71EAE2A1, $1F9AF36E, $CFCBD12F, $C1DE8417,
$AC07BE6B, $CB44A1D8, $8B9B0F56, $013988C3,
$B1C52FCA, $B4BE31CD, $D8782806, $12A3A4E2,
$6F7DE532, $58FD7EB6, $D01EE900, $24ADFFC2,
$F4990FC5, $9711AAC5, $001D7B95, $82E5E7D2,
$109873F6, $00613096, $C32D9521, $ADA121FF,
$29908415, $7FBB977F, $AF9EB3DB, $29C9ED2A,
$5CE2A465, $A730F32C, $D0AA3FE8, $8A5CC091,
$D49E2CE7, $0CE454A9, $D60ACD86, $015F1919,
$77079103, $DEA03AF6, $78A8565E, $DEE356DF,
$21F05CBE, $8B75E387, $B3C50651, $B8A5C3EF,
$D8EEB6D2, $E523BE77, $C2154529, $2F69EFDF,
$AFE67AFB, $F470C4B2, $F3E0EB5B, $D6CC9876,
$39E4460C, $1FDA8538, $1987832F, $CA007367,
$A99144F8, $296B299E, $492FC295, $9266BEAB,
$B5676E69, $9BD3DDDA, $DF7E052F, $DB25701C,
$1B5E51EE, $F65324E6, $6AFCE36C, $0316CC04,
$8644213E, $B7DC59D0, $7965291F, $CCD6FD43,
$41823979, $932BCDF6, $B657C34D, $4EDFD282,
$7AE5290C, $3CB9536B, $851E20FE, $9833557E,
$13ECF0B0, $D3FFB372, $3F85C5C1, $0AEF7ED2
);
cast_sbox5: array[0..255] of DWord = (
$7EC90C04, $2C6E74B9, $9B0E66DF, $A6337911,
$B86A7FFF, $1DD358F5, $44DD9D44, $1731167F,
$08FBF1FA, $E7F511CC, $D2051B00, $735ABA00,
$2AB722D8, $386381CB, $ACF6243A, $69BEFD7A,
$E6A2E77F, $F0C720CD, $C4494816, $CCF5C180,
$38851640, $15B0A848, $E68B18CB, $4CAADEFF,
$5F480A01, $0412B2AA, $259814FC, $41D0EFE2,
$4E40B48D, $248EB6FB, $8DBA1CFE, $41A99B02,
$1A550A04, $BA8F65CB, $7251F4E7, $95A51725,
$C106ECD7, $97A5980A, $C539B9AA, $4D79FE6A,
$F2F3F763, $68AF8040, $ED0C9E56, $11B4958B,
$E1EB5A88, $8709E6B0, $D7E07156, $4E29FEA7,
$6366E52D, $02D1C000, $C4AC8E05, $9377F571,
$0C05372A, $578535F2, $2261BE02, $D642A0C9,
$DF13A280, $74B55BD2, $682199C0, $D421E5EC,
$53FB3CE8, $C8ADEDB3, $28A87FC9, $3D959981,
$5C1FF900, $FE38D399, $0C4EFF0B, $062407EA,
$AA2F4FB1, $4FB96976, $90C79505, $B0A8A774,
$EF55A1FF, $E59CA2C2, $A6B62D27, $E66A4263,
$DF65001F, $0EC50966, $DFDD55BC, $29DE0655,
$911E739A, $17AF8975, $32C7911C, $89F89468,
$0D01E980, $524755F4, $03B63CC9, $0CC844B2,
$BCF3F0AA, $87AC36E9, $E53A7426, $01B3D82B,
$1A9E7449, $64EE2D7E, $CDDBB1DA, $01C94910,
$B868BF80, $0D26F3FD, $9342EDE7, $04A5C284,
$636737B6, $50F5B616, $F24766E3, $8ECA36C1,
$136E05DB, $FEF18391, $FB887A37, $D6E7F7D4,
$C7FB7DC9, $3063FCDF, $B6F589DE, $EC2941DA,
$26E46695, $B7566419, $F654EFC5, $D08D58B7,
$48925401, $C1BACB7F, $E5FF550F, $B6083049,
$5BB5D0E8, $87D72E5A, $AB6A6EE1, $223A66CE,
$C62BF3CD, $9E0885F9, $68CB3E47, $086C010F,
$A21DE820, $D18B69DE, $F3F65777, $FA02C3F6,
$407EDAC3, $CBB3D550, $1793084D, $B0D70EBA,
$0AB378D5, $D951FB0C, $DED7DA56, $4124BBE4,
$94CA0B56, $0F5755D1, $E0E1E56E, $6184B5BE,
$580A249F, $94F74BC0, $E327888E, $9F7B5561,
$C3DC0280, $05687715, $646C6BD7, $44904DB3,
$66B4F0A3, $C0F1648A, $697ED5AF, $49E92FF6,
$309E374F, $2CB6356A, $85808573, $4991F840,
$76F0AE02, $083BE84D, $28421C9A, $44489406,
$736E4CB8, $C1092910, $8BC95FC6, $7D869CF4,
$134F616F, $2E77118D, $B31B2BE1, $AA90B472,
$3CA5D717, $7D161BBA, $9CAD9010, $AF462BA2,
$9FE459D2, $45D34559, $D9F2DA13, $DBC65487,
$F3E4F94E, $176D486F, $097C13EA, $631DA5C7,
$445F7382, $175683F4, $CDC66A97, $70BE0288,
$B3CDCF72, $6E5DD2F3, $20936079, $459B80A5,
$BE60E2DB, $A9C23101, $EBA5315C, $224E42F2,
$1C5C1572, $F6721B2C, $1AD2FFF3, $8C25404E,
$324ED72F, $4067B7FD, $0523138E, $5CA3BC78,
$DC0FD66E, $75922283, $784D6B17, $58EBB16E,
$44094F85, $3F481D87, $FCFEAE7B, $77B5FF76,
$8C2302BF, $AAF47556, $5F46B02A, $2B092801,
$3D38F5F7, $0CA81F36, $52AF4A8A, $66D5E7C0,
$DF3B0874, $95055110, $1B5AD7A8, $F61ED5AD,
$6CF6E479, $20758184, $D0CEFA65, $88F7BE58,
$4A046826, $0FF6F8F3, $A09C7F70, $5346ABA0,
$5CE96C28, $E176EDA3, $6BAC307F, $376829D2,
$85360FA9, $17E3FE2A, $24B79767, $F5A96B20,
$D6CD2595, $68FF1EBF, $7555442C, $F19F06BE,
$F9E0659A, $EEB9491D, $34010718, $BB30CAB8,
$E822FE15, $88570983, $750E6249, $DA627E55,
$5E76FFA8, $B1534546, $6D47DE08, $EFE9E7D4
);
cast_sbox6: array[0..255] of DWord = (
$F6FA8F9D, $2CAC6CE1, $4CA34867, $E2337F7C,
$95DB08E7, $016843B4, $ECED5CBC, $325553AC,
$BF9F0960, $DFA1E2ED, $83F0579D, $63ED86B9,
$1AB6A6B8, $DE5EBE39, $F38FF732, $8989B138,
$33F14961, $C01937BD, $F506C6DA, $E4625E7E,
$A308EA99, $4E23E33C, $79CBD7CC, $48A14367,
$A3149619, $FEC94BD5, $A114174A, $EAA01866,
$A084DB2D, $09A8486F, $A888614A, $2900AF98,
$01665991, $E1992863, $C8F30C60, $2E78EF3C,
$D0D51932, $CF0FEC14, $F7CA07D2, $D0A82072,
$FD41197E, $9305A6B0, $E86BE3DA, $74BED3CD,
$372DA53C, $4C7F4448, $DAB5D440, $6DBA0EC3,
$083919A7, $9FBAEED9, $49DBCFB0, $4E670C53,
$5C3D9C01, $64BDB941, $2C0E636A, $BA7DD9CD,
$EA6F7388, $E70BC762, $35F29ADB, $5C4CDD8D,
$F0D48D8C, $B88153E2, $08A19866, $1AE2EAC8,
$284CAF89, $AA928223, $9334BE53, $3B3A21BF,
$16434BE3, $9AEA3906, $EFE8C36E, $F890CDD9,
$80226DAE, $C340A4A3, $DF7E9C09, $A694A807,
$5B7C5ECC, $221DB3A6, $9A69A02F, $68818A54,
$CEB2296F, $53C0843A, $FE893655, $25BFE68A,
$B4628ABC, $CF222EBF, $25AC6F48, $A9A99387,
$53BDDB65, $E76FFBE7, $E967FD78, $0BA93563,
$8E342BC1, $E8A11BE9, $4980740D, $C8087DFC,
$8DE4BF99, $A11101A0, $7FD37975, $DA5A26C0,
$E81F994F, $9528CD89, $FD339FED, $B87834BF,
$5F04456D, $22258698, $C9C4C83B, $2DC156BE,
$4F628DAA, $57F55EC5, $E2220ABE, $D2916EBF,
$4EC75B95, $24F2C3C0, $42D15D99, $CD0D7FA0,
$7B6E27FF, $A8DC8AF0, $7345C106, $F41E232F,
$35162386, $E6EA8926, $3333B094, $157EC6F2,
$372B74AF, $692573E4, $E9A9D848, $F3160289,
$3A62EF1D, $A787E238, $F3A5F676, $74364853,
$20951063, $4576698D, $B6FAD407, $592AF950,
$36F73523, $4CFB6E87, $7DA4CEC0, $6C152DAA,
$CB0396A8, $C50DFE5D, $FCD707AB, $0921C42F,
$89DFF0BB, $5FE2BE78, $448F4F33, $754613C9,
$2B05D08D, $48B9D585, $DC049441, $C8098F9B,
$7DEDE786, $C39A3373, $42410005, $6A091751,
$0EF3C8A6, $890072D6, $28207682, $A9A9F7BE,
$BF32679D, $D45B5B75, $B353FD00, $CBB0E358,
$830F220A, $1F8FB214, $D372CF08, $CC3C4A13,
$8CF63166, $061C87BE, $88C98F88, $6062E397,
$47CF8E7A, $B6C85283, $3CC2ACFB, $3FC06976,
$4E8F0252, $64D8314D, $DA3870E3, $1E665459,
$C10908F0, $513021A5, $6C5B68B7, $822F8AA0,
$3007CD3E, $74719EEF, $DC872681, $073340D4,
$7E432FD9, $0C5EC241, $8809286C, $F592D891,
$08A930F6, $957EF305, $B7FBFFBD, $C266E96F,
$6FE4AC98, $B173ECC0, $BC60B42A, $953498DA,
$FBA1AE12, $2D4BD736, $0F25FAAB, $A4F3FCEB,
$E2969123, $257F0C3D, $9348AF49, $361400BC,
$E8816F4A, $3814F200, $A3F94043, $9C7A54C2,
$BC704F57, $DA41E7F9, $C25AD33A, $54F4A084,
$B17F5505, $59357CBE, $EDBD15C8, $7F97C5AB,
$BA5AC7B5, $B6F6DEAF, $3A479C3A, $5302DA25,
$653D7E6A, $54268D49, $51A477EA, $5017D55B,
$D7D25D88, $44136C76, $0404A8C8, $B8E5A121,
$B81A928A, $60ED5869, $97C55B96, $EAEC991B,
$29935913, $01FDB7F1, $088E8DFA, $9AB6F6F5,
$3B4CBF9F, $4A5DE3AB, $E6051D35, $A0E1D855,
$D36B4CF1, $F544EDEB, $B0E93524, $BEBB8FBD,
$A2D762CF, $49C92F54, $38B5F331, $7128A454,
$48392905, $A65B1DB8, $851C97BD, $D675CF2F
);
cast_sbox7: array[0..255] of DWord = (
$85E04019, $332BF567, $662DBFFF, $CFC65693,
$2A8D7F6F, $AB9BC912, $DE6008A1, $2028DA1F,
$0227BCE7, $4D642916, $18FAC300, $50F18B82,
$2CB2CB11, $B232E75C, $4B3695F2, $B28707DE,
$A05FBCF6, $CD4181E9, $E150210C, $E24EF1BD,
$B168C381, $FDE4E789, $5C79B0D8, $1E8BFD43,
$4D495001, $38BE4341, $913CEE1D, $92A79C3F,
$089766BE, $BAEEADF4, $1286BECF, $B6EACB19,
$2660C200, $7565BDE4, $64241F7A, $8248DCA9,
$C3B3AD66, $28136086, $0BD8DFA8, $356D1CF2,
$107789BE, $B3B2E9CE, $0502AA8F, $0BC0351E,
$166BF52A, $EB12FF82, $E3486911, $D34D7516,
$4E7B3AFF, $5F43671B, $9CF6E037, $4981AC83,
$334266CE, $8C9341B7, $D0D854C0, $CB3A6C88,
$47BC2829, $4725BA37, $A66AD22B, $7AD61F1E,
$0C5CBAFA, $4437F107, $B6E79962, $42D2D816,
$0A961288, $E1A5C06E, $13749E67, $72FC081A,
$B1D139F7, $F9583745, $CF19DF58, $BEC3F756,
$C06EBA30, $07211B24, $45C28829, $C95E317F,
$BC8EC511, $38BC46E9, $C6E6FA14, $BAE8584A,
$AD4EBC46, $468F508B, $7829435F, $F124183B,
$821DBA9F, $AFF60FF4, $EA2C4E6D, $16E39264,
$92544A8B, $009B4FC3, $ABA68CED, $9AC96F78,
$06A5B79A, $B2856E6E, $1AEC3CA9, $BE838688,
$0E0804E9, $55F1BE56, $E7E5363B, $B3A1F25D,
$F7DEBB85, $61FE033C, $16746233, $3C034C28,
$DA6D0C74, $79AAC56C, $3CE4E1AD, $51F0C802,
$98F8F35A, $1626A49F, $EED82B29, $1D382FE3,
$0C4FB99A, $BB325778, $3EC6D97B, $6E77A6A9,
$CB658B5C, $D45230C7, $2BD1408B, $60C03EB7,
$B9068D78, $A33754F4, $F430C87D, $C8A71302,
$B96D8C32, $EBD4E7BE, $BE8B9D2D, $7979FB06,
$E7225308, $8B75CF77, $11EF8DA4, $E083C858,
$8D6B786F, $5A6317A6, $FA5CF7A0, $5DDA0033,
$F28EBFB0, $F5B9C310, $A0EAC280, $08B9767A,
$A3D9D2B0, $79D34217, $021A718D, $9AC6336A,
$2711FD60, $438050E3, $069908A8, $3D7FEDC4,
$826D2BEF, $4EEB8476, $488DCF25, $36C9D566,
$28E74E41, $C2610ACA, $3D49A9CF, $BAE3B9DF,
$B65F8DE6, $92AEAF64, $3AC7D5E6, $9EA80509,
$F22B017D, $A4173F70, $DD1E16C3, $15E0D7F9,
$50B1B887, $2B9F4FD5, $625ABA82, $6A017962,
$2EC01B9C, $15488AA9, $D716E740, $40055A2C,
$93D29A22, $E32DBF9A, $058745B9, $3453DC1E,
$D699296E, $496CFF6F, $1C9F4986, $DFE2ED07,
$B87242D1, $19DE7EAE, $053E561A, $15AD6F8C,
$66626C1C, $7154C24C, $EA082B2A, $93EB2939,
$17DCB0F0, $58D4F2AE, $9EA294FB, $52CF564C,
$9883FE66, $2EC40581, $763953C3, $01D6692E,
$D3A0C108, $A1E7160E, $E4F2DFA6, $693ED285,
$74904698, $4C2B0EDD, $4F757656, $5D393378,
$A132234F, $3D321C5D, $C3F5E194, $4B269301,
$C79F022F, $3C997E7E, $5E4F9504, $3FFAFBBD,
$76F7AD0E, $296693F4, $3D1FCE6F, $C61E45BE,
$D3B5AB34, $F72BF9B7, $1B0434C0, $4E72B567,
$5592A33D, $B5229301, $CFD2A87F, $60AEB767,
$1814386B, $30BCC33D, $38A0C07D, $FD1606F2,
$C363519B, $589DD390, $5479F8E6, $1CB8D647,
$97FD61A9, $EA7759F4, $2D57539D, $569A58CF,
$E84E63AD, $462E1B78, $6580F87E, $F3817914,
$91DA55F4, $40A230F3, $D1988F35, $B6E318D2,
$3FFA50BC, $3D40F021, $C3C0BDAE, $4958C24C,
$518F36B2, $84B1D370, $0FEDCE83, $878DDADA,
$F2A279C7, $94E01BE8, $90716F4B, $954B8AA3
);
cast_sbox8: array[0..255] of DWord = (
$E216300D, $BBDDFFFC, $A7EBDABD, $35648095,
$7789F8B7, $E6C1121B, $0E241600, $052CE8B5,
$11A9CFB0, $E5952F11, $ECE7990A, $9386D174,
$2A42931C, $76E38111, $B12DEF3A, $37DDDDFC,
$DE9ADEB1, $0A0CC32C, $BE197029, $84A00940,
$BB243A0F, $B4D137CF, $B44E79F0, $049EEDFD,
$0B15A15D, $480D3168, $8BBBDE5A, $669DED42,
$C7ECE831, $3F8F95E7, $72DF191B, $7580330D,
$94074251, $5C7DCDFA, $ABBE6D63, $AA402164,
$B301D40A, $02E7D1CA, $53571DAE, $7A3182A2,
$12A8DDEC, $FDAA335D, $176F43E8, $71FB46D4,
$38129022, $CE949AD4, $B84769AD, $965BD862,
$82F3D055, $66FB9767, $15B80B4E, $1D5B47A0,
$4CFDE06F, $C28EC4B8, $57E8726E, $647A78FC,
$99865D44, $608BD593, $6C200E03, $39DC5FF6,
$5D0B00A3, $AE63AFF2, $7E8BD632, $70108C0C,
$BBD35049, $2998DF04, $980CF42A, $9B6DF491,
$9E7EDD53, $06918548, $58CB7E07, $3B74EF2E,
$522FFFB1, $D24708CC, $1C7E27CD, $A4EB215B,
$3CF1D2E2, $19B47A38, $424F7618, $35856039,
$9D17DEE7, $27EB35E6, $C9AFF67B, $36BAF5B8,
$09C467CD, $C18910B1, $E11DBF7B, $06CD1AF8,
$7170C608, $2D5E3354, $D4DE495A, $64C6D006,
$BCC0C62C, $3DD00DB3, $708F8F34, $77D51B42,
$264F620F, $24B8D2BF, $15C1B79E, $46A52564,
$F8D7E54E, $3E378160, $7895CDA5, $859C15A5,
$E6459788, $C37BC75F, $DB07BA0C, $0676A3AB,
$7F229B1E, $31842E7B, $24259FD7, $F8BEF472,
$835FFCB8, $6DF4C1F2, $96F5B195, $FD0AF0FC,
$B0FE134C, $E2506D3D, $4F9B12EA, $F215F225,
$A223736F, $9FB4C428, $25D04979, $34C713F8,
$C4618187, $EA7A6E98, $7CD16EFC, $1436876C,
$F1544107, $BEDEEE14, $56E9AF27, $A04AA441,
$3CF7C899, $92ECBAE6, $DD67016D, $151682EB,
$A842EEDF, $FDBA60B4, $F1907B75, $20E3030F,
$24D8C29E, $E139673B, $EFA63FB8, $71873054,
$B6F2CF3B, $9F326442, $CB15A4CC, $B01A4504,
$F1E47D8D, $844A1BE5, $BAE7DFDC, $42CBDA70,
$CD7DAE0A, $57E85B7A, $D53F5AF6, $20CF4D8C,
$CEA4D428, $79D130A4, $3486EBFB, $33D3CDDC,
$77853B53, $37EFFCB5, $C5068778, $E580B3E6,
$4E68B8F4, $C5C8B37E, $0D809EA2, $398FEB7C,
$132A4F94, $43B7950E, $2FEE7D1C, $223613BD,
$DD06CAA2, $37DF932B, $C4248289, $ACF3EBC3,
$5715F6B7, $EF3478DD, $F267616F, $C148CBE4,
$9052815E, $5E410FAB, $B48A2465, $2EDA7FA4,
$E87B40E4, $E98EA084, $5889E9E1, $EFD390FC,
$DD07D35B, $DB485694, $38D7E5B2, $57720101,
$730EDEBC, $5B643113, $94917E4F, $503C2FBA,
$646F1282, $7523D24A, $E0779695, $F9C17A8F,
$7A5B2121, $D187B896, $29263A4D, $BA510CDF,
$81F47C9F, $AD1163ED, $EA7B5965, $1A00726E,
$11403092, $00DA6D77, $4A0CDD61, $AD1F4603,
$605BDFB0, $9EEDC364, $22EBE6A8, $CEE7D28A,
$A0E736A0, $5564A6B9, $10853209, $C7EB8F37,
$2DE705CA, $8951570F, $DF09822B, $BD691A6C,
$AA12E4F2, $87451C0F, $E0F6A27A, $3ADA4819,
$4CF1764F, $0D771C2B, $67CDB156, $350D8384,
$5938FA0F, $42399EF3, $36997B07, $0E84093D,
$4AA93E61, $8360D87B, $1FA98B0C, $1149382C,
$E97625A5, $0614D1B7, $0E25244B, $0C768347,
$589E8D82, $0D2059D1, $A466BB1E, $F8DA0A82,
$04F19130, $BA6E4EC0, $99265164, $1EE7230D,
$50B2AD80, $EAEE6801, $8DB2A283, $EA8BF59E
);
type
PCast128 = ^TCast128;
TCast128 = object(TBlockCipher64)
protected
KeyData: array[0..31] of DWord;
Rounds: longword;
public
// code
procedure Burn;virtual;
procedure InitKey(const Key; Size: longword);virtual;
procedure EncryptECB(const InData; var OutData);virtual;
procedure DecryptECB(const InData; var OutData);virtual;
destructor Destroy; virtual;
end;
//Cast256 cipher implementation
const
S1: array[0..255] of DWord= (
$30fb40d4, $9fa0ff0b, $6beccd2f, $3f258c7a, $1e213f2f, $9C004dd3,
$6003e540, $cf9fc949, $bfd4af27, $88bbbdb5, $e2034090, $98d09675,
$6e63a0e0, $15c361d2, $c2e7661d, $22d4ff8e, $28683b6f, $c07fd059,
$ff2379c8, $775f50e2, $43c340d3, $df2f8656, $887ca41a, $a2d2bd2d,
$a1c9e0d6, $346c4819, $61b76d87, $22540f2f, $2abe32e1, $aa54166b,
$22568e3a, $a2d341d0, $66db40c8, $a784392f, $004dff2f, $2db9d2de,
$97943fac, $4a97c1d8, $527644b7, $b5f437a7, $b82cbaef, $d751d159,
$6ff7f0ed, $5a097a1f, $827b68d0, $90ecf52e, $22b0c054, $bc8e5935,
$4b6d2f7f, $50bb64a2, $d2664910, $bee5812d, $b7332290, $e93b159f,
$b48ee411, $4bff345d, $fd45c240, $ad31973f, $c4f6d02e, $55fc8165,
$d5b1caad, $a1ac2dae, $a2d4b76d, $c19b0C50, $882240f2, $0c6e4f38,
$a4e4bfd7, $4f5ba272, $564c1d2f, $c59c5319, $b949e354, $b04669fe,
$b1b6ab8a, $c71358dd, $6385c545, $110f935d, $57538ad5, $6a390493,
$e63d37e0, $2a54f6b3, $3a787d5f, $6276a0b5, $19a6fcdf, $7a42206a,
$29f9d4d5, $f61b1891, $bb72275e, $aa508167, $38901091, $c6b505eb,
$84c7cb8c, $2ad75a0f, $874a1427, $a2d1936b, $2ad286af, $aa56d291,
$d7894360, $425c750d, $93b39e26, $187184c9, $6c00b32d, $73e2bb14,
$a0bebc3c, $54623779, $64459eab, $3f328b82, $7718cf82, $59a2cea6,
$04ee002e, $89fe78e6, $3fab0950, $325ff6C2, $81383f05, $6963c5c8,
$76cb5ad6, $d49974c9, $ca180dcf, $380782d5, $c7fa5cf6, $8ac31511,
$35e79e13, $47da91d0, $f40f9086, $a7e2419e, $31366241, $051ef495,
$aa573b04, $4a805d8d, $548300d0, $00322a3c, $bf64cddf, $ba57a68e,
$75c6372b, $50afd341, $a7c13275, $915a0bf5, $6b54bfab, $2b0b1426,
$ab4cc9d7, $449ccd82, $f7fbf265, $ab85c5f3, $1b55db94, $aad4e324,
$cfa4bd3f, $2deaa3e2, $9e204d02, $c8bd25ac, $eadf55b3, $d5bd9e98,
$e31231b2, $2ad5ad6c, $954329de, $adbe4528, $d8710f69, $aa51c90f,
$aa786bf6, $22513f1e, $aa51a79b, $2ad344cc, $7b5a41f0, $d37cfbad,
$1b069505, $41ece491, $b4c332e6, $032268d4, $c9600acc, $ce387e6d,
$bf6bb16c, $6a70fb78, $0d03d9c9, $d4df39de, $e01063da, $4736f464,
$5ad328d8, $b347cc96, $75bb0fc3, $98511bfb, $4ffbcc35, $b58bcf6a,
$e11f0abc, $bfc5fe4a, $a70aec10, $ac39570a, $3f04442f, $6188b153,
$e0397a2e, $5727cb79, $9ceb418f, $1cacd68d, $2ad37c96, $0175cb9d,
$c69dff09, $c75b65f0, $d9db40d8, $ec0e7779, $4744ead4, $b11c3274,
$dd24cb9e, $7e1c54bd, $f01144f9, $d2240eb1, $9675b3fd, $a3ac3755,
$d47c27af, $51c85f4d, $56907596, $a5bb15e6, $580304f0, $ca042cf1,
$011a37ea, $8dbfaadb, $35ba3e4a, $3526ffa0, $c37b4d09, $bc306ed9,
$98a52666, $5648f725, $ff5e569d, $0ced63d0, $7c63b2cf, $700b45e1,
$d5ea50f1, $85a92872, $af1fbda7, $d4234870, $a7870bf3, $2d3b4d79,
$42e04198, $0cd0ede7, $26470db8, $f881814C, $474d6ad7, $7c0c5e5c,
$d1231959, $381b7298, $f5d2f4db, $ab838653, $6e2f1e23, $83719c9e,
$bd91e046, $9a56456e, $dc39200c, $20c8c571, $962bda1c, $e1e696ff,
$b141ab08, $7cca89b9, $1a69e783, $02cc4843, $a2f7c579, $429ef47d,
$427b169c, $5ac9f049, $dd8f0f00, $5c8165bf);
S2: array[0..255] of DWord= (
$1f201094, $ef0ba75b, $69e3cf7e, $393f4380, $fe61cf7a, $eec5207a,
$55889c94, $72fc0651, $ada7ef79, $4e1d7235, $d55a63ce, $de0436ba,
$99c430ef, $5f0c0794, $18dcdb7d, $a1d6eff3, $a0b52f7b, $59e83605,
$ee15b094, $e9ffd909, $dc440086, $ef944459, $ba83ccb3, $e0c3cdfb,
$d1da4181, $3b092ab1, $f997f1c1, $a5e6cf7b, $01420ddb, $e4e7ef5b,
$25a1ff41, $e180f806, $1fc41080, $179bee7a, $d37ac6a9, $fe5830a4,
$98de8b7f, $77e83f4e, $79929269, $24fa9f7b, $e113c85b, $acc40083,
$d7503525, $f7ea615f, $62143154, $0d554b63, $5d681121, $c866c359,
$3d63cf73, $cee234c0, $d4d87e87, $5c672b21, $071f6181, $39f7627f,
$361e3084, $e4eb573b, $602f64a4, $d63acd9c, $1bbc4635, $9e81032d,
$2701f50c, $99847ab4, $a0e3df79, $ba6cf38c, $10843094, $2537a95e,
$f46f6ffe, $a1ff3b1f, $208cfb6a, $8f458c74, $d9e0a227, $4ec73a34,
$fc884f69, $3e4de8df, $ef0e0088, $3559648d, $8a45388c, $1d804366,
$721d9bfd, $a58684bb, $e8256333, $844e8212, $128d8098, $fed33fb4,
$ce280ae1, $27e19ba5, $d5a6c252, $e49754bd, $c5d655dd, $eb667064,
$77840b4d, $a1b6a801, $84db26a9, $e0b56714, $21f043b7, $e5d05860,
$54f03084, $066ff472, $a31aa153, $dadc4755, $b5625dbf, $68561be6,
$83ca6b94, $2d6ed23b, $eccf01db, $a6d3d0ba, $b6803d5c, $af77a709,
$33b4a34c, $397bc8d6, $5ee22b95, $5f0e5304, $81ed6f61, $20e74364,
$b45e1378, $de18639b, $881ca122, $b96726d1, $8049a7e8, $22b7da7b,
$5e552d25, $5272d237, $79d2951c, $c60d894c, $488cb402, $1ba4fe5b,
$a4b09f6b, $1ca815cf, $a20c3005, $8871df63, $b9de2fcb, $0cc6c9e9,
$0beeff53, $e3214517, $b4542835, $9f63293c, $ee41e729, $6e1d2d7c,
$50045286, $1e6685f3, $f33401c6, $30a22c95, $31a70850, $60930f13,
$73f98417, $a1269859, $ec645c44, $52c877a9, $cdff33a6, $a02b1741,
$7cbad9a2, $2180036f, $50d99c08, $cb3f4861, $c26bd765, $64a3f6ab,
$80342676, $25a75e7b, $e4e6d1fc, $20c710e6, $cdf0b680, $17844d3b,
$31eef84d, $7e0824e4, $2ccb49eb, $846a3bae, $8ff77888, $ee5d60f6,
$7af75673, $2fdd5cdb, $a11631c1, $30f66f43, $b3faec54, $157fd7fa,
$ef8579cc, $d152de58, $db2ffd5e, $8f32ce19, $306af97a, $02f03ef8,
$99319ad5, $c242fa0f, $a7e3ebb0, $c68e4906, $b8da230c, $80823028,
$dcdef3c8, $d35fb171, $088a1bc8, $bec0c560, $61a3c9e8, $bca8f54d,
$c72feffa, $22822e99, $82c570b4, $d8d94e89, $8b1c34bc, $301e16e6,
$273be979, $b0ffeaa6, $61d9b8c6, $00b24869, $b7ffce3f, $08dc283b,
$43daf65a, $f7e19798, $7619b72f, $8f1c9ba4, $dc8637a0, $16a7d3b1,
$9fc393b7, $a7136eeb, $c6bcc63e, $1a513742, $ef6828bc, $520365d6,
$2d6a77ab, $3527ed4b, $821fd216, $095c6e2e, $db92f2fb, $5eea29cb,
$145892f5, $91584f7f, $5483697b, $2667a8cc, $85196048, $8c4bacea,
$833860d4, $0d23e0f9, $6c387e8a, $0ae6d249, $b284600c, $d835731d,
$dcb1c647, $ac4c56ea, $3ebd81b3, $230eabb0, $6438bc87, $f0b5b1fa,
$8f5ea2b3, $fc184642, $0a036b7a, $4fb089bd, $649da589, $a345415e,
$5c038323, $3e5d3bb9, $43d79572, $7e6dd07c, $06dfdf1e, $6c6cc4ef,
$7160a539, $73bfbe70, $83877605, $4523ecf1);
S3: array[0..255] of DWord= (
$8defc240, $25fa5d9f, $eb903dbf, $e810c907, $47607fff, $369fe44b,
$8c1fc644, $aececa90, $beb1f9bf, $eefbcaea, $e8cf1950, $51df07ae,
$920e8806, $f0ad0548, $e13c8d83, $927010d5, $11107d9f, $07647db9,
$b2e3e4d4, $3d4f285e, $b9afa820, $fade82e0, $a067268b, $8272792e,
$553fb2c0, $489ae22b, $d4ef9794, $125e3fbc, $21fffcee, $825b1bfd,
$9255c5ed, $1257a240, $4e1a8302, $bae07fff, $528246e7, $8e57140e,
$3373f7bf, $8c9f8188, $a6fc4ee8, $c982b5a5, $a8c01db7, $579fc264,
$67094f31, $f2bd3f5f, $40fff7c1, $1fb78dfc, $8e6bd2c1, $437be59b,
$99b03dbf, $b5dbc64b, $638dc0e6, $55819d99, $a197c81c, $4a012d6e,
$c5884a28, $ccc36f71, $b843c213, $6c0743f1, $8309893c, $0feddd5f,
$2f7fe850, $d7c07f7e, $02507fbf, $5afb9a04, $a747d2d0, $1651192e,
$af70bf3e, $58c31380, $5f98302e, $727cc3c4, $0a0fb402, $0f7fef82,
$8c96fdad, $5d2c2aae, $8ee99a49, $50da88b8, $8427f4a0, $1eac5790,
$796fb449, $8252dc15, $efbd7d9b, $a672597d, $ada840d8, $45f54504,
$fa5d7403, $e83ec305, $4f91751a, $925669c2, $23efe941, $a903f12e,
$60270df2, $0276e4b6, $94fd6574, $927985b2, $8276dbcb, $02778176,
$f8af918d, $4e48f79e, $8f616ddf, $e29d840e, $842f7d83, $340ce5c8,
$96bbb682, $93b4b148, $ef303cab, $984faf28, $779faf9b, $92dc560d,
$224d1e20, $8437aa88, $7d29dc96, $2756d3dc, $8b907cee, $b51fd240,
$e7c07ce3, $e566b4a1, $c3e9615e, $3cf8209d, $6094d1e3, $cd9ca341,
$5c76460e, $00ea983b, $d4d67881, $fd47572c, $f76cedd9, $bda8229c,
$127dadaa, $438a074e, $1f97c090, $081bdb8a, $93a07ebe, $b938ca15,
$97b03cff, $3dc2c0f8, $8d1ab2ec, $64380e51, $68cc7bfb, $d90f2788,
$12490181, $5de5ffd4, $dd7ef86a, $76a2e214, $b9a40368, $925d958f,
$4b39fffa, $ba39aee9, $a4ffd30b, $faf7933b, $6d498623, $193cbcfa,
$27627545, $825cf47a, $61bd8ba0, $d11e42d1, $cead04f4, $127ea392,
$10428db7, $8272a972, $9270c4a8, $127de50b, $285ba1c8, $3c62f44f,
$35c0eaa5, $e805d231, $428929fb, $b4fcdf82, $4fb66a53, $0e7dc15b,
$1f081fab, $108618ae, $fcfd086d, $f9ff2889, $694bcc11, $236a5cae,
$12deca4d, $2c3f8cc5, $d2d02dfe, $f8ef5896, $e4cf52da, $95155b67,
$494a488c, $b9b6a80c, $5c8f82bc, $89d36b45, $3a609437, $ec00c9a9,
$44715253, $0a874b49, $d773bc40, $7c34671c, $02717ef6, $4feb5536,
$a2d02fff, $d2bf60c4, $d43f03c0, $50b4ef6d, $07478cd1, $006e1888,
$a2e53f55, $b9e6d4bc, $a2048016, $97573833, $d7207d67, $de0f8f3d,
$72f87b33, $abcc4f33, $7688c55d, $7b00a6b0, $947b0001, $570075d2,
$f9bb88f8, $8942019e, $4264a5ff, $856302e0, $72dbd92b, $ee971b69,
$6ea22fde, $5f08ae2b, $af7a616d, $e5c98767, $cf1febd2, $61efc8c2,
$f1ac2571, $cc8239c2, $67214cb8, $b1e583d1, $b7dc3e62, $7f10bdce,
$f90a5c38, $0ff0443d, $606e6dc6, $60543a49, $5727c148, $2be98a1d,
$8ab41738, $20e1be24, $af96da0f, $68458425, $99833be5, $600d457d,
$282f9350, $8334b362, $d91d1120, $2b6d8da0, $642b1e31, $9c305a00,
$52bce688, $1b03588a, $f7baefd5, $4142ed9c, $a4315c11, $83323ec5,
$dfef4636, $a133c501, $e9d3531c, $ee353783);
S4: array[0..255] of DWord= (
$9db30420, $1fb6e9de, $a7be7bef, $d273a298, $4a4f7bdb, $64ad8c57,
$85510443, $fa020ed1, $7e287aff, $e60fb663, $095f35a1, $79ebf120,
$fd059d43, $6497b7b1, $f3641f63, $241e4adf, $28147f5f, $4fa2b8cd,
$c9430040, $0cc32220, $fdd30b30, $c0a5374f, $1d2d00d9, $24147b15,
$ee4d111a, $0fca5167, $71ff904c, $2d195ffe, $1a05645f, $0c13fefe,
$081b08ca, $05170121, $80530100, $e83e5efe, $ac9af4f8, $7fe72701,
$d2b8ee5f, $06df4261, $bb9e9b8a, $7293ea25, $ce84ffdf, $f5718801,
$3dd64b04, $a26f263b, $7ed48400, $547eebe6, $446d4ca0, $6cf3d6f5,
$2649abdf, $aea0c7f5, $36338cc1, $503f7e93, $d3772061, $11b638e1,
$72500e03, $f80eb2bb, $abe0502e, $ec8d77de, $57971e81, $e14f6746,
$c9335400, $6920318f, $081dbb99, $ffc304a5, $4d351805, $7f3d5ce3,
$a6c866c6, $5d5bcca9, $daec6fea, $9f926f91, $9f46222f, $3991467d,
$a5bf6d8e, $1143c44f, $43958302, $d0214eeb, $022083b8, $3fb6180c,
$18f8931e, $281658e6, $26486e3e, $8bd78a70, $7477e4c1, $b506e07c,
$f32d0a25, $79098b02, $e4eabb81, $28123b23, $69dead38, $1574ca16,
$df871b62, $211c40b7, $a51a9ef9, $0014377b, $041e8ac8, $09114003,
$bd59e4d2, $e3d156d5, $4fe876d5, $2f91a340, $557be8de, $00eae4a7,
$0ce5c2ec, $4db4bba6, $e756bdff, $dd3369ac, $ec17b035, $06572327,
$99afc8b0, $56c8c391, $6b65811c, $5e146119, $6e85cb75, $be07c002,
$c2325577, $893ff4ec, $5bbfc92d, $d0ec3b25, $b7801ab7, $8d6d3b24,
$20c763ef, $c366a5fc, $9c382880, $0ace3205, $aac9548a, $eca1d7c7,
$041afa32, $1d16625a, $6701902c, $9b757a54, $31d477f7, $9126b031,
$36cc6fdb, $c70b8b46, $d9e66a48, $56e55a79, $026a4ceb, $52437eff,
$2f8f76b4, $0df980a5, $8674cde3, $edda04eb, $17a9be04, $2c18f4df,
$b7747f9d, $ab2af7b4, $efc34d20, $2e096b7c, $1741a254, $e5b6a035,
$213d42f6, $2c1c7c26, $61c2f50f, $6552daf9, $d2c231f8, $25130f69,
$d8167fa2, $0418f2c8, $001a96a6, $0d1526ab, $63315c21, $5e0a72ec,
$49bafefd, $187908d9, $8d0dbd86, $311170a7, $3e9b640c, $cc3e10d7,
$d5cad3b6, $0caec388, $f73001e1, $6c728aff, $71eae2a1, $1f9af36e,
$cfcbd12f, $c1de8417, $ac07be6b, $cb44a1d8, $8b9b0f56, $013988c3,
$b1c52fca, $b4be31cd, $d8782806, $12a3a4e2, $6f7de532, $58fd7eb6,
$d01ee900, $24adffc2, $f4990fc5, $9711aac5, $001d7b95, $82e5e7d2,
$109873f6, $00613096, $c32d9521, $ada121ff, $29908415, $7fbb977f,
$af9eb3db, $29c9ed2a, $5ce2a465, $a730f32c, $d0aa3fe8, $8a5cc091,
$d49e2ce7, $0ce454a9, $d60acd86, $015f1919, $77079103, $dea03af6,
$78a8565e, $dee356df, $21f05cbe, $8b75e387, $b3c50651, $b8a5c3ef,
$d8eeb6d2, $e523be77, $c2154529, $2f69efdf, $afe67afb, $f470c4b2,
$f3e0eb5b, $d6cc9876, $39e4460c, $1fda8538, $1987832f, $ca007367,
$a99144f8, $296b299e, $492fc295, $9266beab, $b5676e69, $9bd3ddda,
$df7e052f, $db25701c, $1b5e51ee, $f65324e6, $6afce36c, $0316cc04,
$8644213e, $b7dc59d0, $7965291f, $ccd6fd43, $41823979, $932bcdf6,
$b657c34d, $4edfd282, $7ae5290c, $3cb9536b, $851e20fe, $9833557e,
$13ecf0b0, $d3ffb372, $3f85c5c1, $0aef7ed2);
type
PCast256 = ^TCast256;
TCast256= object(TBlockCipher128)
protected
Kr, Km: array[0..11,0..3] of DWord;
public
procedure InitKey(const Key; Size: longword); virtual;
procedure Burn; virtual;
procedure EncryptECB(const InData; var OutData); virtual;
procedure DecryptECB(const InData; var OutData); virtual;
destructor Destroy; virtual;
end;
//GOST cipher implementation
const
sTable: array[0..3, 0..255] of DWord= (
($00072000,$00075000,$00074800,$00071000,$00076800,$00074000,$00070000,$00077000,
$00073000,$00075800,$00070800,$00076000,$00073800,$00077800,$00072800,$00071800,
$0005A000,$0005D000,$0005C800,$00059000,$0005E800,$0005C000,$00058000,$0005F000,
$0005B000,$0005D800,$00058800,$0005E000,$0005B800,$0005F800,$0005A800,$00059800,
$00022000,$00025000,$00024800,$00021000,$00026800,$00024000,$00020000,$00027000,
$00023000,$00025800,$00020800,$00026000,$00023800,$00027800,$00022800,$00021800,
$00062000,$00065000,$00064800,$00061000,$00066800,$00064000,$00060000,$00067000,
$00063000,$00065800,$00060800,$00066000,$00063800,$00067800,$00062800,$00061800,
$00032000,$00035000,$00034800,$00031000,$00036800,$00034000,$00030000,$00037000,
$00033000,$00035800,$00030800,$00036000,$00033800,$00037800,$00032800,$00031800,
$0006A000,$0006D000,$0006C800,$00069000,$0006E800,$0006C000,$00068000,$0006F000,
$0006B000,$0006D800,$00068800,$0006E000,$0006B800,$0006F800,$0006A800,$00069800,
$0007A000,$0007D000,$0007C800,$00079000,$0007E800,$0007C000,$00078000,$0007F000,
$0007B000,$0007D800,$00078800,$0007E000,$0007B800,$0007F800,$0007A800,$00079800,
$00052000,$00055000,$00054800,$00051000,$00056800,$00054000,$00050000,$00057000,
$00053000,$00055800,$00050800,$00056000,$00053800,$00057800,$00052800,$00051800,
$00012000,$00015000,$00014800,$00011000,$00016800,$00014000,$00010000,$00017000,
$00013000,$00015800,$00010800,$00016000,$00013800,$00017800,$00012800,$00011800,
$0001A000,$0001D000,$0001C800,$00019000,$0001E800,$0001C000,$00018000,$0001F000,
$0001B000,$0001D800,$00018800,$0001E000,$0001B800,$0001F800,$0001A800,$00019800,
$00042000,$00045000,$00044800,$00041000,$00046800,$00044000,$00040000,$00047000,
$00043000,$00045800,$00040800,$00046000,$00043800,$00047800,$00042800,$00041800,
$0000A000,$0000D000,$0000C800,$00009000,$0000E800,$0000C000,$00008000,$0000F000,
$0000B000,$0000D800,$00008800,$0000E000,$0000B800,$0000F800,$0000A800,$00009800,
$00002000,$00005000,$00004800,$00001000,$00006800,$00004000,$00000000,$00007000,
$00003000,$00005800,$00000800,$00006000,$00003800,$00007800,$00002800,$00001800,
$0003A000,$0003D000,$0003C800,$00039000,$0003E800,$0003C000,$00038000,$0003F000,
$0003B000,$0003D800,$00038800,$0003E000,$0003B800,$0003F800,$0003A800,$00039800,
$0002A000,$0002D000,$0002C800,$00029000,$0002E800,$0002C000,$00028000,$0002F000,
$0002B000,$0002D800,$00028800,$0002E000,$0002B800,$0002F800,$0002A800,$00029800,
$0004A000,$0004D000,$0004C800,$00049000,$0004E800,$0004C000,$00048000,$0004F000,
$0004B000,$0004D800,$00048800,$0004E000,$0004B800,$0004F800,$0004A800,$00049800),
($03A80000,$03C00000,$03880000,$03E80000,$03D00000,$03980000,$03A00000,$03900000,
$03F00000,$03F80000,$03E00000,$03B80000,$03B00000,$03800000,$03C80000,$03D80000,
$06A80000,$06C00000,$06880000,$06E80000,$06D00000,$06980000,$06A00000,$06900000,
$06F00000,$06F80000,$06E00000,$06B80000,$06B00000,$06800000,$06C80000,$06D80000,
$05280000,$05400000,$05080000,$05680000,$05500000,$05180000,$05200000,$05100000,
$05700000,$05780000,$05600000,$05380000,$05300000,$05000000,$05480000,$05580000,
$00A80000,$00C00000,$00880000,$00E80000,$00D00000,$00980000,$00A00000,$00900000,
$00F00000,$00F80000,$00E00000,$00B80000,$00B00000,$00800000,$00C80000,$00D80000,
$00280000,$00400000,$00080000,$00680000,$00500000,$00180000,$00200000,$00100000,
$00700000,$00780000,$00600000,$00380000,$00300000,$00000000,$00480000,$00580000,
$04280000,$04400000,$04080000,$04680000,$04500000,$04180000,$04200000,$04100000,
$04700000,$04780000,$04600000,$04380000,$04300000,$04000000,$04480000,$04580000,
$04A80000,$04C00000,$04880000,$04E80000,$04D00000,$04980000,$04A00000,$04900000,
$04F00000,$04F80000,$04E00000,$04B80000,$04B00000,$04800000,$04C80000,$04D80000,
$07A80000,$07C00000,$07880000,$07E80000,$07D00000,$07980000,$07A00000,$07900000,
$07F00000,$07F80000,$07E00000,$07B80000,$07B00000,$07800000,$07C80000,$07D80000,
$07280000,$07400000,$07080000,$07680000,$07500000,$07180000,$07200000,$07100000,
$07700000,$07780000,$07600000,$07380000,$07300000,$07000000,$07480000,$07580000,
$02280000,$02400000,$02080000,$02680000,$02500000,$02180000,$02200000,$02100000,
$02700000,$02780000,$02600000,$02380000,$02300000,$02000000,$02480000,$02580000,
$03280000,$03400000,$03080000,$03680000,$03500000,$03180000,$03200000,$03100000,
$03700000,$03780000,$03600000,$03380000,$03300000,$03000000,$03480000,$03580000,
$06280000,$06400000,$06080000,$06680000,$06500000,$06180000,$06200000,$06100000,
$06700000,$06780000,$06600000,$06380000,$06300000,$06000000,$06480000,$06580000,
$05A80000,$05C00000,$05880000,$05E80000,$05D00000,$05980000,$05A00000,$05900000,
$05F00000,$05F80000,$05E00000,$05B80000,$05B00000,$05800000,$05C80000,$05D80000,
$01280000,$01400000,$01080000,$01680000,$01500000,$01180000,$01200000,$01100000,
$01700000,$01780000,$01600000,$01380000,$01300000,$01000000,$01480000,$01580000,
$02A80000,$02C00000,$02880000,$02E80000,$02D00000,$02980000,$02A00000,$02900000,
$02F00000,$02F80000,$02E00000,$02B80000,$02B00000,$02800000,$02C80000,$02D80000,
$01A80000,$01C00000,$01880000,$01E80000,$01D00000,$01980000,$01A00000,$01900000,
$01F00000,$01F80000,$01E00000,$01B80000,$01B00000,$01800000,$01C80000,$01D80000),
($30000002,$60000002,$38000002,$08000002,$28000002,$78000002,$68000002,$40000002,
$20000002,$50000002,$48000002,$70000002,$00000002,$18000002,$58000002,$10000002,
$B0000005,$E0000005,$B8000005,$88000005,$A8000005,$F8000005,$E8000005,$C0000005,
$A0000005,$D0000005,$C8000005,$F0000005,$80000005,$98000005,$D8000005,$90000005,
$30000005,$60000005,$38000005,$08000005,$28000005,$78000005,$68000005,$40000005,
$20000005,$50000005,$48000005,$70000005,$00000005,$18000005,$58000005,$10000005,
$30000000,$60000000,$38000000,$08000000,$28000000,$78000000,$68000000,$40000000,
$20000000,$50000000,$48000000,$70000000,$00000000,$18000000,$58000000,$10000000,
$B0000003,$E0000003,$B8000003,$88000003,$A8000003,$F8000003,$E8000003,$C0000003,
$A0000003,$D0000003,$C8000003,$F0000003,$80000003,$98000003,$D8000003,$90000003,
$30000001,$60000001,$38000001,$08000001,$28000001,$78000001,$68000001,$40000001,
$20000001,$50000001,$48000001,$70000001,$00000001,$18000001,$58000001,$10000001,
$B0000000,$E0000000,$B8000000,$88000000,$A8000000,$F8000000,$E8000000,$C0000000,
$A0000000,$D0000000,$C8000000,$F0000000,$80000000,$98000000,$D8000000,$90000000,
$B0000006,$E0000006,$B8000006,$88000006,$A8000006,$F8000006,$E8000006,$C0000006,
$A0000006,$D0000006,$C8000006,$F0000006,$80000006,$98000006,$D8000006,$90000006,
$B0000001,$E0000001,$B8000001,$88000001,$A8000001,$F8000001,$E8000001,$C0000001,
$A0000001,$D0000001,$C8000001,$F0000001,$80000001,$98000001,$D8000001,$90000001,
$30000003,$60000003,$38000003,$08000003,$28000003,$78000003,$68000003,$40000003,
$20000003,$50000003,$48000003,$70000003,$00000003,$18000003,$58000003,$10000003,
$30000004,$60000004,$38000004,$08000004,$28000004,$78000004,$68000004,$40000004,
$20000004,$50000004,$48000004,$70000004,$00000004,$18000004,$58000004,$10000004,
$B0000002,$E0000002,$B8000002,$88000002,$A8000002,$F8000002,$E8000002,$C0000002,
$A0000002,$D0000002,$C8000002,$F0000002,$80000002,$98000002,$D8000002,$90000002,
$B0000004,$E0000004,$B8000004,$88000004,$A8000004,$F8000004,$E8000004,$C0000004,
$A0000004,$D0000004,$C8000004,$F0000004,$80000004,$98000004,$D8000004,$90000004,
$30000006,$60000006,$38000006,$08000006,$28000006,$78000006,$68000006,$40000006,
$20000006,$50000006,$48000006,$70000006,$00000006,$18000006,$58000006,$10000006,
$B0000007,$E0000007,$B8000007,$88000007,$A8000007,$F8000007,$E8000007,$C0000007,
$A0000007,$D0000007,$C8000007,$F0000007,$80000007,$98000007,$D8000007,$90000007,
$30000007,$60000007,$38000007,$08000007,$28000007,$78000007,$68000007,$40000007,
$20000007,$50000007,$48000007,$70000007,$00000007,$18000007,$58000007,$10000007),
($000000E8,$000000D8,$000000A0,$00000088,$00000098,$000000F8,$000000A8,$000000C8,
$00000080,$000000D0,$000000F0,$000000B8,$000000B0,$000000C0,$00000090,$000000E0,
$000007E8,$000007D8,$000007A0,$00000788,$00000798,$000007F8,$000007A8,$000007C8,
$00000780,$000007D0,$000007F0,$000007B8,$000007B0,$000007C0,$00000790,$000007E0,
$000006E8,$000006D8,$000006A0,$00000688,$00000698,$000006F8,$000006A8,$000006C8,
$00000680,$000006D0,$000006F0,$000006B8,$000006B0,$000006C0,$00000690,$000006E0,
$00000068,$00000058,$00000020,$00000008,$00000018,$00000078,$00000028,$00000048,
$00000000,$00000050,$00000070,$00000038,$00000030,$00000040,$00000010,$00000060,
$000002E8,$000002D8,$000002A0,$00000288,$00000298,$000002F8,$000002A8,$000002C8,
$00000280,$000002D0,$000002F0,$000002B8,$000002B0,$000002C0,$00000290,$000002E0,
$000003E8,$000003D8,$000003A0,$00000388,$00000398,$000003F8,$000003A8,$000003C8,
$00000380,$000003D0,$000003F0,$000003B8,$000003B0,$000003C0,$00000390,$000003E0,
$00000568,$00000558,$00000520,$00000508,$00000518,$00000578,$00000528,$00000548,
$00000500,$00000550,$00000570,$00000538,$00000530,$00000540,$00000510,$00000560,
$00000268,$00000258,$00000220,$00000208,$00000218,$00000278,$00000228,$00000248,
$00000200,$00000250,$00000270,$00000238,$00000230,$00000240,$00000210,$00000260,
$000004E8,$000004D8,$000004A0,$00000488,$00000498,$000004F8,$000004A8,$000004C8,
$00000480,$000004D0,$000004F0,$000004B8,$000004B0,$000004C0,$00000490,$000004E0,
$00000168,$00000158,$00000120,$00000108,$00000118,$00000178,$00000128,$00000148,
$00000100,$00000150,$00000170,$00000138,$00000130,$00000140,$00000110,$00000160,
$000001E8,$000001D8,$000001A0,$00000188,$00000198,$000001F8,$000001A8,$000001C8,
$00000180,$000001D0,$000001F0,$000001B8,$000001B0,$000001C0,$00000190,$000001E0,
$00000768,$00000758,$00000720,$00000708,$00000718,$00000778,$00000728,$00000748,
$00000700,$00000750,$00000770,$00000738,$00000730,$00000740,$00000710,$00000760,
$00000368,$00000358,$00000320,$00000308,$00000318,$00000378,$00000328,$00000348,
$00000300,$00000350,$00000370,$00000338,$00000330,$00000340,$00000310,$00000360,
$000005E8,$000005D8,$000005A0,$00000588,$00000598,$000005F8,$000005A8,$000005C8,
$00000580,$000005D0,$000005F0,$000005B8,$000005B0,$000005C0,$00000590,$000005E0,
$00000468,$00000458,$00000420,$00000408,$00000418,$00000478,$00000428,$00000448,
$00000400,$00000450,$00000470,$00000438,$00000430,$00000440,$00000410,$00000460,
$00000668,$00000658,$00000620,$00000608,$00000618,$00000678,$00000628,$00000648,
$00000600,$00000650,$00000670,$00000638,$00000630,$00000640,$00000610,$00000660));
type
PGOST = ^TGOST;
TGOST = object(TBlockCipher64)
protected
KeyData: array[0..7] of DWord;
// code
public
// code
procedure Burn;virtual;
procedure InitKey(const Key; Size: longword);virtual;
procedure EncryptECB(const InData; var OutData);virtual;
procedure DecryptECB(const InData; var OutData);virtual;
destructor Destroy; virtual;
end;
//IDEA cipher implementation
type
PIDEA = ^TIDEA;
TIDEA = object(TBlockCipher64)
protected
EK, DK: array[0..51] of word;
public
// code
procedure Burn;virtual;
procedure InitKey(const Key; Size: longword);virtual;
procedure EncryptECB(const InData; var OutData);virtual;
procedure DecryptECB(const InData; var OutData);virtual;
destructor Destroy; virtual;
end;
//Misty1 cipher implementation
const
NUMROUNDSMY1 = 8;
const
S7TABLE: array[0..$7F] of byte= (
$1b, $32, $33, $5a, $3b, $10, $17, $54, $5b, $1a, $72, $73, $6b, $2c, $66, $49,
$1f, $24, $13, $6c, $37, $2e, $3f, $4a, $5d, $0f, $40, $56, $25, $51, $1c, $04,
$0b, $46, $20, $0d, $7b, $35, $44, $42, $2b, $1e, $41, $14, $4b, $79, $15, $6f,
$0e, $55, $09, $36, $74, $0c, $67, $53, $28, $0a, $7e, $38, $02, $07, $60, $29,
$19, $12, $65, $2f, $30, $39, $08, $68, $5f, $78, $2a, $4c, $64, $45, $75, $3d,
$59, $48, $03, $57, $7c, $4f, $62, $3c, $1d, $21, $5e, $27, $6a, $70, $4d, $3a,
$01, $6d, $6e, $63, $18, $77, $23, $05, $26, $76, $00, $31, $2d, $7a, $7f, $61,
$50, $22, $11, $06, $47, $16, $52, $4e, $71, $3e, $69, $43, $34, $5c, $58, $7d);
S9TABLE: array[0..$1FF] of Dword= (
$1c3, $0cb, $153, $19f, $1e3, $0e9, $0fb, $035, $181, $0b9, $117, $1eb, $133, $009, $02d, $0d3,
$0c7, $14a, $037, $07e, $0eb, $164, $193, $1d8, $0a3, $11e, $055, $02c, $01d, $1a2, $163, $118,
$14b, $152, $1d2, $00f, $02b, $030, $13a, $0e5, $111, $138, $18e, $063, $0e3, $0c8, $1f4, $01b,
$001, $09d, $0f8, $1a0, $16d, $1f3, $01c, $146, $07d, $0d1, $082, $1ea, $183, $12d, $0f4, $19e,
$1d3, $0dd, $1e2, $128, $1e0, $0ec, $059, $091, $011, $12f, $026, $0dc, $0b0, $18c, $10f, $1f7,
$0e7, $16c, $0b6, $0f9, $0d8, $151, $101, $14c, $103, $0b8, $154, $12b, $1ae, $017, $071, $00c,
$047, $058, $07f, $1a4, $134, $129, $084, $15d, $19d, $1b2, $1a3, $048, $07c, $051, $1ca, $023,
$13d, $1a7, $165, $03b, $042, $0da, $192, $0ce, $0c1, $06b, $09f, $1f1, $12c, $184, $0fa, $196,
$1e1, $169, $17d, $031, $180, $10a, $094, $1da, $186, $13e, $11c, $060, $175, $1cf, $067, $119,
$065, $068, $099, $150, $008, $007, $17c, $0b7, $024, $019, $0de, $127, $0db, $0e4, $1a9, $052,
$109, $090, $19c, $1c1, $028, $1b3, $135, $16a, $176, $0df, $1e5, $188, $0c5, $16e, $1de, $1b1,
$0c3, $1df, $036, $0ee, $1ee, $0f0, $093, $049, $09a, $1b6, $069, $081, $125, $00b, $05e, $0b4,
$149, $1c7, $174, $03e, $13b, $1b7, $08e, $1c6, $0ae, $010, $095, $1ef, $04e, $0f2, $1fd, $085,
$0fd, $0f6, $0a0, $16f, $083, $08a, $156, $09b, $13c, $107, $167, $098, $1d0, $1e9, $003, $1fe,
$0bd, $122, $089, $0d2, $18f, $012, $033, $06a, $142, $0ed, $170, $11b, $0e2, $14f, $158, $131,
$147, $05d, $113, $1cd, $079, $161, $1a5, $179, $09e, $1b4, $0cc, $022, $132, $01a, $0e8, $004,
$187, $1ed, $197, $039, $1bf, $1d7, $027, $18b, $0c6, $09c, $0d0, $14e, $06c, $034, $1f2, $06e,
$0ca, $025, $0ba, $191, $0fe, $013, $106, $02f, $1ad, $172, $1db, $0c0, $10b, $1d6, $0f5, $1ec,
$10d, $076, $114, $1ab, $075, $10c, $1e4, $159, $054, $11f, $04b, $0c4, $1be, $0f7, $029, $0a4,
$00e, $1f0, $077, $04d, $17a, $086, $08b, $0b3, $171, $0bf, $10e, $104, $097, $15b, $160, $168,
$0d7, $0bb, $066, $1ce, $0fc, $092, $1c5, $06f, $016, $04a, $0a1, $139, $0af, $0f1, $190, $00a,
$1aa, $143, $17b, $056, $18d, $166, $0d4, $1fb, $14d, $194, $19a, $087, $1f8, $123, $0a7, $1b8,
$141, $03c, $1f9, $140, $02a, $155, $11a, $1a1, $198, $0d5, $126, $1af, $061, $12e, $157, $1dc,
$072, $18a, $0aa, $096, $115, $0ef, $045, $07b, $08d, $145, $053, $05f, $178, $0b2, $02e, $020,
$1d5, $03f, $1c9, $1e7, $1ac, $044, $038, $014, $0b1, $16b, $0ab, $0b5, $05a, $182, $1c8, $1d4,
$018, $177, $064, $0cf, $06d, $100, $199, $130, $15a, $005, $120, $1bb, $1bd, $0e0, $04f, $0d6,
$13f, $1c4, $12a, $015, $006, $0ff, $19b, $0a6, $043, $088, $050, $15f, $1e8, $121, $073, $17e,
$0bc, $0c2, $0c9, $173, $189, $1f5, $074, $1cc, $1e6, $1a8, $195, $01f, $041, $00d, $1ba, $032,
$03d, $1d1, $080, $0a8, $057, $1b9, $162, $148, $0d9, $105, $062, $07a, $021, $1ff, $112, $108,
$1c0, $0a9, $11d, $1b0, $1a6, $0cd, $0f3, $05c, $102, $05b, $1d9, $144, $1f6, $0ad, $0a5, $03a,
$1cb, $136, $17f, $046, $0e1, $01e, $1dd, $0e6, $137, $1fa, $185, $08c, $08f, $040, $1b5, $0be,
$078, $000, $0ac, $110, $15e, $124, $002, $1bc, $0a2, $0ea, $070, $1fc, $116, $15c, $04c, $1c2);
type
PMisty1 = ^TMisty1;
TMisty1 = object(TBlockCipher64)
protected
KeyData: array[0..31] of DWord;
function FI(const FI_IN, FI_KEY: DWord): DWord;
function FO(const FO_IN: DWord; const k: longword): DWord;
function FL(const FL_IN: DWord; const k: longword): DWord;
function FLINV(const FL_IN: DWord; const k: longword): DWord;
public
// code
procedure Burn;virtual;
procedure InitKey(const Key; Size: longword);virtual;
procedure EncryptECB(const InData; var OutData);virtual;
procedure DecryptECB(const InData; var OutData);virtual;
destructor Destroy; virtual;
end;
//RC2 cipher implementation
const
sBoxRC2: array[0..255] of byte= (
$D9,$78,$F9,$C4,$19,$DD,$B5,$ED,$28,$E9,$FD,$79,$4A,$A0,$D8,$9D,
$C6,$7E,$37,$83,$2B,$76,$53,$8E,$62,$4C,$64,$88,$44,$8B,$FB,$A2,
$17,$9A,$59,$F5,$87,$B3,$4F,$13,$61,$45,$6D,$8D,$09,$81,$7D,$32,
$BD,$8F,$40,$EB,$86,$B7,$7B,$0B,$F0,$95,$21,$22,$5C,$6B,$4E,$82,
$54,$D6,$65,$93,$CE,$60,$B2,$1C,$73,$56,$C0,$14,$A7,$8C,$F1,$DC,
$12,$75,$CA,$1F,$3B,$BE,$E4,$D1,$42,$3D,$D4,$30,$A3,$3C,$B6,$26,
$6F,$BF,$0E,$DA,$46,$69,$07,$57,$27,$F2,$1D,$9B,$BC,$94,$43,$03,
$F8,$11,$C7,$F6,$90,$EF,$3E,$E7,$06,$C3,$D5,$2F,$C8,$66,$1E,$D7,
$08,$E8,$EA,$DE,$80,$52,$EE,$F7,$84,$AA,$72,$AC,$35,$4D,$6A,$2A,
$96,$1A,$D2,$71,$5A,$15,$49,$74,$4B,$9F,$D0,$5E,$04,$18,$A4,$EC,
$C2,$E0,$41,$6E,$0F,$51,$CB,$CC,$24,$91,$AF,$50,$A1,$F4,$70,$39,
$99,$7C,$3A,$85,$23,$B8,$B4,$7A,$FC,$02,$36,$5B,$25,$55,$97,$31,
$2D,$5D,$FA,$98,$E3,$8A,$92,$AE,$05,$DF,$29,$10,$67,$6C,$BA,$C9,
$D3,$00,$E6,$CF,$E1,$9E,$A8,$2C,$63,$16,$01,$3F,$58,$E2,$89,$A9,
$0D,$38,$34,$1B,$AB,$33,$FF,$B0,$BB,$48,$0C,$5F,$B9,$B1,$CD,$2E,
$C5,$F3,$DB,$47,$E5,$A5,$9C,$77,$0A,$A6,$20,$68,$FE,$7F,$C1,$AD);
type
PRC2 = ^TRC2;
TRC2 = object(TBlockCipher64)
protected
KeyData: array[0..63] of word;
public
// code
procedure Burn;virtual;
procedure InitKey(const Key; Size: longword);virtual;
procedure EncryptECB(const InData; var OutData);virtual;
procedure DecryptECB(const InData; var OutData);virtual;
destructor Destroy; virtual;
end;
//RC5 cipher implementation
const
NUMROUNDSRC5= 12; { number of rounds must be between 12-16 }
const
sBoxRC5: array[0..33] of dword= (
$B7E15163,$5618CB1C,$F45044D5,$9287BE8E,$30BF3847,$CEF6B200,
$6D2E2BB9,$0B65A572,$A99D1F2B,$47D498E4,$E60C129D,$84438C56,
$227B060F,$C0B27FC8,$5EE9F981,$FD21733A,$9B58ECF3,$399066AC,
$D7C7E065,$75FF5A1E,$1436D3D7,$B26E4D90,$50A5C749,$EEDD4102,
$8D14BABB,$2B4C3474,$C983AE2D,$67BB27E6,$05F2A19F,$A42A1B58,
$42619511,$E0990ECA,$7ED08883,$1D08023C);
type
PRC5 = ^TRC5;
TRC5 = object(TBlockCipher64)
protected
KeyData: array[0..((NUMROUNDSRC5*2)+1)] of DWord;
public
// code
procedure Burn;virtual;
procedure InitKey(const Key; Size: longword);virtual;
procedure EncryptECB(const InData; var OutData);virtual;
procedure DecryptECB(const InData; var OutData);virtual;
destructor Destroy; virtual;
end;
//RC6 cipher implementation
const
NUMROUNDSRC6= 20; { number of rounds must be between 16-24 }
const
sBoxRC6: array[0..51] of DWord= (
$B7E15163,$5618CB1C,$F45044D5,$9287BE8E,$30BF3847,$CEF6B200,
$6D2E2BB9,$0B65A572,$A99D1F2B,$47D498E4,$E60C129D,$84438C56,
$227B060F,$C0B27FC8,$5EE9F981,$FD21733A,$9B58ECF3,$399066AC,
$D7C7E065,$75FF5A1E,$1436D3D7,$B26E4D90,$50A5C749,$EEDD4102,
$8D14BABB,$2B4C3474,$C983AE2D,$67BB27E6,$05F2A19F,$A42A1B58,
$42619511,$E0990ECA,$7ED08883,$1D08023C,$BB3F7BF5,$5976F5AE,
$F7AE6F67,$95E5E920,$341D62D9,$D254DC92,$708C564B,$0EC3D004,
$ACFB49BD,$4B32C376,$E96A3D2F,$87A1B6E8,$25D930A1,$C410AA5A,
$62482413,$007F9DCC,$9EB71785,$3CEE913E);
type
PRC6 = ^TRC6;
TRC6 = object(TBlockCipher128)
protected
KeyData: array[0..((NUMROUNDSRC6*2)+3)] of DWord;
public
procedure InitKey(const Key; Size: longword); virtual;
procedure Burn; virtual;
procedure EncryptECB(const InData; var OutData); virtual;
procedure DecryptECB(const InData; var OutData); virtual;
destructor Destroy; virtual;
end;
//TEA cipher implementation
const
Delta= $9e3779b9;
Rounds= 32;
type
PTEA = ^TTEA;
TTEA = object(TBlockCipher64)
protected
KeyData: array[0..3] of dword;
public
// code
procedure Burn;virtual;
procedure InitKey(const Key; Size: longword);virtual;
procedure EncryptECB(const InData; var OutData);virtual;
procedure DecryptECB(const InData; var OutData);virtual;
destructor Destroy; virtual;
end;
// DES and 3DES cipher implementation
const
shifts2: array[0..15]of byte=
(0,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0);
des_skb: array[0..7,0..63]of dword=(
(
(* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 *)
$00000000,$00000010,$20000000,$20000010,
$00010000,$00010010,$20010000,$20010010,
$00000800,$00000810,$20000800,$20000810,
$00010800,$00010810,$20010800,$20010810,
$00000020,$00000030,$20000020,$20000030,
$00010020,$00010030,$20010020,$20010030,
$00000820,$00000830,$20000820,$20000830,
$00010820,$00010830,$20010820,$20010830,
$00080000,$00080010,$20080000,$20080010,
$00090000,$00090010,$20090000,$20090010,
$00080800,$00080810,$20080800,$20080810,
$00090800,$00090810,$20090800,$20090810,
$00080020,$00080030,$20080020,$20080030,
$00090020,$00090030,$20090020,$20090030,
$00080820,$00080830,$20080820,$20080830,
$00090820,$00090830,$20090820,$20090830
),(
(* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 *)
$00000000,$02000000,$00002000,$02002000,
$00200000,$02200000,$00202000,$02202000,
$00000004,$02000004,$00002004,$02002004,
$00200004,$02200004,$00202004,$02202004,
$00000400,$02000400,$00002400,$02002400,
$00200400,$02200400,$00202400,$02202400,
$00000404,$02000404,$00002404,$02002404,
$00200404,$02200404,$00202404,$02202404,
$10000000,$12000000,$10002000,$12002000,
$10200000,$12200000,$10202000,$12202000,
$10000004,$12000004,$10002004,$12002004,
$10200004,$12200004,$10202004,$12202004,
$10000400,$12000400,$10002400,$12002400,
$10200400,$12200400,$10202400,$12202400,
$10000404,$12000404,$10002404,$12002404,
$10200404,$12200404,$10202404,$12202404
),(
(* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 *)
$00000000,$00000001,$00040000,$00040001,
$01000000,$01000001,$01040000,$01040001,
$00000002,$00000003,$00040002,$00040003,
$01000002,$01000003,$01040002,$01040003,
$00000200,$00000201,$00040200,$00040201,
$01000200,$01000201,$01040200,$01040201,
$00000202,$00000203,$00040202,$00040203,
$01000202,$01000203,$01040202,$01040203,
$08000000,$08000001,$08040000,$08040001,
$09000000,$09000001,$09040000,$09040001,
$08000002,$08000003,$08040002,$08040003,
$09000002,$09000003,$09040002,$09040003,
$08000200,$08000201,$08040200,$08040201,
$09000200,$09000201,$09040200,$09040201,
$08000202,$08000203,$08040202,$08040203,
$09000202,$09000203,$09040202,$09040203
),(
(* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 *)
$00000000,$00100000,$00000100,$00100100,
$00000008,$00100008,$00000108,$00100108,
$00001000,$00101000,$00001100,$00101100,
$00001008,$00101008,$00001108,$00101108,
$04000000,$04100000,$04000100,$04100100,
$04000008,$04100008,$04000108,$04100108,
$04001000,$04101000,$04001100,$04101100,
$04001008,$04101008,$04001108,$04101108,
$00020000,$00120000,$00020100,$00120100,
$00020008,$00120008,$00020108,$00120108,
$00021000,$00121000,$00021100,$00121100,
$00021008,$00121008,$00021108,$00121108,
$04020000,$04120000,$04020100,$04120100,
$04020008,$04120008,$04020108,$04120108,
$04021000,$04121000,$04021100,$04121100,
$04021008,$04121008,$04021108,$04121108
),(
(* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 *)
$00000000,$10000000,$00010000,$10010000,
$00000004,$10000004,$00010004,$10010004,
$20000000,$30000000,$20010000,$30010000,
$20000004,$30000004,$20010004,$30010004,
$00100000,$10100000,$00110000,$10110000,
$00100004,$10100004,$00110004,$10110004,
$20100000,$30100000,$20110000,$30110000,
$20100004,$30100004,$20110004,$30110004,
$00001000,$10001000,$00011000,$10011000,
$00001004,$10001004,$00011004,$10011004,
$20001000,$30001000,$20011000,$30011000,
$20001004,$30001004,$20011004,$30011004,
$00101000,$10101000,$00111000,$10111000,
$00101004,$10101004,$00111004,$10111004,
$20101000,$30101000,$20111000,$30111000,
$20101004,$30101004,$20111004,$30111004
),(
(* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 *)
$00000000,$08000000,$00000008,$08000008,
$00000400,$08000400,$00000408,$08000408,
$00020000,$08020000,$00020008,$08020008,
$00020400,$08020400,$00020408,$08020408,
$00000001,$08000001,$00000009,$08000009,
$00000401,$08000401,$00000409,$08000409,
$00020001,$08020001,$00020009,$08020009,
$00020401,$08020401,$00020409,$08020409,
$02000000,$0A000000,$02000008,$0A000008,
$02000400,$0A000400,$02000408,$0A000408,
$02020000,$0A020000,$02020008,$0A020008,
$02020400,$0A020400,$02020408,$0A020408,
$02000001,$0A000001,$02000009,$0A000009,
$02000401,$0A000401,$02000409,$0A000409,
$02020001,$0A020001,$02020009,$0A020009,
$02020401,$0A020401,$02020409,$0A020409
),(
(* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 *)
$00000000,$00000100,$00080000,$00080100,
$01000000,$01000100,$01080000,$01080100,
$00000010,$00000110,$00080010,$00080110,
$01000010,$01000110,$01080010,$01080110,
$00200000,$00200100,$00280000,$00280100,
$01200000,$01200100,$01280000,$01280100,
$00200010,$00200110,$00280010,$00280110,
$01200010,$01200110,$01280010,$01280110,
$00000200,$00000300,$00080200,$00080300,
$01000200,$01000300,$01080200,$01080300,
$00000210,$00000310,$00080210,$00080310,
$01000210,$01000310,$01080210,$01080310,
$00200200,$00200300,$00280200,$00280300,
$01200200,$01200300,$01280200,$01280300,
$00200210,$00200310,$00280210,$00280310,
$01200210,$01200310,$01280210,$01280310
),(
(* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 *)
$00000000,$04000000,$00040000,$04040000,
$00000002,$04000002,$00040002,$04040002,
$00002000,$04002000,$00042000,$04042000,
$00002002,$04002002,$00042002,$04042002,
$00000020,$04000020,$00040020,$04040020,
$00000022,$04000022,$00040022,$04040022,
$00002020,$04002020,$00042020,$04042020,
$00002022,$04002022,$00042022,$04042022,
$00000800,$04000800,$00040800,$04040800,
$00000802,$04000802,$00040802,$04040802,
$00002800,$04002800,$00042800,$04042800,
$00002802,$04002802,$00042802,$04042802,
$00000820,$04000820,$00040820,$04040820,
$00000822,$04000822,$00040822,$04040822,
$00002820,$04002820,$00042820,$04042820,
$00002822,$04002822,$00042822,$04042822
));
des_sptrans: array[0..7,0..63] of dword=(
(
(* nibble 0 *)
$02080800, $00080000, $02000002, $02080802,
$02000000, $00080802, $00080002, $02000002,
$00080802, $02080800, $02080000, $00000802,
$02000802, $02000000, $00000000, $00080002,
$00080000, $00000002, $02000800, $00080800,
$02080802, $02080000, $00000802, $02000800,
$00000002, $00000800, $00080800, $02080002,
$00000800, $02000802, $02080002, $00000000,
$00000000, $02080802, $02000800, $00080002,
$02080800, $00080000, $00000802, $02000800,
$02080002, $00000800, $00080800, $02000002,
$00080802, $00000002, $02000002, $02080000,
$02080802, $00080800, $02080000, $02000802,
$02000000, $00000802, $00080002, $00000000,
$00080000, $02000000, $02000802, $02080800,
$00000002, $02080002, $00000800, $00080802
),(
(* nibble 1 *)
$40108010, $00000000, $00108000, $40100000,
$40000010, $00008010, $40008000, $00108000,
$00008000, $40100010, $00000010, $40008000,
$00100010, $40108000, $40100000, $00000010,
$00100000, $40008010, $40100010, $00008000,
$00108010, $40000000, $00000000, $00100010,
$40008010, $00108010, $40108000, $40000010,
$40000000, $00100000, $00008010, $40108010,
$00100010, $40108000, $40008000, $00108010,
$40108010, $00100010, $40000010, $00000000,
$40000000, $00008010, $00100000, $40100010,
$00008000, $40000000, $00108010, $40008010,
$40108000, $00008000, $00000000, $40000010,
$00000010, $40108010, $00108000, $40100000,
$40100010, $00100000, $00008010, $40008000,
$40008010, $00000010, $40100000, $00108000
),(
(* nibble 2 *)
$04000001, $04040100, $00000100, $04000101,
$00040001, $04000000, $04000101, $00040100,
$04000100, $00040000, $04040000, $00000001,
$04040101, $00000101, $00000001, $04040001,
$00000000, $00040001, $04040100, $00000100,
$00000101, $04040101, $00040000, $04000001,
$04040001, $04000100, $00040101, $04040000,
$00040100, $00000000, $04000000, $00040101,
$04040100, $00000100, $00000001, $00040000,
$00000101, $00040001, $04040000, $04000101,
$00000000, $04040100, $00040100, $04040001,
$00040001, $04000000, $04040101, $00000001,
$00040101, $04000001, $04000000, $04040101,
$00040000, $04000100, $04000101, $00040100,
$04000100, $00000000, $04040001, $00000101,
$04000001, $00040101, $00000100, $04040000
),(
(* nibble 3 *)
$00401008, $10001000, $00000008, $10401008,
$00000000, $10400000, $10001008, $00400008,
$10401000, $10000008, $10000000, $00001008,
$10000008, $00401008, $00400000, $10000000,
$10400008, $00401000, $00001000, $00000008,
$00401000, $10001008, $10400000, $00001000,
$00001008, $00000000, $00400008, $10401000,
$10001000, $10400008, $10401008, $00400000,
$10400008, $00001008, $00400000, $10000008,
$00401000, $10001000, $00000008, $10400000,
$10001008, $00000000, $00001000, $00400008,
$00000000, $10400008, $10401000, $00001000,
$10000000, $10401008, $00401008, $00400000,
$10401008, $00000008, $10001000, $00401008,
$00400008, $00401000, $10400000, $10001008,
$00001008, $10000000, $10000008, $10401000
),(
(* nibble 4 *)
$08000000, $00010000, $00000400, $08010420,
$08010020, $08000400, $00010420, $08010000,
$00010000, $00000020, $08000020, $00010400,
$08000420, $08010020, $08010400, $00000000,
$00010400, $08000000, $00010020, $00000420,
$08000400, $00010420, $00000000, $08000020,
$00000020, $08000420, $08010420, $00010020,
$08010000, $00000400, $00000420, $08010400,
$08010400, $08000420, $00010020, $08010000,
$00010000, $00000020, $08000020, $08000400,
$08000000, $00010400, $08010420, $00000000,
$00010420, $08000000, $00000400, $00010020,
$08000420, $00000400, $00000000, $08010420,
$08010020, $08010400, $00000420, $00010000,
$00010400, $08010020, $08000400, $00000420,
$00000020, $00010420, $08010000, $08000020
),(
(* nibble 5 *)
$80000040, $00200040, $00000000, $80202000,
$00200040, $00002000, $80002040, $00200000,
$00002040, $80202040, $00202000, $80000000,
$80002000, $80000040, $80200000, $00202040,
$00200000, $80002040, $80200040, $00000000,
$00002000, $00000040, $80202000, $80200040,
$80202040, $80200000, $80000000, $00002040,
$00000040, $00202000, $00202040, $80002000,
$00002040, $80000000, $80002000, $00202040,
$80202000, $00200040, $00000000, $80002000,
$80000000, $00002000, $80200040, $00200000,
$00200040, $80202040, $00202000, $00000040,
$80202040, $00202000, $00200000, $80002040,
$80000040, $80200000, $00202040, $00000000,
$00002000, $80000040, $80002040, $80202000,
$80200000, $00002040, $00000040, $80200040
),(
(* nibble 6 *)
$00004000, $00000200, $01000200, $01000004,
$01004204, $00004004, $00004200, $00000000,
$01000000, $01000204, $00000204, $01004000,
$00000004, $01004200, $01004000, $00000204,
$01000204, $00004000, $00004004, $01004204,
$00000000, $01000200, $01000004, $00004200,
$01004004, $00004204, $01004200, $00000004,
$00004204, $01004004, $00000200, $01000000,
$00004204, $01004000, $01004004, $00000204,
$00004000, $00000200, $01000000, $01004004,
$01000204, $00004204, $00004200, $00000000,
$00000200, $01000004, $00000004, $01000200,
$00000000, $01000204, $01000200, $00004200,
$00000204, $00004000, $01004204, $01000000,
$01004200, $00000004, $00004004, $01004204,
$01000004, $01004200, $01004000, $00004004
),(
(* nibble 7 *)
$20800080, $20820000, $00020080, $00000000,
$20020000, $00800080, $20800000, $20820080,
$00000080, $20000000, $00820000, $00020080,
$00820080, $20020080, $20000080, $20800000,
$00020000, $00820080, $00800080, $20020000,
$20820080, $20000080, $00000000, $00820000,
$20000000, $00800000, $20020080, $20800080,
$00800000, $00020000, $20820000, $00000080,
$00800000, $00020000, $20000080, $20820080,
$00020080, $20000000, $00000000, $00820000,
$20800080, $20020080, $20020000, $00800080,
$20820000, $00000080, $00800080, $20020000,
$20820080, $00800000, $20800000, $20000080,
$00820000, $00020080, $20020080, $20800000,
$00000080, $20820000, $00820080, $00000000,
$20000000, $20800080, $00020000, $00820080
));
// DES and 3DES cipher implementation
type
Pdwordarray= ^Tdwordarray;
Tdwordarray= array[0..8191] of dword;
type
TCustomDES = object(TBlockCipher64)
protected
procedure DoInit(KeyB: PByteArray; KeyData: PDWordArray);virtual;
procedure EncryptBlock(const InData; var OutData; KeyData: PDWordArray);
procedure DecryptBlock(const InData; var OutData; KeyData: PDWordArray);
end;
type
PDES = ^TDES;
TDES = object (TCustomDES)
protected
KeyData: array[0..31] of dword;
public
procedure InitKey(const Key; Size: longword);virtual;
procedure Burn; virtual;
procedure EncryptECB(const InData; var OutData); virtual;
procedure DecryptECB(const InData; var OutData); virtual;
destructor Destroy; virtual;
end;
type
P3DES = ^T3DES;
T3DES = object (TCustomDES)
protected
KeyData: array[0..2,0..31] of dword;
public
procedure InitKey(const Key; Size: longword);virtual;
procedure Burn;virtual;
procedure EncryptECB(const InData; var OutData); virtual;
procedure DecryptECB(const InData; var OutData); virtual;
destructor Destroy; virtual;
end;
type
Pwordarray= ^Twordarray;
Twordarray= array[0..19383] of word;
// ICE, ICE2 and ThinICE cipher implementation
type
TCustomICE= object(TBlockCipher64)
protected
rounds: dword;
ik_keysched: array[0..31,0..2] of dword;
function f(p, sk: dword): dword;
procedure key_sched_build(kb: pwordarray; n: dword; keyrot: pdwordarray);
procedure InitIce(const Key; Size: longword; n: dword);
public
procedure Burn; virtual;
procedure EncryptECB(const InData; var OutData); virtual;
procedure DecryptECB(const InData; var OutData); virtual;
end;
type
PICE = ^TICE;
TICE = object(TCustomICE)
protected
public
procedure InitKey(const Key; Size: longword); virtual;
destructor Destroy; virtual;
end;
type
PThinIce = ^TThinIce;
TThinIce= object(TCustomICE)
protected
public
procedure InitKey(const Key; Size: longword); virtual;
destructor Destroy; virtual;
end;
type
PICE2 = ^TICE2;
TICE2= object(TCustomICE)
protected
public
procedure InitKey(const Key; Size: longword); virtual;
destructor Destroy; virtual;
end;
// Mars cipher implementation
const
S_Box: array[0..511] of DWord= (
$09d0c479, $28c8ffe0, $84aa6c39, $9dad7287,
$7dff9be3, $d4268361, $c96da1d4, $7974cc93,
$85d0582e, $2a4b5705, $1ca16a62, $c3bd279d,
$0f1f25e5, $5160372f, $c695c1fb, $4d7ff1e4,
$ae5f6bf4, $0d72ee46, $ff23de8a, $b1cf8e83,
$f14902e2, $3e981e42, $8bf53eb6, $7f4bf8ac,
$83631f83, $25970205, $76afe784, $3a7931d4,
$4f846450, $5c64c3f6, $210a5f18, $c6986a26,
$28f4e826, $3a60a81c, $d340a664, $7ea820c4,
$526687c5, $7eddd12b, $32a11d1d, $9c9ef086,
$80f6e831, $ab6f04ad, $56fb9b53, $8b2e095c,
$b68556ae, $d2250b0d, $294a7721, $e21fb253,
$ae136749, $e82aae86, $93365104, $99404a66,
$78a784dc, $b69ba84b, $04046793, $23db5c1e,
$46cae1d6, $2fe28134, $5a223942, $1863cd5b,
$c190c6e3, $07dfb846, $6eb88816, $2d0dcc4a,
$a4ccae59, $3798670d, $cbfa9493, $4f481d45,
$eafc8ca8, $db1129d6, $b0449e20, $0f5407fb,
$6167d9a8, $d1f45763, $4daa96c3, $3bec5958,
$ababa014, $b6ccd201, $38d6279f, $02682215,
$8f376cd5, $092c237e, $bfc56593, $32889d2c,
$854b3e95, $05bb9b43, $7dcd5dcd, $a02e926c,
$fae527e5, $36a1c330, $3412e1ae, $f257f462,
$3c4f1d71, $30a2e809, $68e5f551, $9c61ba44,
$5ded0ab8, $75ce09c8, $9654f93e, $698c0cca,
$243cb3e4, $2b062b97, $0f3b8d9e, $00e050df,
$fc5d6166, $e35f9288, $c079550d, $0591aee8,
$8e531e74, $75fe3578, $2f6d829a, $f60b21ae,
$95e8eb8d, $6699486b, $901d7d9b, $fd6d6e31,
$1090acef, $e0670dd8, $dab2e692, $cd6d4365,
$e5393514, $3af345f0, $6241fc4d, $460da3a3,
$7bcf3729, $8bf1d1e0, $14aac070, $1587ed55,
$3afd7d3e, $d2f29e01, $29a9d1f6, $efb10c53,
$cf3b870f, $b414935c, $664465ed, $024acac7,
$59a744c1, $1d2936a7, $dc580aa6, $cf574ca8,
$040a7a10, $6cd81807, $8a98be4c, $accea063,
$c33e92b5, $d1e0e03d, $b322517e, $2092bd13,
$386b2c4a, $52e8dd58, $58656dfb, $50820371,
$41811896, $e337ef7e, $d39fb119, $c97f0df6,
$68fea01b, $a150a6e5, $55258962, $eb6ff41b,
$d7c9cd7a, $a619cd9e, $bcf09576, $2672c073,
$f003fb3c, $4ab7a50b, $1484126a, $487ba9b1,
$a64fc9c6, $f6957d49, $38b06a75, $dd805fcd,
$63d094cf, $f51c999e, $1aa4d343, $b8495294,
$ce9f8e99, $bffcd770, $c7c275cc, $378453a7,
$7b21be33, $397f41bd, $4e94d131, $92cc1f98,
$5915ea51, $99f861b7, $c9980a88, $1d74fd5f,
$b0a495f8, $614deed0, $b5778eea, $5941792d,
$fa90c1f8, $33f824b4, $c4965372, $3ff6d550,
$4ca5fec0, $8630e964, $5b3fbbd6, $7da26a48,
$b203231a, $04297514, $2d639306, $2eb13149,
$16a45272, $532459a0, $8e5f4872, $f966c7d9,
$07128dc0, $0d44db62, $afc8d52d, $06316131,
$d838e7ce, $1bc41d00, $3a2e8c0f, $ea83837e,
$b984737d, $13ba4891, $c4f8b949, $a6d6acb3,
$a215cdce, $8359838b, $6bd1aa31, $f579dd52,
$21b93f93, $f5176781, $187dfdde, $e94aeb76,
$2b38fd54, $431de1da, $ab394825, $9ad3048f,
$dfea32aa, $659473e3, $623f7863, $f3346c59,
$ab3ab685, $3346a90b, $6b56443e, $c6de01f8,
$8d421fc0, $9b0ed10c, $88f1a1e9, $54c1f029,
$7dead57b, $8d7ba426, $4cf5178a, $551a7cca,
$1a9a5f08, $fcd651b9, $25605182, $e11fc6c3,
$b6fd9676, $337b3027, $b7c8eb14, $9e5fd030,
$6b57e354, $ad913cf7, $7e16688d, $58872a69,
$2c2fc7df, $e389ccc6, $30738df1, $0824a734,
$e1797a8b, $a4a8d57b, $5b5d193b, $c8a8309b,
$73f9a978, $73398d32, $0f59573e, $e9df2b03,
$e8a5b6c8, $848d0704, $98df93c2, $720a1dc3,
$684f259a, $943ba848, $a6370152, $863b5ea3,
$d17b978b, $6d9b58ef, $0a700dd4, $a73d36bf,
$8e6a0829, $8695bc14, $e35b3447, $933ac568,
$8894b022, $2f511c27, $ddfbcc3c, $006662b6,
$117c83fe, $4e12b414, $c2bca766, $3a2fec10,
$f4562420, $55792e2a, $46f5d857, $ceda25ce,
$c3601d3b, $6c00ab46, $efac9c28, $b3c35047,
$611dfee3, $257c3207, $fdd58482, $3b14d84f,
$23becb64, $a075f3a3, $088f8ead, $07adf158,
$7796943c, $facabf3d, $c09730cd, $f7679969,
$da44e9ed, $2c854c12, $35935fa3, $2f057d9f,
$690624f8, $1cb0bafd, $7b0dbdc6, $810f23bb,
$fa929a1a, $6d969a17, $6742979b, $74ac7d05,
$010e65c4, $86a3d963, $f907b5a0, $d0042bd3,
$158d7d03, $287a8255, $bba8366f, $096edc33,
$21916a7b, $77b56b86, $951622f9, $a6c5e650,
$8cea17d1, $cd8c62bc, $a3d63433, $358a68fd,
$0f9b9d3c, $d6aa295b, $fe33384a, $c000738e,
$cd67eb2f, $e2eb6dc2, $97338b02, $06c9f246,
$419cf1ad, $2b83c045, $3723f18a, $cb5b3089,
$160bead7, $5d494656, $35f8a74b, $1e4e6c9e,
$000399bd, $67466880, $b4174831, $acf423b2,
$ca815ab3, $5a6395e7, $302a67c5, $8bdb446b,
$108f8fa4, $10223eda, $92b8b48b, $7f38d0ee,
$ab2701d4, $0262d415, $af224a30, $b3d88aba,
$f8b2c3af, $daf7ef70, $cc97d3b7, $e9614b6c,
$2baebff4, $70f687cf, $386c9156, $ce092ee5,
$01e87da6, $6ce91e6a, $bb7bcc84, $c7922c20,
$9d3b71fd, $060e41c6, $d7590f15, $4e03bb47,
$183c198e, $63eeb240, $2ddbf49a, $6d5cba54,
$923750af, $f9e14236, $7838162b, $59726c72,
$81b66760, $bb2926c1, $48a0ce0d, $a6c0496d,
$ad43507b, $718d496a, $9df057af, $44b1bde6,
$054356dc, $de7ced35, $d51a138b, $62088cc9,
$35830311, $c96efca2, $686f86ec, $8e77cb68,
$63e1d6b8, $c80f9778, $79c491fd, $1b4c67f2,
$72698d7d, $5e368c31, $f7d95e2e, $a1d3493f,
$dcd9433e, $896f1552, $4bc4ca7a, $a6d1baf4,
$a5a96dcc, $0bef8b46, $a169fda7, $74df40b7,
$4e208804, $9a756607, $038e87c8, $20211e44,
$8b7ad4bf, $c6403f35, $1848e36d, $80bdb038,
$1e62891c, $643d2107, $bf04d6f8, $21092c8c,
$f644f389, $0778404e, $7b78adb8, $a2c52d53,
$42157abe, $a2253e2e, $7bf3f4ae, $80f594f9,
$953194e7, $77eb92ed, $b3816930, $da8d9336,
$bf447469, $f26d9483, $ee6faed5, $71371235,
$de425f73, $b4e59f43, $7dbe2d4e, $2d37b185,
$49dc9a63, $98c39d98, $1301c9a2, $389b1bbf,
$0c18588d, $a421c1ba, $7aa3865c, $71e08558,
$3c5cfcaa, $7d239ca4, $0297d9dd, $d7dc2830,
$4b37802b, $7428ab54, $aeee0347, $4b3fbb85,
$692f2f08, $134e578e, $36d9e0bf, $ae8b5fcf,
$edb93ecf, $2b27248e, $170eb1ef, $7dc57fd6,
$1e760f16, $b1136601, $864e1b9b, $d7ea7319,
$3ab871bd, $cfa4d76f, $e31bd782, $0dbeb469,
$abb96061, $5370f85d, $ffb07e37, $da30d0fb,
$ebc977b6, $0b98b40f, $3a4d0fe6, $df4fc26b,
$159cf22a, $c298d6e2, $2b78ef6a, $61a94ac0,
$ab561187, $14eea0f0, $df0d4164, $19af70ee);
vk: array[0..6] of DWord= (
$09d0c479, $28c8ffe0, $84aa6c39, $9dad7287, $7dff9be3, $d4268361,
$c96da1d4);
type
PMars = ^TMars;
TMars = object(TBlockCipher128)
protected
KeyData: array[0..39] of DWord;
public
procedure InitKey(const Key; Size: longword); virtual;
procedure Burn; virtual;
procedure EncryptECB(const InData; var OutData); virtual;
procedure DecryptECB(const InData; var OutData); virtual;
destructor Destroy; virtual;
end;
// Rijndael cipher implementation
const
MAXBC= 8;
MAXKC= 8;
S: array[0..255] of byte= (
99, 124, 119, 123, 242, 107, 111, 197, 48, 1, 103, 43, 254, 215, 171, 118,
202, 130, 201, 125, 250, 89, 71, 240, 173, 212, 162, 175, 156, 164, 114, 192,
183, 253, 147, 38, 54, 63, 247, 204, 52, 165, 229, 241, 113, 216, 49, 21,
4, 199, 35, 195, 24, 150, 5, 154, 7, 18, 128, 226, 235, 39, 178, 117,
9, 131, 44, 26, 27, 110, 90, 160, 82, 59, 214, 179, 41, 227, 47, 132,
83, 209, 0, 237, 32, 252, 177, 91, 106, 203, 190, 57, 74, 76, 88, 207,
208, 239, 170, 251, 67, 77, 51, 133, 69, 249, 2, 127, 80, 60, 159, 168,
81, 163, 64, 143, 146, 157, 56, 245, 188, 182, 218, 33, 16, 255, 243, 210,
205, 12, 19, 236, 95, 151, 68, 23, 196, 167, 126, 61, 100, 93, 25, 115,
96, 129, 79, 220, 34, 42, 144, 136, 70, 238, 184, 20, 222, 94, 11, 219,
224, 50, 58, 10, 73, 6, 36, 92, 194, 211, 172, 98, 145, 149, 228, 121,
231, 200, 55, 109, 141, 213, 78, 169, 108, 86, 244, 234, 101, 122, 174, 8,
186, 120, 37, 46, 28, 166, 180, 198, 232, 221, 116, 31, 75, 189, 139, 138,
112, 62, 181, 102, 72, 3, 246, 14, 97, 53, 87, 185, 134, 193, 29, 158,
225, 248, 152, 17, 105, 217, 142, 148, 155, 30, 135, 233, 206, 85, 40, 223,
140, 161, 137, 13, 191, 230, 66, 104, 65, 153, 45, 15, 176, 84, 187, 22);
T1: array[0..255,0..3] of byte= (
($c6,$63,$63,$a5), ($f8,$7c,$7c,$84), ($ee,$77,$77,$99), ($f6,$7b,$7b,$8d),
($ff,$f2,$f2,$0d), ($d6,$6b,$6b,$bd), ($de,$6f,$6f,$b1), ($91,$c5,$c5,$54),
($60,$30,$30,$50), ($02,$01,$01,$03), ($ce,$67,$67,$a9), ($56,$2b,$2b,$7d),
($e7,$fe,$fe,$19), ($b5,$d7,$d7,$62), ($4d,$ab,$ab,$e6), ($ec,$76,$76,$9a),
($8f,$ca,$ca,$45), ($1f,$82,$82,$9d), ($89,$c9,$c9,$40), ($fa,$7d,$7d,$87),
($ef,$fa,$fa,$15), ($b2,$59,$59,$eb), ($8e,$47,$47,$c9), ($fb,$f0,$f0,$0b),
($41,$ad,$ad,$ec), ($b3,$d4,$d4,$67), ($5f,$a2,$a2,$fd), ($45,$af,$af,$ea),
($23,$9c,$9c,$bf), ($53,$a4,$a4,$f7), ($e4,$72,$72,$96), ($9b,$c0,$c0,$5b),
($75,$b7,$b7,$c2), ($e1,$fd,$fd,$1c), ($3d,$93,$93,$ae), ($4c,$26,$26,$6a),
($6c,$36,$36,$5a), ($7e,$3f,$3f,$41), ($f5,$f7,$f7,$02), ($83,$cc,$cc,$4f),
($68,$34,$34,$5c), ($51,$a5,$a5,$f4), ($d1,$e5,$e5,$34), ($f9,$f1,$f1,$08),
($e2,$71,$71,$93), ($ab,$d8,$d8,$73), ($62,$31,$31,$53), ($2a,$15,$15,$3f),
($08,$04,$04,$0c), ($95,$c7,$c7,$52), ($46,$23,$23,$65), ($9d,$c3,$c3,$5e),
($30,$18,$18,$28), ($37,$96,$96,$a1), ($0a,$05,$05,$0f), ($2f,$9a,$9a,$b5),
($0e,$07,$07,$09), ($24,$12,$12,$36), ($1b,$80,$80,$9b), ($df,$e2,$e2,$3d),
($cd,$eb,$eb,$26), ($4e,$27,$27,$69), ($7f,$b2,$b2,$cd), ($ea,$75,$75,$9f),
($12,$09,$09,$1b), ($1d,$83,$83,$9e), ($58,$2c,$2c,$74), ($34,$1a,$1a,$2e),
($36,$1b,$1b,$2d), ($dc,$6e,$6e,$b2), ($b4,$5a,$5a,$ee), ($5b,$a0,$a0,$fb),
($a4,$52,$52,$f6), ($76,$3b,$3b,$4d), ($b7,$d6,$d6,$61), ($7d,$b3,$b3,$ce),
($52,$29,$29,$7b), ($dd,$e3,$e3,$3e), ($5e,$2f,$2f,$71), ($13,$84,$84,$97),
($a6,$53,$53,$f5), ($b9,$d1,$d1,$68), ($00,$00,$00,$00), ($c1,$ed,$ed,$2c),
($40,$20,$20,$60), ($e3,$fc,$fc,$1f), ($79,$b1,$b1,$c8), ($b6,$5b,$5b,$ed),
($d4,$6a,$6a,$be), ($8d,$cb,$cb,$46), ($67,$be,$be,$d9), ($72,$39,$39,$4b),
($94,$4a,$4a,$de), ($98,$4c,$4c,$d4), ($b0,$58,$58,$e8), ($85,$cf,$cf,$4a),
($bb,$d0,$d0,$6b), ($c5,$ef,$ef,$2a), ($4f,$aa,$aa,$e5), ($ed,$fb,$fb,$16),
($86,$43,$43,$c5), ($9a,$4d,$4d,$d7), ($66,$33,$33,$55), ($11,$85,$85,$94),
($8a,$45,$45,$cf), ($e9,$f9,$f9,$10), ($04,$02,$02,$06), ($fe,$7f,$7f,$81),
($a0,$50,$50,$f0), ($78,$3c,$3c,$44), ($25,$9f,$9f,$ba), ($4b,$a8,$a8,$e3),
($a2,$51,$51,$f3), ($5d,$a3,$a3,$fe), ($80,$40,$40,$c0), ($05,$8f,$8f,$8a),
($3f,$92,$92,$ad), ($21,$9d,$9d,$bc), ($70,$38,$38,$48), ($f1,$f5,$f5,$04),
($63,$bc,$bc,$df), ($77,$b6,$b6,$c1), ($af,$da,$da,$75), ($42,$21,$21,$63),
($20,$10,$10,$30), ($e5,$ff,$ff,$1a), ($fd,$f3,$f3,$0e), ($bf,$d2,$d2,$6d),
($81,$cd,$cd,$4c), ($18,$0c,$0c,$14), ($26,$13,$13,$35), ($c3,$ec,$ec,$2f),
($be,$5f,$5f,$e1), ($35,$97,$97,$a2), ($88,$44,$44,$cc), ($2e,$17,$17,$39),
($93,$c4,$c4,$57), ($55,$a7,$a7,$f2), ($fc,$7e,$7e,$82), ($7a,$3d,$3d,$47),
($c8,$64,$64,$ac), ($ba,$5d,$5d,$e7), ($32,$19,$19,$2b), ($e6,$73,$73,$95),
($c0,$60,$60,$a0), ($19,$81,$81,$98), ($9e,$4f,$4f,$d1), ($a3,$dc,$dc,$7f),
($44,$22,$22,$66), ($54,$2a,$2a,$7e), ($3b,$90,$90,$ab), ($0b,$88,$88,$83),
($8c,$46,$46,$ca), ($c7,$ee,$ee,$29), ($6b,$b8,$b8,$d3), ($28,$14,$14,$3c),
($a7,$de,$de,$79), ($bc,$5e,$5e,$e2), ($16,$0b,$0b,$1d), ($ad,$db,$db,$76),
($db,$e0,$e0,$3b), ($64,$32,$32,$56), ($74,$3a,$3a,$4e), ($14,$0a,$0a,$1e),
($92,$49,$49,$db), ($0c,$06,$06,$0a), ($48,$24,$24,$6c), ($b8,$5c,$5c,$e4),
($9f,$c2,$c2,$5d), ($bd,$d3,$d3,$6e), ($43,$ac,$ac,$ef), ($c4,$62,$62,$a6),
($39,$91,$91,$a8), ($31,$95,$95,$a4), ($d3,$e4,$e4,$37), ($f2,$79,$79,$8b),
($d5,$e7,$e7,$32), ($8b,$c8,$c8,$43), ($6e,$37,$37,$59), ($da,$6d,$6d,$b7),
($01,$8d,$8d,$8c), ($b1,$d5,$d5,$64), ($9c,$4e,$4e,$d2), ($49,$a9,$a9,$e0),
($d8,$6c,$6c,$b4), ($ac,$56,$56,$fa), ($f3,$f4,$f4,$07), ($cf,$ea,$ea,$25),
($ca,$65,$65,$af), ($f4,$7a,$7a,$8e), ($47,$ae,$ae,$e9), ($10,$08,$08,$18),
($6f,$ba,$ba,$d5), ($f0,$78,$78,$88), ($4a,$25,$25,$6f), ($5c,$2e,$2e,$72),
($38,$1c,$1c,$24), ($57,$a6,$a6,$f1), ($73,$b4,$b4,$c7), ($97,$c6,$c6,$51),
($cb,$e8,$e8,$23), ($a1,$dd,$dd,$7c), ($e8,$74,$74,$9c), ($3e,$1f,$1f,$21),
($96,$4b,$4b,$dd), ($61,$bd,$bd,$dc), ($0d,$8b,$8b,$86), ($0f,$8a,$8a,$85),
($e0,$70,$70,$90), ($7c,$3e,$3e,$42), ($71,$b5,$b5,$c4), ($cc,$66,$66,$aa),
($90,$48,$48,$d8), ($06,$03,$03,$05), ($f7,$f6,$f6,$01), ($1c,$0e,$0e,$12),
($c2,$61,$61,$a3), ($6a,$35,$35,$5f), ($ae,$57,$57,$f9), ($69,$b9,$b9,$d0),
($17,$86,$86,$91), ($99,$c1,$c1,$58), ($3a,$1d,$1d,$27), ($27,$9e,$9e,$b9),
($d9,$e1,$e1,$38), ($eb,$f8,$f8,$13), ($2b,$98,$98,$b3), ($22,$11,$11,$33),
($d2,$69,$69,$bb), ($a9,$d9,$d9,$70), ($07,$8e,$8e,$89), ($33,$94,$94,$a7),
($2d,$9b,$9b,$b6), ($3c,$1e,$1e,$22), ($15,$87,$87,$92), ($c9,$e9,$e9,$20),
($87,$ce,$ce,$49), ($aa,$55,$55,$ff), ($50,$28,$28,$78), ($a5,$df,$df,$7a),
($03,$8c,$8c,$8f), ($59,$a1,$a1,$f8), ($09,$89,$89,$80), ($1a,$0d,$0d,$17),
($65,$bf,$bf,$da), ($d7,$e6,$e6,$31), ($84,$42,$42,$c6), ($d0,$68,$68,$b8),
($82,$41,$41,$c3), ($29,$99,$99,$b0), ($5a,$2d,$2d,$77), ($1e,$0f,$0f,$11),
($7b,$b0,$b0,$cb), ($a8,$54,$54,$fc), ($6d,$bb,$bb,$d6), ($2c,$16,$16,$3a));
T2: array[0..255,0..3] of byte= (
($a5,$c6,$63,$63), ($84,$f8,$7c,$7c), ($99,$ee,$77,$77), ($8d,$f6,$7b,$7b),
($0d,$ff,$f2,$f2), ($bd,$d6,$6b,$6b), ($b1,$de,$6f,$6f), ($54,$91,$c5,$c5),
($50,$60,$30,$30), ($03,$02,$01,$01), ($a9,$ce,$67,$67), ($7d,$56,$2b,$2b),
($19,$e7,$fe,$fe), ($62,$b5,$d7,$d7), ($e6,$4d,$ab,$ab), ($9a,$ec,$76,$76),
($45,$8f,$ca,$ca), ($9d,$1f,$82,$82), ($40,$89,$c9,$c9), ($87,$fa,$7d,$7d),
($15,$ef,$fa,$fa), ($eb,$b2,$59,$59), ($c9,$8e,$47,$47), ($0b,$fb,$f0,$f0),
($ec,$41,$ad,$ad), ($67,$b3,$d4,$d4), ($fd,$5f,$a2,$a2), ($ea,$45,$af,$af),
($bf,$23,$9c,$9c), ($f7,$53,$a4,$a4), ($96,$e4,$72,$72), ($5b,$9b,$c0,$c0),
($c2,$75,$b7,$b7), ($1c,$e1,$fd,$fd), ($ae,$3d,$93,$93), ($6a,$4c,$26,$26),
($5a,$6c,$36,$36), ($41,$7e,$3f,$3f), ($02,$f5,$f7,$f7), ($4f,$83,$cc,$cc),
($5c,$68,$34,$34), ($f4,$51,$a5,$a5), ($34,$d1,$e5,$e5), ($08,$f9,$f1,$f1),
($93,$e2,$71,$71), ($73,$ab,$d8,$d8), ($53,$62,$31,$31), ($3f,$2a,$15,$15),
($0c,$08,$04,$04), ($52,$95,$c7,$c7), ($65,$46,$23,$23), ($5e,$9d,$c3,$c3),
($28,$30,$18,$18), ($a1,$37,$96,$96), ($0f,$0a,$05,$05), ($b5,$2f,$9a,$9a),
($09,$0e,$07,$07), ($36,$24,$12,$12), ($9b,$1b,$80,$80), ($3d,$df,$e2,$e2),
($26,$cd,$eb,$eb), ($69,$4e,$27,$27), ($cd,$7f,$b2,$b2), ($9f,$ea,$75,$75),
($1b,$12,$09,$09), ($9e,$1d,$83,$83), ($74,$58,$2c,$2c), ($2e,$34,$1a,$1a),
($2d,$36,$1b,$1b), ($b2,$dc,$6e,$6e), ($ee,$b4,$5a,$5a), ($fb,$5b,$a0,$a0),
($f6,$a4,$52,$52), ($4d,$76,$3b,$3b), ($61,$b7,$d6,$d6), ($ce,$7d,$b3,$b3),
($7b,$52,$29,$29), ($3e,$dd,$e3,$e3), ($71,$5e,$2f,$2f), ($97,$13,$84,$84),
($f5,$a6,$53,$53), ($68,$b9,$d1,$d1), ($00,$00,$00,$00), ($2c,$c1,$ed,$ed),
($60,$40,$20,$20), ($1f,$e3,$fc,$fc), ($c8,$79,$b1,$b1), ($ed,$b6,$5b,$5b),
($be,$d4,$6a,$6a), ($46,$8d,$cb,$cb), ($d9,$67,$be,$be), ($4b,$72,$39,$39),
($de,$94,$4a,$4a), ($d4,$98,$4c,$4c), ($e8,$b0,$58,$58), ($4a,$85,$cf,$cf),
($6b,$bb,$d0,$d0), ($2a,$c5,$ef,$ef), ($e5,$4f,$aa,$aa), ($16,$ed,$fb,$fb),
($c5,$86,$43,$43), ($d7,$9a,$4d,$4d), ($55,$66,$33,$33), ($94,$11,$85,$85),
($cf,$8a,$45,$45), ($10,$e9,$f9,$f9), ($06,$04,$02,$02), ($81,$fe,$7f,$7f),
($f0,$a0,$50,$50), ($44,$78,$3c,$3c), ($ba,$25,$9f,$9f), ($e3,$4b,$a8,$a8),
($f3,$a2,$51,$51), ($fe,$5d,$a3,$a3), ($c0,$80,$40,$40), ($8a,$05,$8f,$8f),
($ad,$3f,$92,$92), ($bc,$21,$9d,$9d), ($48,$70,$38,$38), ($04,$f1,$f5,$f5),
($df,$63,$bc,$bc), ($c1,$77,$b6,$b6), ($75,$af,$da,$da), ($63,$42,$21,$21),
($30,$20,$10,$10), ($1a,$e5,$ff,$ff), ($0e,$fd,$f3,$f3), ($6d,$bf,$d2,$d2),
($4c,$81,$cd,$cd), ($14,$18,$0c,$0c), ($35,$26,$13,$13), ($2f,$c3,$ec,$ec),
($e1,$be,$5f,$5f), ($a2,$35,$97,$97), ($cc,$88,$44,$44), ($39,$2e,$17,$17),
($57,$93,$c4,$c4), ($f2,$55,$a7,$a7), ($82,$fc,$7e,$7e), ($47,$7a,$3d,$3d),
($ac,$c8,$64,$64), ($e7,$ba,$5d,$5d), ($2b,$32,$19,$19), ($95,$e6,$73,$73),
($a0,$c0,$60,$60), ($98,$19,$81,$81), ($d1,$9e,$4f,$4f), ($7f,$a3,$dc,$dc),
($66,$44,$22,$22), ($7e,$54,$2a,$2a), ($ab,$3b,$90,$90), ($83,$0b,$88,$88),
($ca,$8c,$46,$46), ($29,$c7,$ee,$ee), ($d3,$6b,$b8,$b8), ($3c,$28,$14,$14),
($79,$a7,$de,$de), ($e2,$bc,$5e,$5e), ($1d,$16,$0b,$0b), ($76,$ad,$db,$db),
($3b,$db,$e0,$e0), ($56,$64,$32,$32), ($4e,$74,$3a,$3a), ($1e,$14,$0a,$0a),
($db,$92,$49,$49), ($0a,$0c,$06,$06), ($6c,$48,$24,$24), ($e4,$b8,$5c,$5c),
($5d,$9f,$c2,$c2), ($6e,$bd,$d3,$d3), ($ef,$43,$ac,$ac), ($a6,$c4,$62,$62),
($a8,$39,$91,$91), ($a4,$31,$95,$95), ($37,$d3,$e4,$e4), ($8b,$f2,$79,$79),
($32,$d5,$e7,$e7), ($43,$8b,$c8,$c8), ($59,$6e,$37,$37), ($b7,$da,$6d,$6d),
($8c,$01,$8d,$8d), ($64,$b1,$d5,$d5), ($d2,$9c,$4e,$4e), ($e0,$49,$a9,$a9),
($b4,$d8,$6c,$6c), ($fa,$ac,$56,$56), ($07,$f3,$f4,$f4), ($25,$cf,$ea,$ea),
($af,$ca,$65,$65), ($8e,$f4,$7a,$7a), ($e9,$47,$ae,$ae), ($18,$10,$08,$08),
($d5,$6f,$ba,$ba), ($88,$f0,$78,$78), ($6f,$4a,$25,$25), ($72,$5c,$2e,$2e),
($24,$38,$1c,$1c), ($f1,$57,$a6,$a6), ($c7,$73,$b4,$b4), ($51,$97,$c6,$c6),
($23,$cb,$e8,$e8), ($7c,$a1,$dd,$dd), ($9c,$e8,$74,$74), ($21,$3e,$1f,$1f),
($dd,$96,$4b,$4b), ($dc,$61,$bd,$bd), ($86,$0d,$8b,$8b), ($85,$0f,$8a,$8a),
($90,$e0,$70,$70), ($42,$7c,$3e,$3e), ($c4,$71,$b5,$b5), ($aa,$cc,$66,$66),
($d8,$90,$48,$48), ($05,$06,$03,$03), ($01,$f7,$f6,$f6), ($12,$1c,$0e,$0e),
($a3,$c2,$61,$61), ($5f,$6a,$35,$35), ($f9,$ae,$57,$57), ($d0,$69,$b9,$b9),
($91,$17,$86,$86), ($58,$99,$c1,$c1), ($27,$3a,$1d,$1d), ($b9,$27,$9e,$9e),
($38,$d9,$e1,$e1), ($13,$eb,$f8,$f8), ($b3,$2b,$98,$98), ($33,$22,$11,$11),
($bb,$d2,$69,$69), ($70,$a9,$d9,$d9), ($89,$07,$8e,$8e), ($a7,$33,$94,$94),
($b6,$2d,$9b,$9b), ($22,$3c,$1e,$1e), ($92,$15,$87,$87), ($20,$c9,$e9,$e9),
($49,$87,$ce,$ce), ($ff,$aa,$55,$55), ($78,$50,$28,$28), ($7a,$a5,$df,$df),
($8f,$03,$8c,$8c), ($f8,$59,$a1,$a1), ($80,$09,$89,$89), ($17,$1a,$0d,$0d),
($da,$65,$bf,$bf), ($31,$d7,$e6,$e6), ($c6,$84,$42,$42), ($b8,$d0,$68,$68),
($c3,$82,$41,$41), ($b0,$29,$99,$99), ($77,$5a,$2d,$2d), ($11,$1e,$0f,$0f),
($cb,$7b,$b0,$b0), ($fc,$a8,$54,$54), ($d6,$6d,$bb,$bb), ($3a,$2c,$16,$16));
T3: array[0..255,0..3] of byte= (
($63,$a5,$c6,$63), ($7c,$84,$f8,$7c), ($77,$99,$ee,$77), ($7b,$8d,$f6,$7b),
($f2,$0d,$ff,$f2), ($6b,$bd,$d6,$6b), ($6f,$b1,$de,$6f), ($c5,$54,$91,$c5),
($30,$50,$60,$30), ($01,$03,$02,$01), ($67,$a9,$ce,$67), ($2b,$7d,$56,$2b),
($fe,$19,$e7,$fe), ($d7,$62,$b5,$d7), ($ab,$e6,$4d,$ab), ($76,$9a,$ec,$76),
($ca,$45,$8f,$ca), ($82,$9d,$1f,$82), ($c9,$40,$89,$c9), ($7d,$87,$fa,$7d),
($fa,$15,$ef,$fa), ($59,$eb,$b2,$59), ($47,$c9,$8e,$47), ($f0,$0b,$fb,$f0),
($ad,$ec,$41,$ad), ($d4,$67,$b3,$d4), ($a2,$fd,$5f,$a2), ($af,$ea,$45,$af),
($9c,$bf,$23,$9c), ($a4,$f7,$53,$a4), ($72,$96,$e4,$72), ($c0,$5b,$9b,$c0),
($b7,$c2,$75,$b7), ($fd,$1c,$e1,$fd), ($93,$ae,$3d,$93), ($26,$6a,$4c,$26),
($36,$5a,$6c,$36), ($3f,$41,$7e,$3f), ($f7,$02,$f5,$f7), ($cc,$4f,$83,$cc),
($34,$5c,$68,$34), ($a5,$f4,$51,$a5), ($e5,$34,$d1,$e5), ($f1,$08,$f9,$f1),
($71,$93,$e2,$71), ($d8,$73,$ab,$d8), ($31,$53,$62,$31), ($15,$3f,$2a,$15),
($04,$0c,$08,$04), ($c7,$52,$95,$c7), ($23,$65,$46,$23), ($c3,$5e,$9d,$c3),
($18,$28,$30,$18), ($96,$a1,$37,$96), ($05,$0f,$0a,$05), ($9a,$b5,$2f,$9a),
($07,$09,$0e,$07), ($12,$36,$24,$12), ($80,$9b,$1b,$80), ($e2,$3d,$df,$e2),
($eb,$26,$cd,$eb), ($27,$69,$4e,$27), ($b2,$cd,$7f,$b2), ($75,$9f,$ea,$75),
($09,$1b,$12,$09), ($83,$9e,$1d,$83), ($2c,$74,$58,$2c), ($1a,$2e,$34,$1a),
($1b,$2d,$36,$1b), ($6e,$b2,$dc,$6e), ($5a,$ee,$b4,$5a), ($a0,$fb,$5b,$a0),
($52,$f6,$a4,$52), ($3b,$4d,$76,$3b), ($d6,$61,$b7,$d6), ($b3,$ce,$7d,$b3),
($29,$7b,$52,$29), ($e3,$3e,$dd,$e3), ($2f,$71,$5e,$2f), ($84,$97,$13,$84),
($53,$f5,$a6,$53), ($d1,$68,$b9,$d1), ($00,$00,$00,$00), ($ed,$2c,$c1,$ed),
($20,$60,$40,$20), ($fc,$1f,$e3,$fc), ($b1,$c8,$79,$b1), ($5b,$ed,$b6,$5b),
($6a,$be,$d4,$6a), ($cb,$46,$8d,$cb), ($be,$d9,$67,$be), ($39,$4b,$72,$39),
($4a,$de,$94,$4a), ($4c,$d4,$98,$4c), ($58,$e8,$b0,$58), ($cf,$4a,$85,$cf),
($d0,$6b,$bb,$d0), ($ef,$2a,$c5,$ef), ($aa,$e5,$4f,$aa), ($fb,$16,$ed,$fb),
($43,$c5,$86,$43), ($4d,$d7,$9a,$4d), ($33,$55,$66,$33), ($85,$94,$11,$85),
($45,$cf,$8a,$45), ($f9,$10,$e9,$f9), ($02,$06,$04,$02), ($7f,$81,$fe,$7f),
($50,$f0,$a0,$50), ($3c,$44,$78,$3c), ($9f,$ba,$25,$9f), ($a8,$e3,$4b,$a8),
($51,$f3,$a2,$51), ($a3,$fe,$5d,$a3), ($40,$c0,$80,$40), ($8f,$8a,$05,$8f),
($92,$ad,$3f,$92), ($9d,$bc,$21,$9d), ($38,$48,$70,$38), ($f5,$04,$f1,$f5),
($bc,$df,$63,$bc), ($b6,$c1,$77,$b6), ($da,$75,$af,$da), ($21,$63,$42,$21),
($10,$30,$20,$10), ($ff,$1a,$e5,$ff), ($f3,$0e,$fd,$f3), ($d2,$6d,$bf,$d2),
($cd,$4c,$81,$cd), ($0c,$14,$18,$0c), ($13,$35,$26,$13), ($ec,$2f,$c3,$ec),
($5f,$e1,$be,$5f), ($97,$a2,$35,$97), ($44,$cc,$88,$44), ($17,$39,$2e,$17),
($c4,$57,$93,$c4), ($a7,$f2,$55,$a7), ($7e,$82,$fc,$7e), ($3d,$47,$7a,$3d),
($64,$ac,$c8,$64), ($5d,$e7,$ba,$5d), ($19,$2b,$32,$19), ($73,$95,$e6,$73),
($60,$a0,$c0,$60), ($81,$98,$19,$81), ($4f,$d1,$9e,$4f), ($dc,$7f,$a3,$dc),
($22,$66,$44,$22), ($2a,$7e,$54,$2a), ($90,$ab,$3b,$90), ($88,$83,$0b,$88),
($46,$ca,$8c,$46), ($ee,$29,$c7,$ee), ($b8,$d3,$6b,$b8), ($14,$3c,$28,$14),
($de,$79,$a7,$de), ($5e,$e2,$bc,$5e), ($0b,$1d,$16,$0b), ($db,$76,$ad,$db),
($e0,$3b,$db,$e0), ($32,$56,$64,$32), ($3a,$4e,$74,$3a), ($0a,$1e,$14,$0a),
($49,$db,$92,$49), ($06,$0a,$0c,$06), ($24,$6c,$48,$24), ($5c,$e4,$b8,$5c),
($c2,$5d,$9f,$c2), ($d3,$6e,$bd,$d3), ($ac,$ef,$43,$ac), ($62,$a6,$c4,$62),
($91,$a8,$39,$91), ($95,$a4,$31,$95), ($e4,$37,$d3,$e4), ($79,$8b,$f2,$79),
($e7,$32,$d5,$e7), ($c8,$43,$8b,$c8), ($37,$59,$6e,$37), ($6d,$b7,$da,$6d),
($8d,$8c,$01,$8d), ($d5,$64,$b1,$d5), ($4e,$d2,$9c,$4e), ($a9,$e0,$49,$a9),
($6c,$b4,$d8,$6c), ($56,$fa,$ac,$56), ($f4,$07,$f3,$f4), ($ea,$25,$cf,$ea),
($65,$af,$ca,$65), ($7a,$8e,$f4,$7a), ($ae,$e9,$47,$ae), ($08,$18,$10,$08),
($ba,$d5,$6f,$ba), ($78,$88,$f0,$78), ($25,$6f,$4a,$25), ($2e,$72,$5c,$2e),
($1c,$24,$38,$1c), ($a6,$f1,$57,$a6), ($b4,$c7,$73,$b4), ($c6,$51,$97,$c6),
($e8,$23,$cb,$e8), ($dd,$7c,$a1,$dd), ($74,$9c,$e8,$74), ($1f,$21,$3e,$1f),
($4b,$dd,$96,$4b), ($bd,$dc,$61,$bd), ($8b,$86,$0d,$8b), ($8a,$85,$0f,$8a),
($70,$90,$e0,$70), ($3e,$42,$7c,$3e), ($b5,$c4,$71,$b5), ($66,$aa,$cc,$66),
($48,$d8,$90,$48), ($03,$05,$06,$03), ($f6,$01,$f7,$f6), ($0e,$12,$1c,$0e),
($61,$a3,$c2,$61), ($35,$5f,$6a,$35), ($57,$f9,$ae,$57), ($b9,$d0,$69,$b9),
($86,$91,$17,$86), ($c1,$58,$99,$c1), ($1d,$27,$3a,$1d), ($9e,$b9,$27,$9e),
($e1,$38,$d9,$e1), ($f8,$13,$eb,$f8), ($98,$b3,$2b,$98), ($11,$33,$22,$11),
($69,$bb,$d2,$69), ($d9,$70,$a9,$d9), ($8e,$89,$07,$8e), ($94,$a7,$33,$94),
($9b,$b6,$2d,$9b), ($1e,$22,$3c,$1e), ($87,$92,$15,$87), ($e9,$20,$c9,$e9),
($ce,$49,$87,$ce), ($55,$ff,$aa,$55), ($28,$78,$50,$28), ($df,$7a,$a5,$df),
($8c,$8f,$03,$8c), ($a1,$f8,$59,$a1), ($89,$80,$09,$89), ($0d,$17,$1a,$0d),
($bf,$da,$65,$bf), ($e6,$31,$d7,$e6), ($42,$c6,$84,$42), ($68,$b8,$d0,$68),
($41,$c3,$82,$41), ($99,$b0,$29,$99), ($2d,$77,$5a,$2d), ($0f,$11,$1e,$0f),
($b0,$cb,$7b,$b0), ($54,$fc,$a8,$54), ($bb,$d6,$6d,$bb), ($16,$3a,$2c,$16));
T4: array[0..255,0..3] of byte= (
($63,$63,$a5,$c6), ($7c,$7c,$84,$f8), ($77,$77,$99,$ee), ($7b,$7b,$8d,$f6),
($f2,$f2,$0d,$ff), ($6b,$6b,$bd,$d6), ($6f,$6f,$b1,$de), ($c5,$c5,$54,$91),
($30,$30,$50,$60), ($01,$01,$03,$02), ($67,$67,$a9,$ce), ($2b,$2b,$7d,$56),
($fe,$fe,$19,$e7), ($d7,$d7,$62,$b5), ($ab,$ab,$e6,$4d), ($76,$76,$9a,$ec),
($ca,$ca,$45,$8f), ($82,$82,$9d,$1f), ($c9,$c9,$40,$89), ($7d,$7d,$87,$fa),
($fa,$fa,$15,$ef), ($59,$59,$eb,$b2), ($47,$47,$c9,$8e), ($f0,$f0,$0b,$fb),
($ad,$ad,$ec,$41), ($d4,$d4,$67,$b3), ($a2,$a2,$fd,$5f), ($af,$af,$ea,$45),
($9c,$9c,$bf,$23), ($a4,$a4,$f7,$53), ($72,$72,$96,$e4), ($c0,$c0,$5b,$9b),
($b7,$b7,$c2,$75), ($fd,$fd,$1c,$e1), ($93,$93,$ae,$3d), ($26,$26,$6a,$4c),
($36,$36,$5a,$6c), ($3f,$3f,$41,$7e), ($f7,$f7,$02,$f5), ($cc,$cc,$4f,$83),
($34,$34,$5c,$68), ($a5,$a5,$f4,$51), ($e5,$e5,$34,$d1), ($f1,$f1,$08,$f9),
($71,$71,$93,$e2), ($d8,$d8,$73,$ab), ($31,$31,$53,$62), ($15,$15,$3f,$2a),
($04,$04,$0c,$08), ($c7,$c7,$52,$95), ($23,$23,$65,$46), ($c3,$c3,$5e,$9d),
($18,$18,$28,$30), ($96,$96,$a1,$37), ($05,$05,$0f,$0a), ($9a,$9a,$b5,$2f),
($07,$07,$09,$0e), ($12,$12,$36,$24), ($80,$80,$9b,$1b), ($e2,$e2,$3d,$df),
($eb,$eb,$26,$cd), ($27,$27,$69,$4e), ($b2,$b2,$cd,$7f), ($75,$75,$9f,$ea),
($09,$09,$1b,$12), ($83,$83,$9e,$1d), ($2c,$2c,$74,$58), ($1a,$1a,$2e,$34),
($1b,$1b,$2d,$36), ($6e,$6e,$b2,$dc), ($5a,$5a,$ee,$b4), ($a0,$a0,$fb,$5b),
($52,$52,$f6,$a4), ($3b,$3b,$4d,$76), ($d6,$d6,$61,$b7), ($b3,$b3,$ce,$7d),
($29,$29,$7b,$52), ($e3,$e3,$3e,$dd), ($2f,$2f,$71,$5e), ($84,$84,$97,$13),
($53,$53,$f5,$a6), ($d1,$d1,$68,$b9), ($00,$00,$00,$00), ($ed,$ed,$2c,$c1),
($20,$20,$60,$40), ($fc,$fc,$1f,$e3), ($b1,$b1,$c8,$79), ($5b,$5b,$ed,$b6),
($6a,$6a,$be,$d4), ($cb,$cb,$46,$8d), ($be,$be,$d9,$67), ($39,$39,$4b,$72),
($4a,$4a,$de,$94), ($4c,$4c,$d4,$98), ($58,$58,$e8,$b0), ($cf,$cf,$4a,$85),
($d0,$d0,$6b,$bb), ($ef,$ef,$2a,$c5), ($aa,$aa,$e5,$4f), ($fb,$fb,$16,$ed),
($43,$43,$c5,$86), ($4d,$4d,$d7,$9a), ($33,$33,$55,$66), ($85,$85,$94,$11),
($45,$45,$cf,$8a), ($f9,$f9,$10,$e9), ($02,$02,$06,$04), ($7f,$7f,$81,$fe),
($50,$50,$f0,$a0), ($3c,$3c,$44,$78), ($9f,$9f,$ba,$25), ($a8,$a8,$e3,$4b),
($51,$51,$f3,$a2), ($a3,$a3,$fe,$5d), ($40,$40,$c0,$80), ($8f,$8f,$8a,$05),
($92,$92,$ad,$3f), ($9d,$9d,$bc,$21), ($38,$38,$48,$70), ($f5,$f5,$04,$f1),
($bc,$bc,$df,$63), ($b6,$b6,$c1,$77), ($da,$da,$75,$af), ($21,$21,$63,$42),
($10,$10,$30,$20), ($ff,$ff,$1a,$e5), ($f3,$f3,$0e,$fd), ($d2,$d2,$6d,$bf),
($cd,$cd,$4c,$81), ($0c,$0c,$14,$18), ($13,$13,$35,$26), ($ec,$ec,$2f,$c3),
($5f,$5f,$e1,$be), ($97,$97,$a2,$35), ($44,$44,$cc,$88), ($17,$17,$39,$2e),
($c4,$c4,$57,$93), ($a7,$a7,$f2,$55), ($7e,$7e,$82,$fc), ($3d,$3d,$47,$7a),
($64,$64,$ac,$c8), ($5d,$5d,$e7,$ba), ($19,$19,$2b,$32), ($73,$73,$95,$e6),
($60,$60,$a0,$c0), ($81,$81,$98,$19), ($4f,$4f,$d1,$9e), ($dc,$dc,$7f,$a3),
($22,$22,$66,$44), ($2a,$2a,$7e,$54), ($90,$90,$ab,$3b), ($88,$88,$83,$0b),
($46,$46,$ca,$8c), ($ee,$ee,$29,$c7), ($b8,$b8,$d3,$6b), ($14,$14,$3c,$28),
($de,$de,$79,$a7), ($5e,$5e,$e2,$bc), ($0b,$0b,$1d,$16), ($db,$db,$76,$ad),
($e0,$e0,$3b,$db), ($32,$32,$56,$64), ($3a,$3a,$4e,$74), ($0a,$0a,$1e,$14),
($49,$49,$db,$92), ($06,$06,$0a,$0c), ($24,$24,$6c,$48), ($5c,$5c,$e4,$b8),
($c2,$c2,$5d,$9f), ($d3,$d3,$6e,$bd), ($ac,$ac,$ef,$43), ($62,$62,$a6,$c4),
($91,$91,$a8,$39), ($95,$95,$a4,$31), ($e4,$e4,$37,$d3), ($79,$79,$8b,$f2),
($e7,$e7,$32,$d5), ($c8,$c8,$43,$8b), ($37,$37,$59,$6e), ($6d,$6d,$b7,$da),
($8d,$8d,$8c,$01), ($d5,$d5,$64,$b1), ($4e,$4e,$d2,$9c), ($a9,$a9,$e0,$49),
($6c,$6c,$b4,$d8), ($56,$56,$fa,$ac), ($f4,$f4,$07,$f3), ($ea,$ea,$25,$cf),
($65,$65,$af,$ca), ($7a,$7a,$8e,$f4), ($ae,$ae,$e9,$47), ($08,$08,$18,$10),
($ba,$ba,$d5,$6f), ($78,$78,$88,$f0), ($25,$25,$6f,$4a), ($2e,$2e,$72,$5c),
($1c,$1c,$24,$38), ($a6,$a6,$f1,$57), ($b4,$b4,$c7,$73), ($c6,$c6,$51,$97),
($e8,$e8,$23,$cb), ($dd,$dd,$7c,$a1), ($74,$74,$9c,$e8), ($1f,$1f,$21,$3e),
($4b,$4b,$dd,$96), ($bd,$bd,$dc,$61), ($8b,$8b,$86,$0d), ($8a,$8a,$85,$0f),
($70,$70,$90,$e0), ($3e,$3e,$42,$7c), ($b5,$b5,$c4,$71), ($66,$66,$aa,$cc),
($48,$48,$d8,$90), ($03,$03,$05,$06), ($f6,$f6,$01,$f7), ($0e,$0e,$12,$1c),
($61,$61,$a3,$c2), ($35,$35,$5f,$6a), ($57,$57,$f9,$ae), ($b9,$b9,$d0,$69),
($86,$86,$91,$17), ($c1,$c1,$58,$99), ($1d,$1d,$27,$3a), ($9e,$9e,$b9,$27),
($e1,$e1,$38,$d9), ($f8,$f8,$13,$eb), ($98,$98,$b3,$2b), ($11,$11,$33,$22),
($69,$69,$bb,$d2), ($d9,$d9,$70,$a9), ($8e,$8e,$89,$07), ($94,$94,$a7,$33),
($9b,$9b,$b6,$2d), ($1e,$1e,$22,$3c), ($87,$87,$92,$15), ($e9,$e9,$20,$c9),
($ce,$ce,$49,$87), ($55,$55,$ff,$aa), ($28,$28,$78,$50), ($df,$df,$7a,$a5),
($8c,$8c,$8f,$03), ($a1,$a1,$f8,$59), ($89,$89,$80,$09), ($0d,$0d,$17,$1a),
($bf,$bf,$da,$65), ($e6,$e6,$31,$d7), ($42,$42,$c6,$84), ($68,$68,$b8,$d0),
($41,$41,$c3,$82), ($99,$99,$b0,$29), ($2d,$2d,$77,$5a), ($0f,$0f,$11,$1e),
($b0,$b0,$cb,$7b), ($54,$54,$fc,$a8), ($bb,$bb,$d6,$6d), ($16,$16,$3a,$2c));
T5: array[0..255,0..3] of byte= (
($51,$f4,$a7,$50), ($7e,$41,$65,$53), ($1a,$17,$a4,$c3), ($3a,$27,$5e,$96),
($3b,$ab,$6b,$cb), ($1f,$9d,$45,$f1), ($ac,$fa,$58,$ab), ($4b,$e3,$03,$93),
($20,$30,$fa,$55), ($ad,$76,$6d,$f6), ($88,$cc,$76,$91), ($f5,$02,$4c,$25),
($4f,$e5,$d7,$fc), ($c5,$2a,$cb,$d7), ($26,$35,$44,$80), ($b5,$62,$a3,$8f),
($de,$b1,$5a,$49), ($25,$ba,$1b,$67), ($45,$ea,$0e,$98), ($5d,$fe,$c0,$e1),
($c3,$2f,$75,$02), ($81,$4c,$f0,$12), ($8d,$46,$97,$a3), ($6b,$d3,$f9,$c6),
($03,$8f,$5f,$e7), ($15,$92,$9c,$95), ($bf,$6d,$7a,$eb), ($95,$52,$59,$da),
($d4,$be,$83,$2d), ($58,$74,$21,$d3), ($49,$e0,$69,$29), ($8e,$c9,$c8,$44),
($75,$c2,$89,$6a), ($f4,$8e,$79,$78), ($99,$58,$3e,$6b), ($27,$b9,$71,$dd),
($be,$e1,$4f,$b6), ($f0,$88,$ad,$17), ($c9,$20,$ac,$66), ($7d,$ce,$3a,$b4),
($63,$df,$4a,$18), ($e5,$1a,$31,$82), ($97,$51,$33,$60), ($62,$53,$7f,$45),
($b1,$64,$77,$e0), ($bb,$6b,$ae,$84), ($fe,$81,$a0,$1c), ($f9,$08,$2b,$94),
($70,$48,$68,$58), ($8f,$45,$fd,$19), ($94,$de,$6c,$87), ($52,$7b,$f8,$b7),
($ab,$73,$d3,$23), ($72,$4b,$02,$e2), ($e3,$1f,$8f,$57), ($66,$55,$ab,$2a),
($b2,$eb,$28,$07), ($2f,$b5,$c2,$03), ($86,$c5,$7b,$9a), ($d3,$37,$08,$a5),
($30,$28,$87,$f2), ($23,$bf,$a5,$b2), ($02,$03,$6a,$ba), ($ed,$16,$82,$5c),
($8a,$cf,$1c,$2b), ($a7,$79,$b4,$92), ($f3,$07,$f2,$f0), ($4e,$69,$e2,$a1),
($65,$da,$f4,$cd), ($06,$05,$be,$d5), ($d1,$34,$62,$1f), ($c4,$a6,$fe,$8a),
($34,$2e,$53,$9d), ($a2,$f3,$55,$a0), ($05,$8a,$e1,$32), ($a4,$f6,$eb,$75),
($0b,$83,$ec,$39), ($40,$60,$ef,$aa), ($5e,$71,$9f,$06), ($bd,$6e,$10,$51),
($3e,$21,$8a,$f9), ($96,$dd,$06,$3d), ($dd,$3e,$05,$ae), ($4d,$e6,$bd,$46),
($91,$54,$8d,$b5), ($71,$c4,$5d,$05), ($04,$06,$d4,$6f), ($60,$50,$15,$ff),
($19,$98,$fb,$24), ($d6,$bd,$e9,$97), ($89,$40,$43,$cc), ($67,$d9,$9e,$77),
($b0,$e8,$42,$bd), ($07,$89,$8b,$88), ($e7,$19,$5b,$38), ($79,$c8,$ee,$db),
($a1,$7c,$0a,$47), ($7c,$42,$0f,$e9), ($f8,$84,$1e,$c9), ($00,$00,$00,$00),
($09,$80,$86,$83), ($32,$2b,$ed,$48), ($1e,$11,$70,$ac), ($6c,$5a,$72,$4e),
($fd,$0e,$ff,$fb), ($0f,$85,$38,$56), ($3d,$ae,$d5,$1e), ($36,$2d,$39,$27),
($0a,$0f,$d9,$64), ($68,$5c,$a6,$21), ($9b,$5b,$54,$d1), ($24,$36,$2e,$3a),
($0c,$0a,$67,$b1), ($93,$57,$e7,$0f), ($b4,$ee,$96,$d2), ($1b,$9b,$91,$9e),
($80,$c0,$c5,$4f), ($61,$dc,$20,$a2), ($5a,$77,$4b,$69), ($1c,$12,$1a,$16),
($e2,$93,$ba,$0a), ($c0,$a0,$2a,$e5), ($3c,$22,$e0,$43), ($12,$1b,$17,$1d),
($0e,$09,$0d,$0b), ($f2,$8b,$c7,$ad), ($2d,$b6,$a8,$b9), ($14,$1e,$a9,$c8),
($57,$f1,$19,$85), ($af,$75,$07,$4c), ($ee,$99,$dd,$bb), ($a3,$7f,$60,$fd),
($f7,$01,$26,$9f), ($5c,$72,$f5,$bc), ($44,$66,$3b,$c5), ($5b,$fb,$7e,$34),
($8b,$43,$29,$76), ($cb,$23,$c6,$dc), ($b6,$ed,$fc,$68), ($b8,$e4,$f1,$63),
($d7,$31,$dc,$ca), ($42,$63,$85,$10), ($13,$97,$22,$40), ($84,$c6,$11,$20),
($85,$4a,$24,$7d), ($d2,$bb,$3d,$f8), ($ae,$f9,$32,$11), ($c7,$29,$a1,$6d),
($1d,$9e,$2f,$4b), ($dc,$b2,$30,$f3), ($0d,$86,$52,$ec), ($77,$c1,$e3,$d0),
($2b,$b3,$16,$6c), ($a9,$70,$b9,$99), ($11,$94,$48,$fa), ($47,$e9,$64,$22),
($a8,$fc,$8c,$c4), ($a0,$f0,$3f,$1a), ($56,$7d,$2c,$d8), ($22,$33,$90,$ef),
($87,$49,$4e,$c7), ($d9,$38,$d1,$c1), ($8c,$ca,$a2,$fe), ($98,$d4,$0b,$36),
($a6,$f5,$81,$cf), ($a5,$7a,$de,$28), ($da,$b7,$8e,$26), ($3f,$ad,$bf,$a4),
($2c,$3a,$9d,$e4), ($50,$78,$92,$0d), ($6a,$5f,$cc,$9b), ($54,$7e,$46,$62),
($f6,$8d,$13,$c2), ($90,$d8,$b8,$e8), ($2e,$39,$f7,$5e), ($82,$c3,$af,$f5),
($9f,$5d,$80,$be), ($69,$d0,$93,$7c), ($6f,$d5,$2d,$a9), ($cf,$25,$12,$b3),
($c8,$ac,$99,$3b), ($10,$18,$7d,$a7), ($e8,$9c,$63,$6e), ($db,$3b,$bb,$7b),
($cd,$26,$78,$09), ($6e,$59,$18,$f4), ($ec,$9a,$b7,$01), ($83,$4f,$9a,$a8),
($e6,$95,$6e,$65), ($aa,$ff,$e6,$7e), ($21,$bc,$cf,$08), ($ef,$15,$e8,$e6),
($ba,$e7,$9b,$d9), ($4a,$6f,$36,$ce), ($ea,$9f,$09,$d4), ($29,$b0,$7c,$d6),
($31,$a4,$b2,$af), ($2a,$3f,$23,$31), ($c6,$a5,$94,$30), ($35,$a2,$66,$c0),
($74,$4e,$bc,$37), ($fc,$82,$ca,$a6), ($e0,$90,$d0,$b0), ($33,$a7,$d8,$15),
($f1,$04,$98,$4a), ($41,$ec,$da,$f7), ($7f,$cd,$50,$0e), ($17,$91,$f6,$2f),
($76,$4d,$d6,$8d), ($43,$ef,$b0,$4d), ($cc,$aa,$4d,$54), ($e4,$96,$04,$df),
($9e,$d1,$b5,$e3), ($4c,$6a,$88,$1b), ($c1,$2c,$1f,$b8), ($46,$65,$51,$7f),
($9d,$5e,$ea,$04), ($01,$8c,$35,$5d), ($fa,$87,$74,$73), ($fb,$0b,$41,$2e),
($b3,$67,$1d,$5a), ($92,$db,$d2,$52), ($e9,$10,$56,$33), ($6d,$d6,$47,$13),
($9a,$d7,$61,$8c), ($37,$a1,$0c,$7a), ($59,$f8,$14,$8e), ($eb,$13,$3c,$89),
($ce,$a9,$27,$ee), ($b7,$61,$c9,$35), ($e1,$1c,$e5,$ed), ($7a,$47,$b1,$3c),
($9c,$d2,$df,$59), ($55,$f2,$73,$3f), ($18,$14,$ce,$79), ($73,$c7,$37,$bf),
($53,$f7,$cd,$ea), ($5f,$fd,$aa,$5b), ($df,$3d,$6f,$14), ($78,$44,$db,$86),
($ca,$af,$f3,$81), ($b9,$68,$c4,$3e), ($38,$24,$34,$2c), ($c2,$a3,$40,$5f),
($16,$1d,$c3,$72), ($bc,$e2,$25,$0c), ($28,$3c,$49,$8b), ($ff,$0d,$95,$41),
($39,$a8,$01,$71), ($08,$0c,$b3,$de), ($d8,$b4,$e4,$9c), ($64,$56,$c1,$90),
($7b,$cb,$84,$61), ($d5,$32,$b6,$70), ($48,$6c,$5c,$74), ($d0,$b8,$57,$42));
T6: array[0..255,0..3] of byte= (
($50,$51,$f4,$a7), ($53,$7e,$41,$65), ($c3,$1a,$17,$a4), ($96,$3a,$27,$5e),
($cb,$3b,$ab,$6b), ($f1,$1f,$9d,$45), ($ab,$ac,$fa,$58), ($93,$4b,$e3,$03),
($55,$20,$30,$fa), ($f6,$ad,$76,$6d), ($91,$88,$cc,$76), ($25,$f5,$02,$4c),
($fc,$4f,$e5,$d7), ($d7,$c5,$2a,$cb), ($80,$26,$35,$44), ($8f,$b5,$62,$a3),
($49,$de,$b1,$5a), ($67,$25,$ba,$1b), ($98,$45,$ea,$0e), ($e1,$5d,$fe,$c0),
($02,$c3,$2f,$75), ($12,$81,$4c,$f0), ($a3,$8d,$46,$97), ($c6,$6b,$d3,$f9),
($e7,$03,$8f,$5f), ($95,$15,$92,$9c), ($eb,$bf,$6d,$7a), ($da,$95,$52,$59),
($2d,$d4,$be,$83), ($d3,$58,$74,$21), ($29,$49,$e0,$69), ($44,$8e,$c9,$c8),
($6a,$75,$c2,$89), ($78,$f4,$8e,$79), ($6b,$99,$58,$3e), ($dd,$27,$b9,$71),
($b6,$be,$e1,$4f), ($17,$f0,$88,$ad), ($66,$c9,$20,$ac), ($b4,$7d,$ce,$3a),
($18,$63,$df,$4a), ($82,$e5,$1a,$31), ($60,$97,$51,$33), ($45,$62,$53,$7f),
($e0,$b1,$64,$77), ($84,$bb,$6b,$ae), ($1c,$fe,$81,$a0), ($94,$f9,$08,$2b),
($58,$70,$48,$68), ($19,$8f,$45,$fd), ($87,$94,$de,$6c), ($b7,$52,$7b,$f8),
($23,$ab,$73,$d3), ($e2,$72,$4b,$02), ($57,$e3,$1f,$8f), ($2a,$66,$55,$ab),
($07,$b2,$eb,$28), ($03,$2f,$b5,$c2), ($9a,$86,$c5,$7b), ($a5,$d3,$37,$08),
($f2,$30,$28,$87), ($b2,$23,$bf,$a5), ($ba,$02,$03,$6a), ($5c,$ed,$16,$82),
($2b,$8a,$cf,$1c), ($92,$a7,$79,$b4), ($f0,$f3,$07,$f2), ($a1,$4e,$69,$e2),
($cd,$65,$da,$f4), ($d5,$06,$05,$be), ($1f,$d1,$34,$62), ($8a,$c4,$a6,$fe),
($9d,$34,$2e,$53), ($a0,$a2,$f3,$55), ($32,$05,$8a,$e1), ($75,$a4,$f6,$eb),
($39,$0b,$83,$ec), ($aa,$40,$60,$ef), ($06,$5e,$71,$9f), ($51,$bd,$6e,$10),
($f9,$3e,$21,$8a), ($3d,$96,$dd,$06), ($ae,$dd,$3e,$05), ($46,$4d,$e6,$bd),
($b5,$91,$54,$8d), ($05,$71,$c4,$5d), ($6f,$04,$06,$d4), ($ff,$60,$50,$15),
($24,$19,$98,$fb), ($97,$d6,$bd,$e9), ($cc,$89,$40,$43), ($77,$67,$d9,$9e),
($bd,$b0,$e8,$42), ($88,$07,$89,$8b), ($38,$e7,$19,$5b), ($db,$79,$c8,$ee),
($47,$a1,$7c,$0a), ($e9,$7c,$42,$0f), ($c9,$f8,$84,$1e), ($00,$00,$00,$00),
($83,$09,$80,$86), ($48,$32,$2b,$ed), ($ac,$1e,$11,$70), ($4e,$6c,$5a,$72),
($fb,$fd,$0e,$ff), ($56,$0f,$85,$38), ($1e,$3d,$ae,$d5), ($27,$36,$2d,$39),
($64,$0a,$0f,$d9), ($21,$68,$5c,$a6), ($d1,$9b,$5b,$54), ($3a,$24,$36,$2e),
($b1,$0c,$0a,$67), ($0f,$93,$57,$e7), ($d2,$b4,$ee,$96), ($9e,$1b,$9b,$91),
($4f,$80,$c0,$c5), ($a2,$61,$dc,$20), ($69,$5a,$77,$4b), ($16,$1c,$12,$1a),
($0a,$e2,$93,$ba), ($e5,$c0,$a0,$2a), ($43,$3c,$22,$e0), ($1d,$12,$1b,$17),
($0b,$0e,$09,$0d), ($ad,$f2,$8b,$c7), ($b9,$2d,$b6,$a8), ($c8,$14,$1e,$a9),
($85,$57,$f1,$19), ($4c,$af,$75,$07), ($bb,$ee,$99,$dd), ($fd,$a3,$7f,$60),
($9f,$f7,$01,$26), ($bc,$5c,$72,$f5), ($c5,$44,$66,$3b), ($34,$5b,$fb,$7e),
($76,$8b,$43,$29), ($dc,$cb,$23,$c6), ($68,$b6,$ed,$fc), ($63,$b8,$e4,$f1),
($ca,$d7,$31,$dc), ($10,$42,$63,$85), ($40,$13,$97,$22), ($20,$84,$c6,$11),
($7d,$85,$4a,$24), ($f8,$d2,$bb,$3d), ($11,$ae,$f9,$32), ($6d,$c7,$29,$a1),
($4b,$1d,$9e,$2f), ($f3,$dc,$b2,$30), ($ec,$0d,$86,$52), ($d0,$77,$c1,$e3),
($6c,$2b,$b3,$16), ($99,$a9,$70,$b9), ($fa,$11,$94,$48), ($22,$47,$e9,$64),
($c4,$a8,$fc,$8c), ($1a,$a0,$f0,$3f), ($d8,$56,$7d,$2c), ($ef,$22,$33,$90),
($c7,$87,$49,$4e), ($c1,$d9,$38,$d1), ($fe,$8c,$ca,$a2), ($36,$98,$d4,$0b),
($cf,$a6,$f5,$81), ($28,$a5,$7a,$de), ($26,$da,$b7,$8e), ($a4,$3f,$ad,$bf),
($e4,$2c,$3a,$9d), ($0d,$50,$78,$92), ($9b,$6a,$5f,$cc), ($62,$54,$7e,$46),
($c2,$f6,$8d,$13), ($e8,$90,$d8,$b8), ($5e,$2e,$39,$f7), ($f5,$82,$c3,$af),
($be,$9f,$5d,$80), ($7c,$69,$d0,$93), ($a9,$6f,$d5,$2d), ($b3,$cf,$25,$12),
($3b,$c8,$ac,$99), ($a7,$10,$18,$7d), ($6e,$e8,$9c,$63), ($7b,$db,$3b,$bb),
($09,$cd,$26,$78), ($f4,$6e,$59,$18), ($01,$ec,$9a,$b7), ($a8,$83,$4f,$9a),
($65,$e6,$95,$6e), ($7e,$aa,$ff,$e6), ($08,$21,$bc,$cf), ($e6,$ef,$15,$e8),
($d9,$ba,$e7,$9b), ($ce,$4a,$6f,$36), ($d4,$ea,$9f,$09), ($d6,$29,$b0,$7c),
($af,$31,$a4,$b2), ($31,$2a,$3f,$23), ($30,$c6,$a5,$94), ($c0,$35,$a2,$66),
($37,$74,$4e,$bc), ($a6,$fc,$82,$ca), ($b0,$e0,$90,$d0), ($15,$33,$a7,$d8),
($4a,$f1,$04,$98), ($f7,$41,$ec,$da), ($0e,$7f,$cd,$50), ($2f,$17,$91,$f6),
($8d,$76,$4d,$d6), ($4d,$43,$ef,$b0), ($54,$cc,$aa,$4d), ($df,$e4,$96,$04),
($e3,$9e,$d1,$b5), ($1b,$4c,$6a,$88), ($b8,$c1,$2c,$1f), ($7f,$46,$65,$51),
($04,$9d,$5e,$ea), ($5d,$01,$8c,$35), ($73,$fa,$87,$74), ($2e,$fb,$0b,$41),
($5a,$b3,$67,$1d), ($52,$92,$db,$d2), ($33,$e9,$10,$56), ($13,$6d,$d6,$47),
($8c,$9a,$d7,$61), ($7a,$37,$a1,$0c), ($8e,$59,$f8,$14), ($89,$eb,$13,$3c),
($ee,$ce,$a9,$27), ($35,$b7,$61,$c9), ($ed,$e1,$1c,$e5), ($3c,$7a,$47,$b1),
($59,$9c,$d2,$df), ($3f,$55,$f2,$73), ($79,$18,$14,$ce), ($bf,$73,$c7,$37),
($ea,$53,$f7,$cd), ($5b,$5f,$fd,$aa), ($14,$df,$3d,$6f), ($86,$78,$44,$db),
($81,$ca,$af,$f3), ($3e,$b9,$68,$c4), ($2c,$38,$24,$34), ($5f,$c2,$a3,$40),
($72,$16,$1d,$c3), ($0c,$bc,$e2,$25), ($8b,$28,$3c,$49), ($41,$ff,$0d,$95),
($71,$39,$a8,$01), ($de,$08,$0c,$b3), ($9c,$d8,$b4,$e4), ($90,$64,$56,$c1),
($61,$7b,$cb,$84), ($70,$d5,$32,$b6), ($74,$48,$6c,$5c), ($42,$d0,$b8,$57));
T7: array[0..255,0..3] of byte= (
($a7,$50,$51,$f4), ($65,$53,$7e,$41), ($a4,$c3,$1a,$17), ($5e,$96,$3a,$27),
($6b,$cb,$3b,$ab), ($45,$f1,$1f,$9d), ($58,$ab,$ac,$fa), ($03,$93,$4b,$e3),
($fa,$55,$20,$30), ($6d,$f6,$ad,$76), ($76,$91,$88,$cc), ($4c,$25,$f5,$02),
($d7,$fc,$4f,$e5), ($cb,$d7,$c5,$2a), ($44,$80,$26,$35), ($a3,$8f,$b5,$62),
($5a,$49,$de,$b1), ($1b,$67,$25,$ba), ($0e,$98,$45,$ea), ($c0,$e1,$5d,$fe),
($75,$02,$c3,$2f), ($f0,$12,$81,$4c), ($97,$a3,$8d,$46), ($f9,$c6,$6b,$d3),
($5f,$e7,$03,$8f), ($9c,$95,$15,$92), ($7a,$eb,$bf,$6d), ($59,$da,$95,$52),
($83,$2d,$d4,$be), ($21,$d3,$58,$74), ($69,$29,$49,$e0), ($c8,$44,$8e,$c9),
($89,$6a,$75,$c2), ($79,$78,$f4,$8e), ($3e,$6b,$99,$58), ($71,$dd,$27,$b9),
($4f,$b6,$be,$e1), ($ad,$17,$f0,$88), ($ac,$66,$c9,$20), ($3a,$b4,$7d,$ce),
($4a,$18,$63,$df), ($31,$82,$e5,$1a), ($33,$60,$97,$51), ($7f,$45,$62,$53),
($77,$e0,$b1,$64), ($ae,$84,$bb,$6b), ($a0,$1c,$fe,$81), ($2b,$94,$f9,$08),
($68,$58,$70,$48), ($fd,$19,$8f,$45), ($6c,$87,$94,$de), ($f8,$b7,$52,$7b),
($d3,$23,$ab,$73), ($02,$e2,$72,$4b), ($8f,$57,$e3,$1f), ($ab,$2a,$66,$55),
($28,$07,$b2,$eb), ($c2,$03,$2f,$b5), ($7b,$9a,$86,$c5), ($08,$a5,$d3,$37),
($87,$f2,$30,$28), ($a5,$b2,$23,$bf), ($6a,$ba,$02,$03), ($82,$5c,$ed,$16),
($1c,$2b,$8a,$cf), ($b4,$92,$a7,$79), ($f2,$f0,$f3,$07), ($e2,$a1,$4e,$69),
($f4,$cd,$65,$da), ($be,$d5,$06,$05), ($62,$1f,$d1,$34), ($fe,$8a,$c4,$a6),
($53,$9d,$34,$2e), ($55,$a0,$a2,$f3), ($e1,$32,$05,$8a), ($eb,$75,$a4,$f6),
($ec,$39,$0b,$83), ($ef,$aa,$40,$60), ($9f,$06,$5e,$71), ($10,$51,$bd,$6e),
($8a,$f9,$3e,$21), ($06,$3d,$96,$dd), ($05,$ae,$dd,$3e), ($bd,$46,$4d,$e6),
($8d,$b5,$91,$54), ($5d,$05,$71,$c4), ($d4,$6f,$04,$06), ($15,$ff,$60,$50),
($fb,$24,$19,$98), ($e9,$97,$d6,$bd), ($43,$cc,$89,$40), ($9e,$77,$67,$d9),
($42,$bd,$b0,$e8), ($8b,$88,$07,$89), ($5b,$38,$e7,$19), ($ee,$db,$79,$c8),
($0a,$47,$a1,$7c), ($0f,$e9,$7c,$42), ($1e,$c9,$f8,$84), ($00,$00,$00,$00),
($86,$83,$09,$80), ($ed,$48,$32,$2b), ($70,$ac,$1e,$11), ($72,$4e,$6c,$5a),
($ff,$fb,$fd,$0e), ($38,$56,$0f,$85), ($d5,$1e,$3d,$ae), ($39,$27,$36,$2d),
($d9,$64,$0a,$0f), ($a6,$21,$68,$5c), ($54,$d1,$9b,$5b), ($2e,$3a,$24,$36),
($67,$b1,$0c,$0a), ($e7,$0f,$93,$57), ($96,$d2,$b4,$ee), ($91,$9e,$1b,$9b),
($c5,$4f,$80,$c0), ($20,$a2,$61,$dc), ($4b,$69,$5a,$77), ($1a,$16,$1c,$12),
($ba,$0a,$e2,$93), ($2a,$e5,$c0,$a0), ($e0,$43,$3c,$22), ($17,$1d,$12,$1b),
($0d,$0b,$0e,$09), ($c7,$ad,$f2,$8b), ($a8,$b9,$2d,$b6), ($a9,$c8,$14,$1e),
($19,$85,$57,$f1), ($07,$4c,$af,$75), ($dd,$bb,$ee,$99), ($60,$fd,$a3,$7f),
($26,$9f,$f7,$01), ($f5,$bc,$5c,$72), ($3b,$c5,$44,$66), ($7e,$34,$5b,$fb),
($29,$76,$8b,$43), ($c6,$dc,$cb,$23), ($fc,$68,$b6,$ed), ($f1,$63,$b8,$e4),
($dc,$ca,$d7,$31), ($85,$10,$42,$63), ($22,$40,$13,$97), ($11,$20,$84,$c6),
($24,$7d,$85,$4a), ($3d,$f8,$d2,$bb), ($32,$11,$ae,$f9), ($a1,$6d,$c7,$29),
($2f,$4b,$1d,$9e), ($30,$f3,$dc,$b2), ($52,$ec,$0d,$86), ($e3,$d0,$77,$c1),
($16,$6c,$2b,$b3), ($b9,$99,$a9,$70), ($48,$fa,$11,$94), ($64,$22,$47,$e9),
($8c,$c4,$a8,$fc), ($3f,$1a,$a0,$f0), ($2c,$d8,$56,$7d), ($90,$ef,$22,$33),
($4e,$c7,$87,$49), ($d1,$c1,$d9,$38), ($a2,$fe,$8c,$ca), ($0b,$36,$98,$d4),
($81,$cf,$a6,$f5), ($de,$28,$a5,$7a), ($8e,$26,$da,$b7), ($bf,$a4,$3f,$ad),
($9d,$e4,$2c,$3a), ($92,$0d,$50,$78), ($cc,$9b,$6a,$5f), ($46,$62,$54,$7e),
($13,$c2,$f6,$8d), ($b8,$e8,$90,$d8), ($f7,$5e,$2e,$39), ($af,$f5,$82,$c3),
($80,$be,$9f,$5d), ($93,$7c,$69,$d0), ($2d,$a9,$6f,$d5), ($12,$b3,$cf,$25),
($99,$3b,$c8,$ac), ($7d,$a7,$10,$18), ($63,$6e,$e8,$9c), ($bb,$7b,$db,$3b),
($78,$09,$cd,$26), ($18,$f4,$6e,$59), ($b7,$01,$ec,$9a), ($9a,$a8,$83,$4f),
($6e,$65,$e6,$95), ($e6,$7e,$aa,$ff), ($cf,$08,$21,$bc), ($e8,$e6,$ef,$15),
($9b,$d9,$ba,$e7), ($36,$ce,$4a,$6f), ($09,$d4,$ea,$9f), ($7c,$d6,$29,$b0),
($b2,$af,$31,$a4), ($23,$31,$2a,$3f), ($94,$30,$c6,$a5), ($66,$c0,$35,$a2),
($bc,$37,$74,$4e), ($ca,$a6,$fc,$82), ($d0,$b0,$e0,$90), ($d8,$15,$33,$a7),
($98,$4a,$f1,$04), ($da,$f7,$41,$ec), ($50,$0e,$7f,$cd), ($f6,$2f,$17,$91),
($d6,$8d,$76,$4d), ($b0,$4d,$43,$ef), ($4d,$54,$cc,$aa), ($04,$df,$e4,$96),
($b5,$e3,$9e,$d1), ($88,$1b,$4c,$6a), ($1f,$b8,$c1,$2c), ($51,$7f,$46,$65),
($ea,$04,$9d,$5e), ($35,$5d,$01,$8c), ($74,$73,$fa,$87), ($41,$2e,$fb,$0b),
($1d,$5a,$b3,$67), ($d2,$52,$92,$db), ($56,$33,$e9,$10), ($47,$13,$6d,$d6),
($61,$8c,$9a,$d7), ($0c,$7a,$37,$a1), ($14,$8e,$59,$f8), ($3c,$89,$eb,$13),
($27,$ee,$ce,$a9), ($c9,$35,$b7,$61), ($e5,$ed,$e1,$1c), ($b1,$3c,$7a,$47),
($df,$59,$9c,$d2), ($73,$3f,$55,$f2), ($ce,$79,$18,$14), ($37,$bf,$73,$c7),
($cd,$ea,$53,$f7), ($aa,$5b,$5f,$fd), ($6f,$14,$df,$3d), ($db,$86,$78,$44),
($f3,$81,$ca,$af), ($c4,$3e,$b9,$68), ($34,$2c,$38,$24), ($40,$5f,$c2,$a3),
($c3,$72,$16,$1d), ($25,$0c,$bc,$e2), ($49,$8b,$28,$3c), ($95,$41,$ff,$0d),
($01,$71,$39,$a8), ($b3,$de,$08,$0c), ($e4,$9c,$d8,$b4), ($c1,$90,$64,$56),
($84,$61,$7b,$cb), ($b6,$70,$d5,$32), ($5c,$74,$48,$6c), ($57,$42,$d0,$b8));
T8: array[0..255,0..3] of byte= (
($f4,$a7,$50,$51), ($41,$65,$53,$7e), ($17,$a4,$c3,$1a), ($27,$5e,$96,$3a),
($ab,$6b,$cb,$3b), ($9d,$45,$f1,$1f), ($fa,$58,$ab,$ac), ($e3,$03,$93,$4b),
($30,$fa,$55,$20), ($76,$6d,$f6,$ad), ($cc,$76,$91,$88), ($02,$4c,$25,$f5),
($e5,$d7,$fc,$4f), ($2a,$cb,$d7,$c5), ($35,$44,$80,$26), ($62,$a3,$8f,$b5),
($b1,$5a,$49,$de), ($ba,$1b,$67,$25), ($ea,$0e,$98,$45), ($fe,$c0,$e1,$5d),
($2f,$75,$02,$c3), ($4c,$f0,$12,$81), ($46,$97,$a3,$8d), ($d3,$f9,$c6,$6b),
($8f,$5f,$e7,$03), ($92,$9c,$95,$15), ($6d,$7a,$eb,$bf), ($52,$59,$da,$95),
($be,$83,$2d,$d4), ($74,$21,$d3,$58), ($e0,$69,$29,$49), ($c9,$c8,$44,$8e),
($c2,$89,$6a,$75), ($8e,$79,$78,$f4), ($58,$3e,$6b,$99), ($b9,$71,$dd,$27),
($e1,$4f,$b6,$be), ($88,$ad,$17,$f0), ($20,$ac,$66,$c9), ($ce,$3a,$b4,$7d),
($df,$4a,$18,$63), ($1a,$31,$82,$e5), ($51,$33,$60,$97), ($53,$7f,$45,$62),
($64,$77,$e0,$b1), ($6b,$ae,$84,$bb), ($81,$a0,$1c,$fe), ($08,$2b,$94,$f9),
($48,$68,$58,$70), ($45,$fd,$19,$8f), ($de,$6c,$87,$94), ($7b,$f8,$b7,$52),
($73,$d3,$23,$ab), ($4b,$02,$e2,$72), ($1f,$8f,$57,$e3), ($55,$ab,$2a,$66),
($eb,$28,$07,$b2), ($b5,$c2,$03,$2f), ($c5,$7b,$9a,$86), ($37,$08,$a5,$d3),
($28,$87,$f2,$30), ($bf,$a5,$b2,$23), ($03,$6a,$ba,$02), ($16,$82,$5c,$ed),
($cf,$1c,$2b,$8a), ($79,$b4,$92,$a7), ($07,$f2,$f0,$f3), ($69,$e2,$a1,$4e),
($da,$f4,$cd,$65), ($05,$be,$d5,$06), ($34,$62,$1f,$d1), ($a6,$fe,$8a,$c4),
($2e,$53,$9d,$34), ($f3,$55,$a0,$a2), ($8a,$e1,$32,$05), ($f6,$eb,$75,$a4),
($83,$ec,$39,$0b), ($60,$ef,$aa,$40), ($71,$9f,$06,$5e), ($6e,$10,$51,$bd),
($21,$8a,$f9,$3e), ($dd,$06,$3d,$96), ($3e,$05,$ae,$dd), ($e6,$bd,$46,$4d),
($54,$8d,$b5,$91), ($c4,$5d,$05,$71), ($06,$d4,$6f,$04), ($50,$15,$ff,$60),
($98,$fb,$24,$19), ($bd,$e9,$97,$d6), ($40,$43,$cc,$89), ($d9,$9e,$77,$67),
($e8,$42,$bd,$b0), ($89,$8b,$88,$07), ($19,$5b,$38,$e7), ($c8,$ee,$db,$79),
($7c,$0a,$47,$a1), ($42,$0f,$e9,$7c), ($84,$1e,$c9,$f8), ($00,$00,$00,$00),
($80,$86,$83,$09), ($2b,$ed,$48,$32), ($11,$70,$ac,$1e), ($5a,$72,$4e,$6c),
($0e,$ff,$fb,$fd), ($85,$38,$56,$0f), ($ae,$d5,$1e,$3d), ($2d,$39,$27,$36),
($0f,$d9,$64,$0a), ($5c,$a6,$21,$68), ($5b,$54,$d1,$9b), ($36,$2e,$3a,$24),
($0a,$67,$b1,$0c), ($57,$e7,$0f,$93), ($ee,$96,$d2,$b4), ($9b,$91,$9e,$1b),
($c0,$c5,$4f,$80), ($dc,$20,$a2,$61), ($77,$4b,$69,$5a), ($12,$1a,$16,$1c),
($93,$ba,$0a,$e2), ($a0,$2a,$e5,$c0), ($22,$e0,$43,$3c), ($1b,$17,$1d,$12),
($09,$0d,$0b,$0e), ($8b,$c7,$ad,$f2), ($b6,$a8,$b9,$2d), ($1e,$a9,$c8,$14),
($f1,$19,$85,$57), ($75,$07,$4c,$af), ($99,$dd,$bb,$ee), ($7f,$60,$fd,$a3),
($01,$26,$9f,$f7), ($72,$f5,$bc,$5c), ($66,$3b,$c5,$44), ($fb,$7e,$34,$5b),
($43,$29,$76,$8b), ($23,$c6,$dc,$cb), ($ed,$fc,$68,$b6), ($e4,$f1,$63,$b8),
($31,$dc,$ca,$d7), ($63,$85,$10,$42), ($97,$22,$40,$13), ($c6,$11,$20,$84),
($4a,$24,$7d,$85), ($bb,$3d,$f8,$d2), ($f9,$32,$11,$ae), ($29,$a1,$6d,$c7),
($9e,$2f,$4b,$1d), ($b2,$30,$f3,$dc), ($86,$52,$ec,$0d), ($c1,$e3,$d0,$77),
($b3,$16,$6c,$2b), ($70,$b9,$99,$a9), ($94,$48,$fa,$11), ($e9,$64,$22,$47),
($fc,$8c,$c4,$a8), ($f0,$3f,$1a,$a0), ($7d,$2c,$d8,$56), ($33,$90,$ef,$22),
($49,$4e,$c7,$87), ($38,$d1,$c1,$d9), ($ca,$a2,$fe,$8c), ($d4,$0b,$36,$98),
($f5,$81,$cf,$a6), ($7a,$de,$28,$a5), ($b7,$8e,$26,$da), ($ad,$bf,$a4,$3f),
($3a,$9d,$e4,$2c), ($78,$92,$0d,$50), ($5f,$cc,$9b,$6a), ($7e,$46,$62,$54),
($8d,$13,$c2,$f6), ($d8,$b8,$e8,$90), ($39,$f7,$5e,$2e), ($c3,$af,$f5,$82),
($5d,$80,$be,$9f), ($d0,$93,$7c,$69), ($d5,$2d,$a9,$6f), ($25,$12,$b3,$cf),
($ac,$99,$3b,$c8), ($18,$7d,$a7,$10), ($9c,$63,$6e,$e8), ($3b,$bb,$7b,$db),
($26,$78,$09,$cd), ($59,$18,$f4,$6e), ($9a,$b7,$01,$ec), ($4f,$9a,$a8,$83),
($95,$6e,$65,$e6), ($ff,$e6,$7e,$aa), ($bc,$cf,$08,$21), ($15,$e8,$e6,$ef),
($e7,$9b,$d9,$ba), ($6f,$36,$ce,$4a), ($9f,$09,$d4,$ea), ($b0,$7c,$d6,$29),
($a4,$b2,$af,$31), ($3f,$23,$31,$2a), ($a5,$94,$30,$c6), ($a2,$66,$c0,$35),
($4e,$bc,$37,$74), ($82,$ca,$a6,$fc), ($90,$d0,$b0,$e0), ($a7,$d8,$15,$33),
($04,$98,$4a,$f1), ($ec,$da,$f7,$41), ($cd,$50,$0e,$7f), ($91,$f6,$2f,$17),
($4d,$d6,$8d,$76), ($ef,$b0,$4d,$43), ($aa,$4d,$54,$cc), ($96,$04,$df,$e4),
($d1,$b5,$e3,$9e), ($6a,$88,$1b,$4c), ($2c,$1f,$b8,$c1), ($65,$51,$7f,$46),
($5e,$ea,$04,$9d), ($8c,$35,$5d,$01), ($87,$74,$73,$fa), ($0b,$41,$2e,$fb),
($67,$1d,$5a,$b3), ($db,$d2,$52,$92), ($10,$56,$33,$e9), ($d6,$47,$13,$6d),
($d7,$61,$8c,$9a), ($a1,$0c,$7a,$37), ($f8,$14,$8e,$59), ($13,$3c,$89,$eb),
($a9,$27,$ee,$ce), ($61,$c9,$35,$b7), ($1c,$e5,$ed,$e1), ($47,$b1,$3c,$7a),
($d2,$df,$59,$9c), ($f2,$73,$3f,$55), ($14,$ce,$79,$18), ($c7,$37,$bf,$73),
($f7,$cd,$ea,$53), ($fd,$aa,$5b,$5f), ($3d,$6f,$14,$df), ($44,$db,$86,$78),
($af,$f3,$81,$ca), ($68,$c4,$3e,$b9), ($24,$34,$2c,$38), ($a3,$40,$5f,$c2),
($1d,$c3,$72,$16), ($e2,$25,$0c,$bc), ($3c,$49,$8b,$28), ($0d,$95,$41,$ff),
($a8,$01,$71,$39), ($0c,$b3,$de,$08), ($b4,$e4,$9c,$d8), ($56,$c1,$90,$64),
($cb,$84,$61,$7b), ($32,$b6,$70,$d5), ($6c,$5c,$74,$48), ($b8,$57,$42,$d0));
S5: array[0..255] of byte= (
$52,$09,$6a,$d5,
$30,$36,$a5,$38,
$bf,$40,$a3,$9e,
$81,$f3,$d7,$fb,
$7c,$e3,$39,$82,
$9b,$2f,$ff,$87,
$34,$8e,$43,$44,
$c4,$de,$e9,$cb,
$54,$7b,$94,$32,
$a6,$c2,$23,$3d,
$ee,$4c,$95,$0b,
$42,$fa,$c3,$4e,
$08,$2e,$a1,$66,
$28,$d9,$24,$b2,
$76,$5b,$a2,$49,
$6d,$8b,$d1,$25,
$72,$f8,$f6,$64,
$86,$68,$98,$16,
$d4,$a4,$5c,$cc,
$5d,$65,$b6,$92,
$6c,$70,$48,$50,
$fd,$ed,$b9,$da,
$5e,$15,$46,$57,
$a7,$8d,$9d,$84,
$90,$d8,$ab,$00,
$8c,$bc,$d3,$0a,
$f7,$e4,$58,$05,
$b8,$b3,$45,$06,
$d0,$2c,$1e,$8f,
$ca,$3f,$0f,$02,
$c1,$af,$bd,$03,
$01,$13,$8a,$6b,
$3a,$91,$11,$41,
$4f,$67,$dc,$ea,
$97,$f2,$cf,$ce,
$f0,$b4,$e6,$73,
$96,$ac,$74,$22,
$e7,$ad,$35,$85,
$e2,$f9,$37,$e8,
$1c,$75,$df,$6e,
$47,$f1,$1a,$71,
$1d,$29,$c5,$89,
$6f,$b7,$62,$0e,
$aa,$18,$be,$1b,
$fc,$56,$3e,$4b,
$c6,$d2,$79,$20,
$9a,$db,$c0,$fe,
$78,$cd,$5a,$f4,
$1f,$dd,$a8,$33,
$88,$07,$c7,$31,
$b1,$12,$10,$59,
$27,$80,$ec,$5f,
$60,$51,$7f,$a9,
$19,$b5,$4a,$0d,
$2d,$e5,$7a,$9f,
$93,$c9,$9c,$ef,
$a0,$e0,$3b,$4d,
$ae,$2a,$f5,$b0,
$c8,$eb,$bb,$3c,
$83,$53,$99,$61,
$17,$2b,$04,$7e,
$ba,$77,$d6,$26,
$e1,$69,$14,$63,
$55,$21,$0c,$7d);
U1: array[0..255,0..3] of byte= (
($00,$00,$00,$00), ($0e,$09,$0d,$0b), ($1c,$12,$1a,$16), ($12,$1b,$17,$1d),
($38,$24,$34,$2c), ($36,$2d,$39,$27), ($24,$36,$2e,$3a), ($2a,$3f,$23,$31),
($70,$48,$68,$58), ($7e,$41,$65,$53), ($6c,$5a,$72,$4e), ($62,$53,$7f,$45),
($48,$6c,$5c,$74), ($46,$65,$51,$7f), ($54,$7e,$46,$62), ($5a,$77,$4b,$69),
($e0,$90,$d0,$b0), ($ee,$99,$dd,$bb), ($fc,$82,$ca,$a6), ($f2,$8b,$c7,$ad),
($d8,$b4,$e4,$9c), ($d6,$bd,$e9,$97), ($c4,$a6,$fe,$8a), ($ca,$af,$f3,$81),
($90,$d8,$b8,$e8), ($9e,$d1,$b5,$e3), ($8c,$ca,$a2,$fe), ($82,$c3,$af,$f5),
($a8,$fc,$8c,$c4), ($a6,$f5,$81,$cf), ($b4,$ee,$96,$d2), ($ba,$e7,$9b,$d9),
($db,$3b,$bb,$7b), ($d5,$32,$b6,$70), ($c7,$29,$a1,$6d), ($c9,$20,$ac,$66),
($e3,$1f,$8f,$57), ($ed,$16,$82,$5c), ($ff,$0d,$95,$41), ($f1,$04,$98,$4a),
($ab,$73,$d3,$23), ($a5,$7a,$de,$28), ($b7,$61,$c9,$35), ($b9,$68,$c4,$3e),
($93,$57,$e7,$0f), ($9d,$5e,$ea,$04), ($8f,$45,$fd,$19), ($81,$4c,$f0,$12),
($3b,$ab,$6b,$cb), ($35,$a2,$66,$c0), ($27,$b9,$71,$dd), ($29,$b0,$7c,$d6),
($03,$8f,$5f,$e7), ($0d,$86,$52,$ec), ($1f,$9d,$45,$f1), ($11,$94,$48,$fa),
($4b,$e3,$03,$93), ($45,$ea,$0e,$98), ($57,$f1,$19,$85), ($59,$f8,$14,$8e),
($73,$c7,$37,$bf), ($7d,$ce,$3a,$b4), ($6f,$d5,$2d,$a9), ($61,$dc,$20,$a2),
($ad,$76,$6d,$f6), ($a3,$7f,$60,$fd), ($b1,$64,$77,$e0), ($bf,$6d,$7a,$eb),
($95,$52,$59,$da), ($9b,$5b,$54,$d1), ($89,$40,$43,$cc), ($87,$49,$4e,$c7),
($dd,$3e,$05,$ae), ($d3,$37,$08,$a5), ($c1,$2c,$1f,$b8), ($cf,$25,$12,$b3),
($e5,$1a,$31,$82), ($eb,$13,$3c,$89), ($f9,$08,$2b,$94), ($f7,$01,$26,$9f),
($4d,$e6,$bd,$46), ($43,$ef,$b0,$4d), ($51,$f4,$a7,$50), ($5f,$fd,$aa,$5b),
($75,$c2,$89,$6a), ($7b,$cb,$84,$61), ($69,$d0,$93,$7c), ($67,$d9,$9e,$77),
($3d,$ae,$d5,$1e), ($33,$a7,$d8,$15), ($21,$bc,$cf,$08), ($2f,$b5,$c2,$03),
($05,$8a,$e1,$32), ($0b,$83,$ec,$39), ($19,$98,$fb,$24), ($17,$91,$f6,$2f),
($76,$4d,$d6,$8d), ($78,$44,$db,$86), ($6a,$5f,$cc,$9b), ($64,$56,$c1,$90),
($4e,$69,$e2,$a1), ($40,$60,$ef,$aa), ($52,$7b,$f8,$b7), ($5c,$72,$f5,$bc),
($06,$05,$be,$d5), ($08,$0c,$b3,$de), ($1a,$17,$a4,$c3), ($14,$1e,$a9,$c8),
($3e,$21,$8a,$f9), ($30,$28,$87,$f2), ($22,$33,$90,$ef), ($2c,$3a,$9d,$e4),
($96,$dd,$06,$3d), ($98,$d4,$0b,$36), ($8a,$cf,$1c,$2b), ($84,$c6,$11,$20),
($ae,$f9,$32,$11), ($a0,$f0,$3f,$1a), ($b2,$eb,$28,$07), ($bc,$e2,$25,$0c),
($e6,$95,$6e,$65), ($e8,$9c,$63,$6e), ($fa,$87,$74,$73), ($f4,$8e,$79,$78),
($de,$b1,$5a,$49), ($d0,$b8,$57,$42), ($c2,$a3,$40,$5f), ($cc,$aa,$4d,$54),
($41,$ec,$da,$f7), ($4f,$e5,$d7,$fc), ($5d,$fe,$c0,$e1), ($53,$f7,$cd,$ea),
($79,$c8,$ee,$db), ($77,$c1,$e3,$d0), ($65,$da,$f4,$cd), ($6b,$d3,$f9,$c6),
($31,$a4,$b2,$af), ($3f,$ad,$bf,$a4), ($2d,$b6,$a8,$b9), ($23,$bf,$a5,$b2),
($09,$80,$86,$83), ($07,$89,$8b,$88), ($15,$92,$9c,$95), ($1b,$9b,$91,$9e),
($a1,$7c,$0a,$47), ($af,$75,$07,$4c), ($bd,$6e,$10,$51), ($b3,$67,$1d,$5a),
($99,$58,$3e,$6b), ($97,$51,$33,$60), ($85,$4a,$24,$7d), ($8b,$43,$29,$76),
($d1,$34,$62,$1f), ($df,$3d,$6f,$14), ($cd,$26,$78,$09), ($c3,$2f,$75,$02),
($e9,$10,$56,$33), ($e7,$19,$5b,$38), ($f5,$02,$4c,$25), ($fb,$0b,$41,$2e),
($9a,$d7,$61,$8c), ($94,$de,$6c,$87), ($86,$c5,$7b,$9a), ($88,$cc,$76,$91),
($a2,$f3,$55,$a0), ($ac,$fa,$58,$ab), ($be,$e1,$4f,$b6), ($b0,$e8,$42,$bd),
($ea,$9f,$09,$d4), ($e4,$96,$04,$df), ($f6,$8d,$13,$c2), ($f8,$84,$1e,$c9),
($d2,$bb,$3d,$f8), ($dc,$b2,$30,$f3), ($ce,$a9,$27,$ee), ($c0,$a0,$2a,$e5),
($7a,$47,$b1,$3c), ($74,$4e,$bc,$37), ($66,$55,$ab,$2a), ($68,$5c,$a6,$21),
($42,$63,$85,$10), ($4c,$6a,$88,$1b), ($5e,$71,$9f,$06), ($50,$78,$92,$0d),
($0a,$0f,$d9,$64), ($04,$06,$d4,$6f), ($16,$1d,$c3,$72), ($18,$14,$ce,$79),
($32,$2b,$ed,$48), ($3c,$22,$e0,$43), ($2e,$39,$f7,$5e), ($20,$30,$fa,$55),
($ec,$9a,$b7,$01), ($e2,$93,$ba,$0a), ($f0,$88,$ad,$17), ($fe,$81,$a0,$1c),
($d4,$be,$83,$2d), ($da,$b7,$8e,$26), ($c8,$ac,$99,$3b), ($c6,$a5,$94,$30),
($9c,$d2,$df,$59), ($92,$db,$d2,$52), ($80,$c0,$c5,$4f), ($8e,$c9,$c8,$44),
($a4,$f6,$eb,$75), ($aa,$ff,$e6,$7e), ($b8,$e4,$f1,$63), ($b6,$ed,$fc,$68),
($0c,$0a,$67,$b1), ($02,$03,$6a,$ba), ($10,$18,$7d,$a7), ($1e,$11,$70,$ac),
($34,$2e,$53,$9d), ($3a,$27,$5e,$96), ($28,$3c,$49,$8b), ($26,$35,$44,$80),
($7c,$42,$0f,$e9), ($72,$4b,$02,$e2), ($60,$50,$15,$ff), ($6e,$59,$18,$f4),
($44,$66,$3b,$c5), ($4a,$6f,$36,$ce), ($58,$74,$21,$d3), ($56,$7d,$2c,$d8),
($37,$a1,$0c,$7a), ($39,$a8,$01,$71), ($2b,$b3,$16,$6c), ($25,$ba,$1b,$67),
($0f,$85,$38,$56), ($01,$8c,$35,$5d), ($13,$97,$22,$40), ($1d,$9e,$2f,$4b),
($47,$e9,$64,$22), ($49,$e0,$69,$29), ($5b,$fb,$7e,$34), ($55,$f2,$73,$3f),
($7f,$cd,$50,$0e), ($71,$c4,$5d,$05), ($63,$df,$4a,$18), ($6d,$d6,$47,$13),
($d7,$31,$dc,$ca), ($d9,$38,$d1,$c1), ($cb,$23,$c6,$dc), ($c5,$2a,$cb,$d7),
($ef,$15,$e8,$e6), ($e1,$1c,$e5,$ed), ($f3,$07,$f2,$f0), ($fd,$0e,$ff,$fb),
($a7,$79,$b4,$92), ($a9,$70,$b9,$99), ($bb,$6b,$ae,$84), ($b5,$62,$a3,$8f),
($9f,$5d,$80,$be), ($91,$54,$8d,$b5), ($83,$4f,$9a,$a8), ($8d,$46,$97,$a3));
U2: array[0..255,0..3] of byte= (
($00,$00,$00,$00), ($0b,$0e,$09,$0d), ($16,$1c,$12,$1a), ($1d,$12,$1b,$17),
($2c,$38,$24,$34), ($27,$36,$2d,$39), ($3a,$24,$36,$2e), ($31,$2a,$3f,$23),
($58,$70,$48,$68), ($53,$7e,$41,$65), ($4e,$6c,$5a,$72), ($45,$62,$53,$7f),
($74,$48,$6c,$5c), ($7f,$46,$65,$51), ($62,$54,$7e,$46), ($69,$5a,$77,$4b),
($b0,$e0,$90,$d0), ($bb,$ee,$99,$dd), ($a6,$fc,$82,$ca), ($ad,$f2,$8b,$c7),
($9c,$d8,$b4,$e4), ($97,$d6,$bd,$e9), ($8a,$c4,$a6,$fe), ($81,$ca,$af,$f3),
($e8,$90,$d8,$b8), ($e3,$9e,$d1,$b5), ($fe,$8c,$ca,$a2), ($f5,$82,$c3,$af),
($c4,$a8,$fc,$8c), ($cf,$a6,$f5,$81), ($d2,$b4,$ee,$96), ($d9,$ba,$e7,$9b),
($7b,$db,$3b,$bb), ($70,$d5,$32,$b6), ($6d,$c7,$29,$a1), ($66,$c9,$20,$ac),
($57,$e3,$1f,$8f), ($5c,$ed,$16,$82), ($41,$ff,$0d,$95), ($4a,$f1,$04,$98),
($23,$ab,$73,$d3), ($28,$a5,$7a,$de), ($35,$b7,$61,$c9), ($3e,$b9,$68,$c4),
($0f,$93,$57,$e7), ($04,$9d,$5e,$ea), ($19,$8f,$45,$fd), ($12,$81,$4c,$f0),
($cb,$3b,$ab,$6b), ($c0,$35,$a2,$66), ($dd,$27,$b9,$71), ($d6,$29,$b0,$7c),
($e7,$03,$8f,$5f), ($ec,$0d,$86,$52), ($f1,$1f,$9d,$45), ($fa,$11,$94,$48),
($93,$4b,$e3,$03), ($98,$45,$ea,$0e), ($85,$57,$f1,$19), ($8e,$59,$f8,$14),
($bf,$73,$c7,$37), ($b4,$7d,$ce,$3a), ($a9,$6f,$d5,$2d), ($a2,$61,$dc,$20),
($f6,$ad,$76,$6d), ($fd,$a3,$7f,$60), ($e0,$b1,$64,$77), ($eb,$bf,$6d,$7a),
($da,$95,$52,$59), ($d1,$9b,$5b,$54), ($cc,$89,$40,$43), ($c7,$87,$49,$4e),
($ae,$dd,$3e,$05), ($a5,$d3,$37,$08), ($b8,$c1,$2c,$1f), ($b3,$cf,$25,$12),
($82,$e5,$1a,$31), ($89,$eb,$13,$3c), ($94,$f9,$08,$2b), ($9f,$f7,$01,$26),
($46,$4d,$e6,$bd), ($4d,$43,$ef,$b0), ($50,$51,$f4,$a7), ($5b,$5f,$fd,$aa),
($6a,$75,$c2,$89), ($61,$7b,$cb,$84), ($7c,$69,$d0,$93), ($77,$67,$d9,$9e),
($1e,$3d,$ae,$d5), ($15,$33,$a7,$d8), ($08,$21,$bc,$cf), ($03,$2f,$b5,$c2),
($32,$05,$8a,$e1), ($39,$0b,$83,$ec), ($24,$19,$98,$fb), ($2f,$17,$91,$f6),
($8d,$76,$4d,$d6), ($86,$78,$44,$db), ($9b,$6a,$5f,$cc), ($90,$64,$56,$c1),
($a1,$4e,$69,$e2), ($aa,$40,$60,$ef), ($b7,$52,$7b,$f8), ($bc,$5c,$72,$f5),
($d5,$06,$05,$be), ($de,$08,$0c,$b3), ($c3,$1a,$17,$a4), ($c8,$14,$1e,$a9),
($f9,$3e,$21,$8a), ($f2,$30,$28,$87), ($ef,$22,$33,$90), ($e4,$2c,$3a,$9d),
($3d,$96,$dd,$06), ($36,$98,$d4,$0b), ($2b,$8a,$cf,$1c), ($20,$84,$c6,$11),
($11,$ae,$f9,$32), ($1a,$a0,$f0,$3f), ($07,$b2,$eb,$28), ($0c,$bc,$e2,$25),
($65,$e6,$95,$6e), ($6e,$e8,$9c,$63), ($73,$fa,$87,$74), ($78,$f4,$8e,$79),
($49,$de,$b1,$5a), ($42,$d0,$b8,$57), ($5f,$c2,$a3,$40), ($54,$cc,$aa,$4d),
($f7,$41,$ec,$da), ($fc,$4f,$e5,$d7), ($e1,$5d,$fe,$c0), ($ea,$53,$f7,$cd),
($db,$79,$c8,$ee), ($d0,$77,$c1,$e3), ($cd,$65,$da,$f4), ($c6,$6b,$d3,$f9),
($af,$31,$a4,$b2), ($a4,$3f,$ad,$bf), ($b9,$2d,$b6,$a8), ($b2,$23,$bf,$a5),
($83,$09,$80,$86), ($88,$07,$89,$8b), ($95,$15,$92,$9c), ($9e,$1b,$9b,$91),
($47,$a1,$7c,$0a), ($4c,$af,$75,$07), ($51,$bd,$6e,$10), ($5a,$b3,$67,$1d),
($6b,$99,$58,$3e), ($60,$97,$51,$33), ($7d,$85,$4a,$24), ($76,$8b,$43,$29),
($1f,$d1,$34,$62), ($14,$df,$3d,$6f), ($09,$cd,$26,$78), ($02,$c3,$2f,$75),
($33,$e9,$10,$56), ($38,$e7,$19,$5b), ($25,$f5,$02,$4c), ($2e,$fb,$0b,$41),
($8c,$9a,$d7,$61), ($87,$94,$de,$6c), ($9a,$86,$c5,$7b), ($91,$88,$cc,$76),
($a0,$a2,$f3,$55), ($ab,$ac,$fa,$58), ($b6,$be,$e1,$4f), ($bd,$b0,$e8,$42),
($d4,$ea,$9f,$09), ($df,$e4,$96,$04), ($c2,$f6,$8d,$13), ($c9,$f8,$84,$1e),
($f8,$d2,$bb,$3d), ($f3,$dc,$b2,$30), ($ee,$ce,$a9,$27), ($e5,$c0,$a0,$2a),
($3c,$7a,$47,$b1), ($37,$74,$4e,$bc), ($2a,$66,$55,$ab), ($21,$68,$5c,$a6),
($10,$42,$63,$85), ($1b,$4c,$6a,$88), ($06,$5e,$71,$9f), ($0d,$50,$78,$92),
($64,$0a,$0f,$d9), ($6f,$04,$06,$d4), ($72,$16,$1d,$c3), ($79,$18,$14,$ce),
($48,$32,$2b,$ed), ($43,$3c,$22,$e0), ($5e,$2e,$39,$f7), ($55,$20,$30,$fa),
($01,$ec,$9a,$b7), ($0a,$e2,$93,$ba), ($17,$f0,$88,$ad), ($1c,$fe,$81,$a0),
($2d,$d4,$be,$83), ($26,$da,$b7,$8e), ($3b,$c8,$ac,$99), ($30,$c6,$a5,$94),
($59,$9c,$d2,$df), ($52,$92,$db,$d2), ($4f,$80,$c0,$c5), ($44,$8e,$c9,$c8),
($75,$a4,$f6,$eb), ($7e,$aa,$ff,$e6), ($63,$b8,$e4,$f1), ($68,$b6,$ed,$fc),
($b1,$0c,$0a,$67), ($ba,$02,$03,$6a), ($a7,$10,$18,$7d), ($ac,$1e,$11,$70),
($9d,$34,$2e,$53), ($96,$3a,$27,$5e), ($8b,$28,$3c,$49), ($80,$26,$35,$44),
($e9,$7c,$42,$0f), ($e2,$72,$4b,$02), ($ff,$60,$50,$15), ($f4,$6e,$59,$18),
($c5,$44,$66,$3b), ($ce,$4a,$6f,$36), ($d3,$58,$74,$21), ($d8,$56,$7d,$2c),
($7a,$37,$a1,$0c), ($71,$39,$a8,$01), ($6c,$2b,$b3,$16), ($67,$25,$ba,$1b),
($56,$0f,$85,$38), ($5d,$01,$8c,$35), ($40,$13,$97,$22), ($4b,$1d,$9e,$2f),
($22,$47,$e9,$64), ($29,$49,$e0,$69), ($34,$5b,$fb,$7e), ($3f,$55,$f2,$73),
($0e,$7f,$cd,$50), ($05,$71,$c4,$5d), ($18,$63,$df,$4a), ($13,$6d,$d6,$47),
($ca,$d7,$31,$dc), ($c1,$d9,$38,$d1), ($dc,$cb,$23,$c6), ($d7,$c5,$2a,$cb),
($e6,$ef,$15,$e8), ($ed,$e1,$1c,$e5), ($f0,$f3,$07,$f2), ($fb,$fd,$0e,$ff),
($92,$a7,$79,$b4), ($99,$a9,$70,$b9), ($84,$bb,$6b,$ae), ($8f,$b5,$62,$a3),
($be,$9f,$5d,$80), ($b5,$91,$54,$8d), ($a8,$83,$4f,$9a), ($a3,$8d,$46,$97));
U3: array[0..255,0..3] of byte= (
($00,$00,$00,$00), ($0d,$0b,$0e,$09), ($1a,$16,$1c,$12), ($17,$1d,$12,$1b),
($34,$2c,$38,$24), ($39,$27,$36,$2d), ($2e,$3a,$24,$36), ($23,$31,$2a,$3f),
($68,$58,$70,$48), ($65,$53,$7e,$41), ($72,$4e,$6c,$5a), ($7f,$45,$62,$53),
($5c,$74,$48,$6c), ($51,$7f,$46,$65), ($46,$62,$54,$7e), ($4b,$69,$5a,$77),
($d0,$b0,$e0,$90), ($dd,$bb,$ee,$99), ($ca,$a6,$fc,$82), ($c7,$ad,$f2,$8b),
($e4,$9c,$d8,$b4), ($e9,$97,$d6,$bd), ($fe,$8a,$c4,$a6), ($f3,$81,$ca,$af),
($b8,$e8,$90,$d8), ($b5,$e3,$9e,$d1), ($a2,$fe,$8c,$ca), ($af,$f5,$82,$c3),
($8c,$c4,$a8,$fc), ($81,$cf,$a6,$f5), ($96,$d2,$b4,$ee), ($9b,$d9,$ba,$e7),
($bb,$7b,$db,$3b), ($b6,$70,$d5,$32), ($a1,$6d,$c7,$29), ($ac,$66,$c9,$20),
($8f,$57,$e3,$1f), ($82,$5c,$ed,$16), ($95,$41,$ff,$0d), ($98,$4a,$f1,$04),
($d3,$23,$ab,$73), ($de,$28,$a5,$7a), ($c9,$35,$b7,$61), ($c4,$3e,$b9,$68),
($e7,$0f,$93,$57), ($ea,$04,$9d,$5e), ($fd,$19,$8f,$45), ($f0,$12,$81,$4c),
($6b,$cb,$3b,$ab), ($66,$c0,$35,$a2), ($71,$dd,$27,$b9), ($7c,$d6,$29,$b0),
($5f,$e7,$03,$8f), ($52,$ec,$0d,$86), ($45,$f1,$1f,$9d), ($48,$fa,$11,$94),
($03,$93,$4b,$e3), ($0e,$98,$45,$ea), ($19,$85,$57,$f1), ($14,$8e,$59,$f8),
($37,$bf,$73,$c7), ($3a,$b4,$7d,$ce), ($2d,$a9,$6f,$d5), ($20,$a2,$61,$dc),
($6d,$f6,$ad,$76), ($60,$fd,$a3,$7f), ($77,$e0,$b1,$64), ($7a,$eb,$bf,$6d),
($59,$da,$95,$52), ($54,$d1,$9b,$5b), ($43,$cc,$89,$40), ($4e,$c7,$87,$49),
($05,$ae,$dd,$3e), ($08,$a5,$d3,$37), ($1f,$b8,$c1,$2c), ($12,$b3,$cf,$25),
($31,$82,$e5,$1a), ($3c,$89,$eb,$13), ($2b,$94,$f9,$08), ($26,$9f,$f7,$01),
($bd,$46,$4d,$e6), ($b0,$4d,$43,$ef), ($a7,$50,$51,$f4), ($aa,$5b,$5f,$fd),
($89,$6a,$75,$c2), ($84,$61,$7b,$cb), ($93,$7c,$69,$d0), ($9e,$77,$67,$d9),
($d5,$1e,$3d,$ae), ($d8,$15,$33,$a7), ($cf,$08,$21,$bc), ($c2,$03,$2f,$b5),
($e1,$32,$05,$8a), ($ec,$39,$0b,$83), ($fb,$24,$19,$98), ($f6,$2f,$17,$91),
($d6,$8d,$76,$4d), ($db,$86,$78,$44), ($cc,$9b,$6a,$5f), ($c1,$90,$64,$56),
($e2,$a1,$4e,$69), ($ef,$aa,$40,$60), ($f8,$b7,$52,$7b), ($f5,$bc,$5c,$72),
($be,$d5,$06,$05), ($b3,$de,$08,$0c), ($a4,$c3,$1a,$17), ($a9,$c8,$14,$1e),
($8a,$f9,$3e,$21), ($87,$f2,$30,$28), ($90,$ef,$22,$33), ($9d,$e4,$2c,$3a),
($06,$3d,$96,$dd), ($0b,$36,$98,$d4), ($1c,$2b,$8a,$cf), ($11,$20,$84,$c6),
($32,$11,$ae,$f9), ($3f,$1a,$a0,$f0), ($28,$07,$b2,$eb), ($25,$0c,$bc,$e2),
($6e,$65,$e6,$95), ($63,$6e,$e8,$9c), ($74,$73,$fa,$87), ($79,$78,$f4,$8e),
($5a,$49,$de,$b1), ($57,$42,$d0,$b8), ($40,$5f,$c2,$a3), ($4d,$54,$cc,$aa),
($da,$f7,$41,$ec), ($d7,$fc,$4f,$e5), ($c0,$e1,$5d,$fe), ($cd,$ea,$53,$f7),
($ee,$db,$79,$c8), ($e3,$d0,$77,$c1), ($f4,$cd,$65,$da), ($f9,$c6,$6b,$d3),
($b2,$af,$31,$a4), ($bf,$a4,$3f,$ad), ($a8,$b9,$2d,$b6), ($a5,$b2,$23,$bf),
($86,$83,$09,$80), ($8b,$88,$07,$89), ($9c,$95,$15,$92), ($91,$9e,$1b,$9b),
($0a,$47,$a1,$7c), ($07,$4c,$af,$75), ($10,$51,$bd,$6e), ($1d,$5a,$b3,$67),
($3e,$6b,$99,$58), ($33,$60,$97,$51), ($24,$7d,$85,$4a), ($29,$76,$8b,$43),
($62,$1f,$d1,$34), ($6f,$14,$df,$3d), ($78,$09,$cd,$26), ($75,$02,$c3,$2f),
($56,$33,$e9,$10), ($5b,$38,$e7,$19), ($4c,$25,$f5,$02), ($41,$2e,$fb,$0b),
($61,$8c,$9a,$d7), ($6c,$87,$94,$de), ($7b,$9a,$86,$c5), ($76,$91,$88,$cc),
($55,$a0,$a2,$f3), ($58,$ab,$ac,$fa), ($4f,$b6,$be,$e1), ($42,$bd,$b0,$e8),
($09,$d4,$ea,$9f), ($04,$df,$e4,$96), ($13,$c2,$f6,$8d), ($1e,$c9,$f8,$84),
($3d,$f8,$d2,$bb), ($30,$f3,$dc,$b2), ($27,$ee,$ce,$a9), ($2a,$e5,$c0,$a0),
($b1,$3c,$7a,$47), ($bc,$37,$74,$4e), ($ab,$2a,$66,$55), ($a6,$21,$68,$5c),
($85,$10,$42,$63), ($88,$1b,$4c,$6a), ($9f,$06,$5e,$71), ($92,$0d,$50,$78),
($d9,$64,$0a,$0f), ($d4,$6f,$04,$06), ($c3,$72,$16,$1d), ($ce,$79,$18,$14),
($ed,$48,$32,$2b), ($e0,$43,$3c,$22), ($f7,$5e,$2e,$39), ($fa,$55,$20,$30),
($b7,$01,$ec,$9a), ($ba,$0a,$e2,$93), ($ad,$17,$f0,$88), ($a0,$1c,$fe,$81),
($83,$2d,$d4,$be), ($8e,$26,$da,$b7), ($99,$3b,$c8,$ac), ($94,$30,$c6,$a5),
($df,$59,$9c,$d2), ($d2,$52,$92,$db), ($c5,$4f,$80,$c0), ($c8,$44,$8e,$c9),
($eb,$75,$a4,$f6), ($e6,$7e,$aa,$ff), ($f1,$63,$b8,$e4), ($fc,$68,$b6,$ed),
($67,$b1,$0c,$0a), ($6a,$ba,$02,$03), ($7d,$a7,$10,$18), ($70,$ac,$1e,$11),
($53,$9d,$34,$2e), ($5e,$96,$3a,$27), ($49,$8b,$28,$3c), ($44,$80,$26,$35),
($0f,$e9,$7c,$42), ($02,$e2,$72,$4b), ($15,$ff,$60,$50), ($18,$f4,$6e,$59),
($3b,$c5,$44,$66), ($36,$ce,$4a,$6f), ($21,$d3,$58,$74), ($2c,$d8,$56,$7d),
($0c,$7a,$37,$a1), ($01,$71,$39,$a8), ($16,$6c,$2b,$b3), ($1b,$67,$25,$ba),
($38,$56,$0f,$85), ($35,$5d,$01,$8c), ($22,$40,$13,$97), ($2f,$4b,$1d,$9e),
($64,$22,$47,$e9), ($69,$29,$49,$e0), ($7e,$34,$5b,$fb), ($73,$3f,$55,$f2),
($50,$0e,$7f,$cd), ($5d,$05,$71,$c4), ($4a,$18,$63,$df), ($47,$13,$6d,$d6),
($dc,$ca,$d7,$31), ($d1,$c1,$d9,$38), ($c6,$dc,$cb,$23), ($cb,$d7,$c5,$2a),
($e8,$e6,$ef,$15), ($e5,$ed,$e1,$1c), ($f2,$f0,$f3,$07), ($ff,$fb,$fd,$0e),
($b4,$92,$a7,$79), ($b9,$99,$a9,$70), ($ae,$84,$bb,$6b), ($a3,$8f,$b5,$62),
($80,$be,$9f,$5d), ($8d,$b5,$91,$54), ($9a,$a8,$83,$4f), ($97,$a3,$8d,$46));
U4: array[0..255,0..3] of byte= (
($00,$00,$00,$00), ($09,$0d,$0b,$0e), ($12,$1a,$16,$1c), ($1b,$17,$1d,$12),
($24,$34,$2c,$38), ($2d,$39,$27,$36), ($36,$2e,$3a,$24), ($3f,$23,$31,$2a),
($48,$68,$58,$70), ($41,$65,$53,$7e), ($5a,$72,$4e,$6c), ($53,$7f,$45,$62),
($6c,$5c,$74,$48), ($65,$51,$7f,$46), ($7e,$46,$62,$54), ($77,$4b,$69,$5a),
($90,$d0,$b0,$e0), ($99,$dd,$bb,$ee), ($82,$ca,$a6,$fc), ($8b,$c7,$ad,$f2),
($b4,$e4,$9c,$d8), ($bd,$e9,$97,$d6), ($a6,$fe,$8a,$c4), ($af,$f3,$81,$ca),
($d8,$b8,$e8,$90), ($d1,$b5,$e3,$9e), ($ca,$a2,$fe,$8c), ($c3,$af,$f5,$82),
($fc,$8c,$c4,$a8), ($f5,$81,$cf,$a6), ($ee,$96,$d2,$b4), ($e7,$9b,$d9,$ba),
($3b,$bb,$7b,$db), ($32,$b6,$70,$d5), ($29,$a1,$6d,$c7), ($20,$ac,$66,$c9),
($1f,$8f,$57,$e3), ($16,$82,$5c,$ed), ($0d,$95,$41,$ff), ($04,$98,$4a,$f1),
($73,$d3,$23,$ab), ($7a,$de,$28,$a5), ($61,$c9,$35,$b7), ($68,$c4,$3e,$b9),
($57,$e7,$0f,$93), ($5e,$ea,$04,$9d), ($45,$fd,$19,$8f), ($4c,$f0,$12,$81),
($ab,$6b,$cb,$3b), ($a2,$66,$c0,$35), ($b9,$71,$dd,$27), ($b0,$7c,$d6,$29),
($8f,$5f,$e7,$03), ($86,$52,$ec,$0d), ($9d,$45,$f1,$1f), ($94,$48,$fa,$11),
($e3,$03,$93,$4b), ($ea,$0e,$98,$45), ($f1,$19,$85,$57), ($f8,$14,$8e,$59),
($c7,$37,$bf,$73), ($ce,$3a,$b4,$7d), ($d5,$2d,$a9,$6f), ($dc,$20,$a2,$61),
($76,$6d,$f6,$ad), ($7f,$60,$fd,$a3), ($64,$77,$e0,$b1), ($6d,$7a,$eb,$bf),
($52,$59,$da,$95), ($5b,$54,$d1,$9b), ($40,$43,$cc,$89), ($49,$4e,$c7,$87),
($3e,$05,$ae,$dd), ($37,$08,$a5,$d3), ($2c,$1f,$b8,$c1), ($25,$12,$b3,$cf),
($1a,$31,$82,$e5), ($13,$3c,$89,$eb), ($08,$2b,$94,$f9), ($01,$26,$9f,$f7),
($e6,$bd,$46,$4d), ($ef,$b0,$4d,$43), ($f4,$a7,$50,$51), ($fd,$aa,$5b,$5f),
($c2,$89,$6a,$75), ($cb,$84,$61,$7b), ($d0,$93,$7c,$69), ($d9,$9e,$77,$67),
($ae,$d5,$1e,$3d), ($a7,$d8,$15,$33), ($bc,$cf,$08,$21), ($b5,$c2,$03,$2f),
($8a,$e1,$32,$05), ($83,$ec,$39,$0b), ($98,$fb,$24,$19), ($91,$f6,$2f,$17),
($4d,$d6,$8d,$76), ($44,$db,$86,$78), ($5f,$cc,$9b,$6a), ($56,$c1,$90,$64),
($69,$e2,$a1,$4e), ($60,$ef,$aa,$40), ($7b,$f8,$b7,$52), ($72,$f5,$bc,$5c),
($05,$be,$d5,$06), ($0c,$b3,$de,$08), ($17,$a4,$c3,$1a), ($1e,$a9,$c8,$14),
($21,$8a,$f9,$3e), ($28,$87,$f2,$30), ($33,$90,$ef,$22), ($3a,$9d,$e4,$2c),
($dd,$06,$3d,$96), ($d4,$0b,$36,$98), ($cf,$1c,$2b,$8a), ($c6,$11,$20,$84),
($f9,$32,$11,$ae), ($f0,$3f,$1a,$a0), ($eb,$28,$07,$b2), ($e2,$25,$0c,$bc),
($95,$6e,$65,$e6), ($9c,$63,$6e,$e8), ($87,$74,$73,$fa), ($8e,$79,$78,$f4),
($b1,$5a,$49,$de), ($b8,$57,$42,$d0), ($a3,$40,$5f,$c2), ($aa,$4d,$54,$cc),
($ec,$da,$f7,$41), ($e5,$d7,$fc,$4f), ($fe,$c0,$e1,$5d), ($f7,$cd,$ea,$53),
($c8,$ee,$db,$79), ($c1,$e3,$d0,$77), ($da,$f4,$cd,$65), ($d3,$f9,$c6,$6b),
($a4,$b2,$af,$31), ($ad,$bf,$a4,$3f), ($b6,$a8,$b9,$2d), ($bf,$a5,$b2,$23),
($80,$86,$83,$09), ($89,$8b,$88,$07), ($92,$9c,$95,$15), ($9b,$91,$9e,$1b),
($7c,$0a,$47,$a1), ($75,$07,$4c,$af), ($6e,$10,$51,$bd), ($67,$1d,$5a,$b3),
($58,$3e,$6b,$99), ($51,$33,$60,$97), ($4a,$24,$7d,$85), ($43,$29,$76,$8b),
($34,$62,$1f,$d1), ($3d,$6f,$14,$df), ($26,$78,$09,$cd), ($2f,$75,$02,$c3),
($10,$56,$33,$e9), ($19,$5b,$38,$e7), ($02,$4c,$25,$f5), ($0b,$41,$2e,$fb),
($d7,$61,$8c,$9a), ($de,$6c,$87,$94), ($c5,$7b,$9a,$86), ($cc,$76,$91,$88),
($f3,$55,$a0,$a2), ($fa,$58,$ab,$ac), ($e1,$4f,$b6,$be), ($e8,$42,$bd,$b0),
($9f,$09,$d4,$ea), ($96,$04,$df,$e4), ($8d,$13,$c2,$f6), ($84,$1e,$c9,$f8),
($bb,$3d,$f8,$d2), ($b2,$30,$f3,$dc), ($a9,$27,$ee,$ce), ($a0,$2a,$e5,$c0),
($47,$b1,$3c,$7a), ($4e,$bc,$37,$74), ($55,$ab,$2a,$66), ($5c,$a6,$21,$68),
($63,$85,$10,$42), ($6a,$88,$1b,$4c), ($71,$9f,$06,$5e), ($78,$92,$0d,$50),
($0f,$d9,$64,$0a), ($06,$d4,$6f,$04), ($1d,$c3,$72,$16), ($14,$ce,$79,$18),
($2b,$ed,$48,$32), ($22,$e0,$43,$3c), ($39,$f7,$5e,$2e), ($30,$fa,$55,$20),
($9a,$b7,$01,$ec), ($93,$ba,$0a,$e2), ($88,$ad,$17,$f0), ($81,$a0,$1c,$fe),
($be,$83,$2d,$d4), ($b7,$8e,$26,$da), ($ac,$99,$3b,$c8), ($a5,$94,$30,$c6),
($d2,$df,$59,$9c), ($db,$d2,$52,$92), ($c0,$c5,$4f,$80), ($c9,$c8,$44,$8e),
($f6,$eb,$75,$a4), ($ff,$e6,$7e,$aa), ($e4,$f1,$63,$b8), ($ed,$fc,$68,$b6),
($0a,$67,$b1,$0c), ($03,$6a,$ba,$02), ($18,$7d,$a7,$10), ($11,$70,$ac,$1e),
($2e,$53,$9d,$34), ($27,$5e,$96,$3a), ($3c,$49,$8b,$28), ($35,$44,$80,$26),
($42,$0f,$e9,$7c), ($4b,$02,$e2,$72), ($50,$15,$ff,$60), ($59,$18,$f4,$6e),
($66,$3b,$c5,$44), ($6f,$36,$ce,$4a), ($74,$21,$d3,$58), ($7d,$2c,$d8,$56),
($a1,$0c,$7a,$37), ($a8,$01,$71,$39), ($b3,$16,$6c,$2b), ($ba,$1b,$67,$25),
($85,$38,$56,$0f), ($8c,$35,$5d,$01), ($97,$22,$40,$13), ($9e,$2f,$4b,$1d),
($e9,$64,$22,$47), ($e0,$69,$29,$49), ($fb,$7e,$34,$5b), ($f2,$73,$3f,$55),
($cd,$50,$0e,$7f), ($c4,$5d,$05,$71), ($df,$4a,$18,$63), ($d6,$47,$13,$6d),
($31,$dc,$ca,$d7), ($38,$d1,$c1,$d9), ($23,$c6,$dc,$cb), ($2a,$cb,$d7,$c5),
($15,$e8,$e6,$ef), ($1c,$e5,$ed,$e1), ($07,$f2,$f0,$f3), ($0e,$ff,$fb,$fd),
($79,$b4,$92,$a7), ($70,$b9,$99,$a9), ($6b,$ae,$84,$bb), ($62,$a3,$8f,$b5),
($5d,$80,$be,$9f), ($54,$8d,$b5,$91), ($4f,$9a,$a8,$83), ($46,$97,$a3,$8d));
rcon: array[0..29] of cardinal= (
$01, $02, $04, $08, $10, $20, $40, $80, $1b, $36, $6c, $d8, $ab, $4d, $9a,
$2f, $5e, $bc, $63, $c6, $97, $35, $6a, $d4, $b3, $7d, $fa, $ef, $c5, $91);
const
BCRJ = 4;
MAXROUNDSRJ= 14;
type
PRijndael = ^TRijndael;
TRijndael = object(TBlockCipher128)
protected
numrounds: longword;
rk, drk: array[0..MAXROUNDSRJ,0..7] of DWord;
public
procedure InitKey(const Key; Size: longword); virtual;
procedure Burn; virtual;
procedure EncryptECB(const InData; var OutData); virtual;
procedure DecryptECB(const InData; var OutData); virtual;
destructor Destroy; virtual;
end;
// Serpent cipher implementation
type
PSerpent = ^TSerpent;
TSerpent = object(TBlockCipher128)
protected
l_key: array[0..131] of dword;
public
procedure InitKey(const Key; Size: longword); virtual;
procedure Burn; virtual;
procedure EncryptECB(const InData; var OutData); virtual;
procedure DecryptECB(const InData; var OutData); virtual;
destructor Destroy; virtual;
end;
// TwoFish cipher implementation
const
p8x8: array[0..1,0..255] of byte= ((
$a9, $67, $b3, $e8, $04, $fd, $a3, $76,
$9a, $92, $80, $78, $e4, $dd, $d1, $38,
$0d, $c6, $35, $98, $18, $f7, $ec, $6c,
$43, $75, $37, $26, $fa, $13, $94, $48,
$f2, $d0, $8b, $30, $84, $54, $df, $23,
$19, $5b, $3d, $59, $f3, $ae, $a2, $82,
$63, $01, $83, $2e, $d9, $51, $9b, $7c,
$a6, $eb, $a5, $be, $16, $0c, $e3, $61,
$c0, $8c, $3a, $f5, $73, $2c, $25, $0b,
$bb, $4e, $89, $6b, $53, $6a, $b4, $f1,
$e1, $e6, $bd, $45, $e2, $f4, $b6, $66,
$cc, $95, $03, $56, $d4, $1c, $1e, $d7,
$fb, $c3, $8e, $b5, $e9, $cf, $bf, $ba,
$ea, $77, $39, $af, $33, $c9, $62, $71,
$81, $79, $09, $ad, $24, $cd, $f9, $d8,
$e5, $c5, $b9, $4d, $44, $08, $86, $e7,
$a1, $1d, $aa, $ed, $06, $70, $b2, $d2,
$41, $7b, $a0, $11, $31, $c2, $27, $90,
$20, $f6, $60, $ff, $96, $5c, $b1, $ab,
$9e, $9c, $52, $1b, $5f, $93, $0a, $ef,
$91, $85, $49, $ee, $2d, $4f, $8f, $3b,
$47, $87, $6d, $46, $d6, $3e, $69, $64,
$2a, $ce, $cb, $2f, $fc, $97, $05, $7a,
$ac, $7f, $d5, $1a, $4b, $0e, $a7, $5a,
$28, $14, $3f, $29, $88, $3c, $4c, $02,
$b8, $da, $b0, $17, $55, $1f, $8a, $7d,
$57, $c7, $8d, $74, $b7, $c4, $9f, $72,
$7e, $15, $22, $12, $58, $07, $99, $34,
$6e, $50, $de, $68, $65, $bc, $db, $f8,
$c8, $a8, $2b, $40, $dc, $fe, $32, $a4,
$ca, $10, $21, $f0, $d3, $5d, $0f, $00,
$6f, $9d, $36, $42, $4a, $5e, $c1, $e0),(
$75, $f3, $c6, $f4, $db, $7b, $fb, $c8,
$4a, $d3, $e6, $6b, $45, $7d, $e8, $4b,
$d6, $32, $d8, $fd, $37, $71, $f1, $e1,
$30, $0f, $f8, $1b, $87, $fa, $06, $3f,
$5e, $ba, $ae, $5b, $8a, $00, $bc, $9d,
$6d, $c1, $b1, $0e, $80, $5d, $d2, $d5,
$a0, $84, $07, $14, $b5, $90, $2c, $a3,
$b2, $73, $4c, $54, $92, $74, $36, $51,
$38, $b0, $bd, $5a, $fc, $60, $62, $96,
$6c, $42, $f7, $10, $7c, $28, $27, $8c,
$13, $95, $9c, $c7, $24, $46, $3b, $70,
$ca, $e3, $85, $cb, $11, $d0, $93, $b8,
$a6, $83, $20, $ff, $9f, $77, $c3, $cc,
$03, $6f, $08, $bf, $40, $e7, $2b, $e2,
$79, $0c, $aa, $82, $41, $3a, $ea, $b9,
$e4, $9a, $a4, $97, $7e, $da, $7a, $17,
$66, $94, $a1, $1d, $3d, $f0, $de, $b3,
$0b, $72, $a7, $1c, $ef, $d1, $53, $3e,
$8f, $33, $26, $5f, $ec, $76, $2a, $49,
$81, $88, $ee, $21, $c4, $1a, $eb, $d9,
$c5, $39, $99, $cd, $ad, $31, $8b, $01,
$18, $23, $dd, $1f, $4e, $2d, $f9, $48,
$4f, $f2, $65, $8e, $78, $5c, $58, $19,
$8d, $e5, $98, $57, $67, $7f, $05, $64,
$af, $63, $b6, $fe, $f5, $b7, $3c, $a5,
$ce, $e9, $68, $44, $e0, $4d, $43, $69,
$29, $2e, $ac, $15, $59, $a8, $0a, $9e,
$6e, $47, $df, $34, $35, $6a, $cf, $dc,
$22, $c9, $c0, $9b, $89, $d4, $ed, $ab,
$12, $a2, $0d, $52, $bb, $02, $2f, $a9,
$d7, $61, $1e, $b4, $50, $04, $f6, $c2,
$16, $25, $86, $56, $55, $09, $be, $91));
const
INPUTWHITEN= 0;
OUTPUTWHITEN= 4;
NUMROUNDSTF= 16;
ROUNDSUBKEYS= (OUTPUTWHITEN + 4);
TOTALSUBKEYS= (ROUNDSUBKEYS + NUMROUNDSTF * 2);
RS_GF_FDBK= $14d;
MDS_GF_FDBK= $169;
SK_STEP= $02020202;
SK_BUMP= $01010101;
SK_ROTL= 9;
type
PTwoFish = ^TTwoFish;
TTwoFish = object(TBlockCipher128)
protected
SubKeys: array[0..TOTALSUBKEYS-1] of DWord;
sbox: array[0..3,0..255] of DWord;
public
procedure InitKey(const Key; Size: longword); virtual;
procedure Burn; virtual;
procedure EncryptECB(const InData; var OutData); virtual;
procedure DecryptECB(const InData; var OutData); virtual;
destructor Destroy; virtual;
end;
type
PRC4 = ^TRC4;
TRC4 = object (TObj)
protected
KeyData, KeyOrg: array[0..255] of byte;
public
procedure InitKey(const Key; Size: longword; InitVector: pointer);
procedure Reset;
procedure Burn;
procedure Encrypt(const InData; var OutData; Size: longword);
procedure Decrypt(const InData; var OutData; Size: longword);
destructor Destroy; virtual;
end;
TKOLRijndael = PRijndael;
TKOLMars = PMars;
TKOLICE = PICE;
TKOLICE2 = PICE2;
TKOLThinICE = PThinICE;
TKOLDES = PDES;
TKOL3DES = P3DES;
TKOLTEA = PTEA;
TKOLRC2 = PRC2;
TKOLRC4 = PRC4;
TKOLRC5 = PRC5;
TKOLRC6 = PRC6;
TKOLMisty1 = PMisty1;
TKOLIDEA = PIDEA;
TKOLGOST = PGOST;
TKOLCast128 = PCast128;
TKOLCast256 = PCast256;
TKOLBlowfish = PBlowfish;
TKOLTwofish = PTwofish;
TKOLSerpent = PSerpent;
// TKOLBlockCipher64 = PBlockCipher64;
// TKOLBlockCipher128 = PBlockCipher128;
function NewSerpent: PSerpent;
function NewRijndael: PRijndael;
function NewICE: PICE;
function NewICE2: PICE2;
function NewThinICE: PThinICE;
function New3DES: P3DES;
function NewDES: PDES;
function NewTEA: PTEA;
function NewRC2: PRC2;
function NewRC4: PRC4;
function NewRC5: PRC5;
function NewRC6: PRC6;
function NewMisty1: PMisty1;
function NewIDEA: PIDEA;
function NewGOST: PGOST;
function NewCast256: PCast256;
function NewCast128: PCast128;
function NewBlowfish: PBlowfish;
function NewTwofish: PTwofish;
function NewMars: PMars;
//function NewBlockCipher64: PBlockCipher64;
//function NewBlockCipher128: PBlockCipher128;
implementation
// uses CommCtrl, ShellApi;
{--------------------}
{ Destructor ������� }
{--------------------}
destructor TBlockCipher64.Destroy;
begin
// All Strings := '';
// Free_And_Nil(All PObj);
inherited;
end;
////////////////////////////////////////////////////////////////////////////////
{-----------------------------}
{ ����������� ��� KOL ������� }
{-----------------------------}
//function NewBlockCipher64;
//begin
//New(Result, Create);
// code
//end;
////////////////////////////////////////////////////////////////////////////////
destructor TBlockCipher128.Destroy;
begin
// All Strings := '';
// Free_And_Nil(All PObj);
inherited;
end;
////////////////////////////////////////////////////////////////////////////////
{-----------------------------}
{ ����������� ��� KOL ������� }
{-----------------------------}
//function NewBlockCipher128;
//begin
//New(Result, Create);
// code
//end;
////////////////////////////////////////////////////////////////////////////////
procedure XorBlock(var InData1, InData2; Size: longword);
var
i: longword;
begin
for i:= 1 to Size do
Pbyte(longword(@InData1)+i-1)^:= Pbyte(longword(@InData1)+i-1)^ xor Pbyte(longword(@InData2)+i-1)^;
end;
procedure TBlockCipher64.EncryptECB(const Indata; var Outdata);
begin
end;
procedure TBlockCipher64.DecryptECB(const Indata; var Outdata);
begin
end;
procedure TBlockCipher64.InitKey(const Key; Size: longword);
begin
end;
procedure TBlockCipher128.EncryptECB(const Indata; var Outdata);
begin
end;
procedure TBlockCipher128.DecryptECB(const Indata; var Outdata);
begin
end;
procedure TBlockCipher128.InitKey(const Key; Size: longword);
begin
end;
procedure TBlockCipher64.IncCounter;
var
i: integer;
begin
Inc(CV[7]);
i:= 7;
while (i> 0) and (CV[i] = 0) do
begin
Inc(CV[i-1]);
Dec(i);
end;
end;
procedure TBlockCipher64.InitBlockCipher64(const Key; Size: longword; InitVector: pointer);
begin
{inherited}
//Init(Key,Size,InitVector);
InitKey(Key,Size);
if InitVector= nil then
begin
FillChar(IV,8,0);
EncryptECB(IV,IV);
Reset;
end
else
begin
Move(InitVector^,IV,8);
Reset;
end;
end;
procedure TBlockCipher64.SetIV(const Value);
begin
// if not fInitialized then
// raise EDCP_blockcipher.Create('Cipher not initialized');
Move(Value,IV,8);
Reset;
end;
procedure TBlockCipher64.GetIV(var Value);
begin
// if not fInitialized then
// raise EDCP_blockcipher.Create('Cipher not initialized');
Move(CV,Value,8);
end;
procedure TBlockCipher64.Reset;
begin
// if not fInitialized then
// raise EDCP_blockcipher.Create('Cipher not initialized')
// else
Move(IV,CV,8);
end;
procedure TBlockCipher64.Burn;
begin
FillChar(IV,8,$FF);
FillChar(CV,8,$FF);
// inherited Burn;
end;
procedure TBlockCipher64.EncryptCBC(const Indata; var Outdata; Size: longword);
var
i: longword;
p1, p2: pointer;
begin
// if not fInitialized then
// raise EDCP_blockcipher.Create('Cipher not initialized');
p1:= @Indata;
p2:= @Outdata;
for i:= 1 to (Size div 8) do
begin
Move(p1^,p2^,8);
XorBlock(p2^,CV,8);
EncryptECB(p2^,p2^);
Move(p2^,CV,8);
p1:= pointer(longword(p1) + 8);
p2:= pointer(longword(p2) + 8);
end;
if (Size mod 8)<> 0 then
begin
EncryptECB(CV,CV);
Move(p1^,p2^,Size mod 8);
XorBlock(p2^,CV,Size mod 8);
end;
end;
procedure TBlockCipher64.DecryptCBC(const Indata; var Outdata; Size: longword);
var
i: longword;
p1, p2: pointer;
Temp: array[0..7] of byte;
begin
// if not fInitialized then
// raise EDCP_blockcipher.Create('Cipher not initialized');
p1:= @Indata;
p2:= @Outdata;
for i:= 1 to (Size div 8) do
begin
Move(p1^,p2^,8);
Move(p1^,Temp,8);
DecryptECB(p2^,p2^);
XorBlock(p2^,CV,8);
Move(Temp,CV,8);
p1:= pointer(longword(p1) + 8);
p2:= pointer(longword(p2) + 8);
end;
if (Size mod 8)<> 0 then
begin
EncryptECB(CV,CV);
Move(p1^,p2^,Size mod 8);
XorBlock(p2^,CV,Size mod 8);
end;
end;
procedure TBlockCipher64.EncryptCFB8bit(const Indata; var Outdata; Size: longword);
var
i: longword;
p1, p2: Pbyte;
Temp: array[0..7] of byte;
begin
// if not fInitialized then
// raise EDCP_blockcipher.Create('Cipher not initialized');
p1:= @Indata;
p2:= @Outdata;
for i:= 1 to Size do
begin
EncryptECB(CV,Temp);
p2^:= p1^ xor Temp[0];
Move(CV[1],CV[0],8-1);
CV[7]:= p2^;
Inc(p1);
Inc(p2);
end;
end;
procedure TBlockCipher64.DecryptCFB8bit(const Indata; var Outdata; Size: longword);
var
i: longword;
p1, p2: Pbyte;
TempByte: byte;
Temp: array[0..7] of byte;
begin
// if not fInitialized then
// raise EDCP_blockcipher.Create('Cipher not initialized');
p1:= @Indata;
p2:= @Outdata;
for i:= 1 to Size do
begin
TempByte:= p1^;
EncryptECB(CV,Temp);
p2^:= p1^ xor Temp[0];
Move(CV[1],CV[0],8-1);
CV[7]:= TempByte;
Inc(p1);
Inc(p2);
end;
end;
procedure TBlockCipher64.EncryptCFBblock(const Indata; var Outdata; Size: longword);
var
i: longword;
p1, p2: Pbyte;
begin
// if not fInitialized then
// raise EDCP_blockcipher.Create('Cipher not initialized');
p1:= @Indata;
p2:= @Outdata;
for i:= 1 to (Size div 8) do
begin
EncryptECB(CV,CV);
Move(p1^,p2^,8);
XorBlock(p2^,CV,8);
Move(p2^,CV,8);
p1:= pointer(longword(p1) + 8);
p2:= pointer(longword(p2) + 8);
end;
if (Size mod 8)<> 0 then
begin
EncryptECB(CV,CV);
Move(p1^,p2^,Size mod 8);
XorBlock(p2^,CV,Size mod 8);
end;
end;
procedure TBlockCipher64.DecryptCFBblock(const Indata; var Outdata; Size: longword);
var
i: longword;
p1, p2: Pbyte;
Temp: array[0..7] of byte;
begin
// if not fInitialized then
// raise EDCP_blockcipher.Create('Cipher not initialized');
p1:= @Indata;
p2:= @Outdata;
for i:= 1 to (Size div 8) do
begin
Move(p1^,Temp,8);
EncryptECB(CV,CV);
Move(p1^,p2^,8);
XorBlock(p2^,CV,8);
Move(Temp,CV,8);
p1:= pointer(longword(p1) + 8);
p2:= pointer(longword(p2) + 8);
end;
if (Size mod 8)<> 0 then
begin
EncryptECB(CV,CV);
Move(p1^,p2^,Size mod 8);
XorBlock(p2^,CV,Size mod 8);
end;
end;
procedure TBlockCipher64.EncryptOFB(const Indata; var Outdata; Size: longword);
var
i: longword;
p1, p2: pointer;
begin
// if not fInitialized then
// raise EDCP_blockcipher.Create('Cipher not initialized');
p1:= @Indata;
p2:= @Outdata;
for i:= 1 to (Size div 8) do
begin
EncryptECB(CV,CV);
Move(p1^,p2^,8);
XorBlock(p2^,CV,8);
p1:= pointer(longword(p1) + 8);
p2:= pointer(longword(p2) + 8);
end;
if (Size mod 8)<> 0 then
begin
EncryptECB(CV,CV);
Move(p1^,p2^,Size mod 8);
XorBlock(p2^,CV,Size mod 8);
end;
end;
procedure TBlockCipher64.DecryptOFB(const Indata; var Outdata; Size: longword);
var
i: longword;
p1, p2: pointer;
begin
// if not fInitialized then
// raise EDCP_blockcipher.Create('Cipher not initialized');
p1:= @Indata;
p2:= @Outdata;
for i:= 1 to (Size div 8) do
begin
EncryptECB(CV,CV);
Move(p1^,p2^,8);
XorBlock(p2^,CV,8);
p1:= pointer(longword(p1) + 8);
p2:= pointer(longword(p2) + 8);
end;
if (Size mod 8)<> 0 then
begin
EncryptECB(CV,CV);
Move(p1^,p2^,Size mod 8);
XorBlock(p2^,CV,Size mod 8);
end;
end;
procedure TBlockCipher64.EncryptCTR(const Indata; var Outdata; Size: longword);
var
temp: array[0..7] of byte;
i: longword;
p1, p2: pointer;
begin
// if not fInitialized then
// raise EDCP_blockcipher.Create('Cipher not initialized');
p1:= @Indata;
p2:= @Outdata;
for i:= 1 to (Size div 8) do
begin
EncryptECB(CV,temp);
IncCounter;
Move(p1^,p2^,8);
XorBlock(p2^,temp,8);
p1:= pointer(longword(p1) + 8);
p2:= pointer(longword(p2) + 8);
end;
if (Size mod 8)<> 0 then
begin
EncryptECB(CV,temp);
IncCounter;
Move(p1^,p2^,Size mod 8);
XorBlock(p2^,temp,Size mod 8);
end;
end;
procedure TBlockCipher64.DecryptCTR(const Indata; var Outdata; Size: longword);
var
temp: array[0..7] of byte;
i: longword;
p1, p2: pointer;
begin
// if not fInitialized then
// raise EDCP_blockcipher.Create('Cipher not initialized');
p1:= @Indata;
p2:= @Outdata;
for i:= 1 to (Size div 8) do
begin
EncryptECB(CV,temp);
IncCounter;
Move(p1^,p2^,8);
XorBlock(p2^,temp,8);
p1:= pointer(longword(p1) + 8);
p2:= pointer(longword(p2) + 8);
end;
if (Size mod 8)<> 0 then
begin
EncryptECB(CV,temp);
IncCounter;
Move(p1^,p2^,Size mod 8);
XorBlock(p2^,temp,Size mod 8);
end;
end;
{** TBlockCipher128 ********************************************************}
procedure TBlockCipher128.IncCounter;
var
i: integer;
begin
Inc(CV[15]);
i:= 15;
while (i> 0) and (CV[i] = 0) do
begin
Inc(CV[i-1]);
Dec(i);
end;
end;
procedure TBlockCipher128.InitBlockCipher128(const Key; Size: longword; InitVector: pointer);
begin
// inherited Init(Key,Size,InitVector);
InitKey(Key,Size);
if InitVector= nil then
begin
FillChar(IV,16,0);
EncryptECB(IV,IV);
Reset;
end
else
begin
Move(InitVector^,IV,16);
Reset;
end;
end;
procedure TBlockCipher128.SetIV(const Value);
begin
// if not fInitialized then
// raise EDCP_blockcipher.Create('Cipher not initialized');
Move(Value,IV,16);
Reset;
end;
procedure TBlockCipher128.GetIV(var Value);
begin
// if not fInitialized then
// raise EDCP_blockcipher.Create('Cipher not initialized');
Move(CV,Value,16);
end;
procedure TBlockCipher128.Reset;
begin
// if not fInitialized then
// raise EDCP_blockcipher.Create('Cipher not initialized')
// else
Move(IV,CV,16);
end;
procedure TBlockCipher128.Burn;
begin
FillChar(IV,16,$FF);
FillChar(CV,16,$FF);
// inherited Burn;
end;
procedure TBlockCipher128.EncryptCBC(const Indata; var Outdata; Size: longword);
var
i: longword;
p1, p2: pointer;
begin
// if not fInitialized then
// raise EDCP_blockcipher.Create('Cipher not initialized');
p1:= @Indata;
p2:= @Outdata;
for i:= 1 to (Size div 16) do
begin
Move(p1^,p2^,16);
XorBlock(p2^,CV,16);
EncryptECB(p2^,p2^);
Move(p2^,CV,16);
p1:= pointer(longword(p1) + 16);
p2:= pointer(longword(p2) + 16);
end;
if (Size mod 16)<> 0 then
begin
EncryptECB(CV,CV);
Move(p1^,p2^,Size mod 16);
XorBlock(p2^,CV,Size mod 16);
end;
end;
procedure TBlockCipher128.DecryptCBC(const Indata; var Outdata; Size: longword);
var
i: longword;
p1, p2: pointer;
Temp: array[0..15] of byte;
begin
// if not fInitialized then
// raise EDCP_blockcipher.Create('Cipher not initialized');
p1:= @Indata;
p2:= @Outdata;
for i:= 1 to (Size div 16) do
begin
Move(p1^,p2^,16);
Move(p1^,Temp,16);
DecryptECB(p2^,p2^);
XorBlock(p2^,CV,16);
Move(Temp,CV,16);
p1:= pointer(longword(p1) + 16);
p2:= pointer(longword(p2) + 16);
end;
if (Size mod 16)<> 0 then
begin
EncryptECB(CV,CV);
Move(p1^,p2^,Size mod 16);
XorBlock(p2^,CV,Size mod 16);
end;
end;
procedure TBlockCipher128.EncryptCFB8bit(const Indata; var Outdata; Size: longword);
var
i: longword;
p1, p2: Pbyte;
Temp: array[0..15] of byte;
begin
// if not fInitialized then
// raise EDCP_blockcipher.Create('Cipher not initialized');
p1:= @Indata;
p2:= @Outdata;
for i:= 1 to Size do
begin
EncryptECB(CV,Temp);
p2^:= p1^ xor Temp[0];
Move(CV[1],CV[0],15);
CV[15]:= p2^;
Inc(p1);
Inc(p2);
end;
end;
procedure TBlockCipher128.DecryptCFB8bit(const Indata; var Outdata; Size: longword);
var
i: longword;
p1, p2: Pbyte;
TempByte: byte;
Temp: array[0..15] of byte;
begin
// if not fInitialized then
// raise EDCP_blockcipher.Create('Cipher not initialized');
p1:= @Indata;
p2:= @Outdata;
for i:= 1 to Size do
begin
TempByte:= p1^;
EncryptECB(CV,Temp);
p2^:= p1^ xor Temp[0];
Move(CV[1],CV[0],15);
CV[15]:= TempByte;
Inc(p1);
Inc(p2);
end;
end;
procedure TBlockCipher128.EncryptCFBblock(const Indata; var Outdata; Size: longword);
var
i: longword;
p1, p2: Pbyte;
begin
// if not fInitialized then
// raise EDCP_blockcipher.Create('Cipher not initialized');
p1:= @Indata;
p2:= @Outdata;
for i:= 1 to (Size div 16) do
begin
EncryptECB(CV,CV);
Move(p1^,p2^,16);
XorBlock(p2^,CV,16);
Move(p2^,CV,16);
p1:= pointer(longword(p1) + 16);
p2:= pointer(longword(p2) + 16);
end;
if (Size mod 16)<> 0 then
begin
EncryptECB(CV,CV);
Move(p1^,p2^,Size mod 16);
XorBlock(p2^,CV,Size mod 16);
end;
end;
procedure TBlockCipher128.DecryptCFBblock(const Indata; var Outdata; Size: longword);
var
i: longword;
p1, p2: Pbyte;
Temp: array[0..15] of byte;
begin
// if not fInitialized then
// raise EDCP_blockcipher.Create('Cipher not initialized');
p1:= @Indata;
p2:= @Outdata;
for i:= 1 to (Size div 16) do
begin
Move(p1^,Temp,16);
EncryptECB(CV,CV);
Move(p1^,p2^,16);
XorBlock(p2^,CV,16);
Move(Temp,CV,16);
p1:= pointer(longword(p1) + 16);
p2:= pointer(longword(p2) + 16);
end;
if (Size mod 16)<> 0 then
begin
EncryptECB(CV,CV);
Move(p1^,p2^,Size mod 16);
XorBlock(p2^,CV,Size mod 16);
end;
end;
procedure TBlockCipher128.EncryptOFB(const Indata; var Outdata; Size: longword);
var
i: longword;
p1, p2: pointer;
begin
// if not fInitialized then
// raise EDCP_blockcipher.Create('Cipher not initialized');
p1:= @Indata;
p2:= @Outdata;
for i:= 1 to (Size div 16) do
begin
EncryptECB(CV,CV);
Move(p1^,p2^,16);
XorBlock(p2^,CV,16);
p1:= pointer(longword(p1) + 16);
p2:= pointer(longword(p2) + 16);
end;
if (Size mod 16)<> 0 then
begin
EncryptECB(CV,CV);
Move(p1^,p2^,Size mod 16);
XorBlock(p2^,CV,Size mod 16);
end;
end;
procedure TBlockCipher128.DecryptOFB(const Indata; var Outdata; Size: longword);
var
i: longword;
p1, p2: pointer;
begin
// if not fInitialized then
// raise EDCP_blockcipher.Create('Cipher not initialized');
p1:= @Indata;
p2:= @Outdata;
for i:= 1 to (Size div 16) do
begin
EncryptECB(CV,CV);
Move(p1^,p2^,16);
XorBlock(p2^,CV,16);
p1:= pointer(longword(p1) + 16);
p2:= pointer(longword(p2) + 16);
end;
if (Size mod 16)<> 0 then
begin
EncryptECB(CV,CV);
Move(p1^,p2^,Size mod 16);
XorBlock(p2^,CV,Size mod 16);
end;
end;
procedure TBlockCipher128.EncryptCTR(const Indata; var Outdata; Size: longword);
var
temp: array[0..15] of byte;
i: longword;
p1, p2: pointer;
begin
// if not fInitialized then
// raise EDCP_blockcipher.Create('Cipher not initialized');
p1:= @Indata;
p2:= @Outdata;
for i:= 1 to (Size div 16) do
begin
EncryptECB(CV,temp);
IncCounter;
Move(p1^,p2^,16);
XorBlock(p2^,temp,16);
p1:= pointer(longword(p1) + 16);
p2:= pointer(longword(p2) + 16);
end;
if (Size mod 16)<> 0 then
begin
EncryptECB(CV,temp);
IncCounter;
Move(p1^,p2^,Size mod 16);
XorBlock(p2^,temp,Size mod 16);
end;
end;
procedure TBlockCipher128.DecryptCTR(const Indata; var Outdata; Size: longword);
var
temp: array[0..15] of byte;
i: longword;
p1, p2: pointer;
begin
// if not fInitialized then
// raise EDCP_blockcipher.Create('Cipher not initialized');
p1:= @Indata;
p2:= @Outdata;
for i:= 1 to (Size div 16) do
begin
EncryptECB(CV,temp);
IncCounter;
Move(p1^,p2^,16);
XorBlock(p2^,temp,16);
p1:= pointer(longword(p1) + 16);
p2:= pointer(longword(p2) + 16);
end;
if (Size mod 16)<> 0 then
begin
EncryptECB(CV,temp);
IncCounter;
Move(p1^,p2^,Size mod 16);
XorBlock(p2^,temp,Size mod 16);
end;
end;
{--------------------}
{ Destructor ������� }
{--------------------}
destructor TBlowfish.Destroy;
begin
// All Strings := '';
// Free_And_Nil(All PObj);
inherited;
end;
////////////////////////////////////////////////////////////////////////////////
{-----------------------------}
{ ����������� ��� KOL ������� }
{-----------------------------}
function NewBlowfish;
begin
New(Result, Create);
// code
end;
////////////////////////////////////////////////////////////////////////////////
{$R-}{$Q-}
//{$I DCPblowfish.inc}
procedure TBlowfish.InitKey(const Key; Size: longword);
var
i, k: longword;
A: DWord;
KeyB: PByteArray;
Block: array[0..7] of byte;
begin
burn;
Size:= Size div 8;
KeyB:= @Key;
Move(SBoxOrg,SBox,Sizeof(SBox));
Move(PBoxOrg,PBox,Sizeof(PBox));
k:= 0;
for i:= 0 to 17 do
begin
A:= dword(KeyB^[(k+3) mod Size]);
A:= A + (dword(KeyB^[(k+2) mod Size]) shl 8);
A:= A + (dword(KeyB^[(k+1) mod Size]) shl 16);
A:= A + (dword(KeyB^[k]) shl 24);
PBox[i]:= PBox[i] xor A;
k:= (k+4) mod Size;
end;
FillChar(Block,Sizeof(Block),0);
for i:= 0 to 8 do
begin
EncryptECB(Block,Block);
PBox[i*2]:= dword(Block[3]) + (dword(Block[2]) shl 8) + (dword(Block[1]) shl 16) + (dword(Block[0]) shl 24);
PBox[i*2+1]:= dword(Block[7]) + (dword(Block[6]) shl 8) + (dword(Block[5]) shl 16) + (dword(Block[4]) shl 24);
end;
for k:= 0 to 3 do
begin
for i:= 0 to 127 do
begin
EncryptECB(Block,Block);
SBox[k,i*2]:= dword(Block[3]) + (dword(Block[2]) shl 8) + (dword(Block[1]) shl 16) + (dword(Block[0]) shl 24);
SBox[k,i*2+1]:= dword(Block[7]) + (dword(Block[6]) shl 8) + (dword(Block[5]) shl 16) + (dword(Block[4]) shl 24);
end;
end;
end;
procedure TBlowfish.Burn;
begin
FillChar(SBox,Sizeof(SBox),$FF);
FillChar(PBox,Sizeof(PBox),$FF);
inherited Burn;
end;
procedure TBlowfish.EncryptECB(const InData; var OutData);
var
xL, xR: DWord;
begin
// if not fInitialized then
// raise EDCP_blockcipher.Create('Cipher not initialized');
xL:= Pdword(@InData)^;
xR:= Pdword(longword(@InData)+4)^;
xL:= ((xL and $FF) shl 24) or ((xL and $FF00) shl 8) or ((xL and $FF0000) shr 8) or ((xL and $FF000000) shr 24);
xR:= ((xR and $FF) shl 24) or ((xR and $FF00) shl 8) or ((xR and $FF0000) shr 8) or ((xR and $FF000000) shr 24);
xL:= xL xor PBox[0];
xR:= xR xor (((SBox[0,(xL shr 24) and $FF] + SBox[1,(xL shr 16) and $FF]) xor
SBox[2,(xL shr 8) and $FF]) + SBox[3,xL and $FF]) xor PBox[1];
xL:= xL xor (((SBox[0,(xR shr 24) and $FF] + SBox[1,(xR shr 16) and $FF]) xor
SBox[2,(xR shr 8) and $FF]) + SBox[3,xR and $FF]) xor PBox[2];
xR:= xR xor (((SBox[0,(xL shr 24) and $FF] + SBox[1,(xL shr 16) and $FF]) xor
SBox[2,(xL shr 8) and $FF]) + SBox[3,xL and $FF]) xor PBox[3];
xL:= xL xor (((SBox[0,(xR shr 24) and $FF] + SBox[1,(xR shr 16) and $FF]) xor
SBox[2,(xR shr 8) and $FF]) + SBox[3,xR and $FF]) xor PBox[4];
xR:= xR xor (((SBox[0,(xL shr 24) and $FF] + SBox[1,(xL shr 16) and $FF]) xor
SBox[2,(xL shr 8) and $FF]) + SBox[3,xL and $FF]) xor PBox[5];
xL:= xL xor (((SBox[0,(xR shr 24) and $FF] + SBox[1,(xR shr 16) and $FF]) xor
SBox[2,(xR shr 8) and $FF]) + SBox[3,xR and $FF]) xor PBox[6];
xR:= xR xor (((SBox[0,(xL shr 24) and $FF] + SBox[1,(xL shr 16) and $FF]) xor
SBox[2,(xL shr 8) and $FF]) + SBox[3,xL and $FF]) xor PBox[7];
xL:= xL xor (((SBox[0,(xR shr 24) and $FF] + SBox[1,(xR shr 16) and $FF]) xor
SBox[2,(xR shr 8) and $FF]) + SBox[3,xR and $FF]) xor PBox[8];
xR:= xR xor (((SBox[0,(xL shr 24) and $FF] + SBox[1,(xL shr 16) and $FF]) xor
SBox[2,(xL shr 8) and $FF]) + SBox[3,xL and $FF]) xor PBox[9];
xL:= xL xor (((SBox[0,(xR shr 24) and $FF] + SBox[1,(xR shr 16) and $FF]) xor
SBox[2,(xR shr 8) and $FF]) + SBox[3,xR and $FF]) xor PBox[10];
xR:= xR xor (((SBox[0,(xL shr 24) and $FF] + SBox[1,(xL shr 16) and $FF]) xor
SBox[2,(xL shr 8) and $FF]) + SBox[3,xL and $FF]) xor PBox[11];
xL:= xL xor (((SBox[0,(xR shr 24) and $FF] + SBox[1,(xR shr 16) and $FF]) xor
SBox[2,(xR shr 8) and $FF]) + SBox[3,xR and $FF]) xor PBox[12];
xR:= xR xor (((SBox[0,(xL shr 24) and $FF] + SBox[1,(xL shr 16) and $FF]) xor
SBox[2,(xL shr 8) and $FF]) + SBox[3,xL and $FF]) xor PBox[13];
xL:= xL xor (((SBox[0,(xR shr 24) and $FF] + SBox[1,(xR shr 16) and $FF]) xor
SBox[2,(xR shr 8) and $FF]) + SBox[3,xR and $FF]) xor PBox[14];
xR:= xR xor (((SBox[0,(xL shr 24) and $FF] + SBox[1,(xL shr 16) and $FF]) xor
SBox[2,(xL shr 8) and $FF]) + SBox[3,xL and $FF]) xor PBox[15];
xL:= xL xor (((SBox[0,(xR shr 24) and $FF] + SBox[1,(xR shr 16) and $FF]) xor
SBox[2,(xR shr 8) and $FF]) + SBox[3,xR and $FF]) xor PBox[16];
xR:= xR xor PBox[17];
xL:= ((xL and $FF) shl 24) or ((xL and $FF00) shl 8) or ((xL and $FF0000) shr 8) or ((xL and $FF000000) shr 24);
xR:= ((xR and $FF) shl 24) or ((xR and $FF00) shl 8) or ((xR and $FF0000) shr 8) or ((xR and $FF000000) shr 24);
Pdword(@OutData)^:= xR;
Pdword(longword(@OutData)+4)^:= xL;
end;
procedure TBlowfish.DecryptECB(const InData; var OutData);
var
xL, xR: DWord;
begin
// if not fInitialized then
// raise EDCP_blockcipher.Create('Cipher not initialized');
xL:= Pdword(@InData)^;
xR:= Pdword(longword(@InData)+4)^;
xL:= (xL shr 24) or ((xL shr 8) and $FF00) or ((xL shl 8) and $FF0000) or (xL shl 24);
xR:= (xR shr 24) or ((xR shr 8) and $FF00) or ((xR shl 8) and $FF0000) or (xR shl 24);
xL:= xL xor PBox[17];
xR:= xR xor (((SBox[0,(xL shr 24) and $FF] + SBox[1,(xL shr 16) and $FF]) xor
SBox[2,(xL shr 8) and $FF]) + SBox[3,xL and $FF]) xor PBox[16];
xL:= xL xor (((SBox[0,(xR shr 24) and $FF] + SBox[1,(xR shr 16) and $FF]) xor
SBox[2,(xR shr 8) and $FF]) + SBox[3,xR and $FF]) xor PBox[15];
xR:= xR xor (((SBox[0,(xL shr 24) and $FF] + SBox[1,(xL shr 16) and $FF]) xor
SBox[2,(xL shr 8) and $FF]) + SBox[3,xL and $FF]) xor PBox[14];
xL:= xL xor (((SBox[0,(xR shr 24) and $FF] + SBox[1,(xR shr 16) and $FF]) xor
SBox[2,(xR shr 8) and $FF]) + SBox[3,xR and $FF]) xor PBox[13];
xR:= xR xor (((SBox[0,(xL shr 24) and $FF] + SBox[1,(xL shr 16) and $FF]) xor
SBox[2,(xL shr 8) and $FF]) + SBox[3,xL and $FF]) xor PBox[12];
xL:= xL xor (((SBox[0,(xR shr 24) and $FF] + SBox[1,(xR shr 16) and $FF]) xor
SBox[2,(xR shr 8) and $FF]) + SBox[3,xR and $FF]) xor PBox[11];
xR:= xR xor (((SBox[0,(xL shr 24) and $FF] + SBox[1,(xL shr 16) and $FF]) xor
SBox[2,(xL shr 8) and $FF]) + SBox[3,xL and $FF]) xor PBox[10];
xL:= xL xor (((SBox[0,(xR shr 24) and $FF] + SBox[1,(xR shr 16) and $FF]) xor
SBox[2,(xR shr 8) and $FF]) + SBox[3,xR and $FF]) xor PBox[9];
xR:= xR xor (((SBox[0,(xL shr 24) and $FF] + SBox[1,(xL shr 16) and $FF]) xor
SBox[2,(xL shr 8) and $FF]) + SBox[3,xL and $FF]) xor PBox[8];
xL:= xL xor (((SBox[0,(xR shr 24) and $FF] + SBox[1,(xR shr 16) and $FF]) xor
SBox[2,(xR shr 8) and $FF]) + SBox[3,xR and $FF]) xor PBox[7];
xR:= xR xor (((SBox[0,(xL shr 24) and $FF] + SBox[1,(xL shr 16) and $FF]) xor
SBox[2,(xL shr 8) and $FF]) + SBox[3,xL and $FF]) xor PBox[6];
xL:= xL xor (((SBox[0,(xR shr 24) and $FF] + SBox[1,(xR shr 16) and $FF]) xor
SBox[2,(xR shr 8) and $FF]) + SBox[3,xR and $FF]) xor PBox[5];
xR:= xR xor (((SBox[0,(xL shr 24) and $FF] + SBox[1,(xL shr 16) and $FF]) xor
SBox[2,(xL shr 8) and $FF]) + SBox[3,xL and $FF]) xor PBox[4];
xL:= xL xor (((SBox[0,(xR shr 24) and $FF] + SBox[1,(xR shr 16) and $FF]) xor
SBox[2,(xR shr 8) and $FF]) + SBox[3,xR and $FF]) xor PBox[3];
xR:= xR xor (((SBox[0,(xL shr 24) and $FF] + SBox[1,(xL shr 16) and $FF]) xor
SBox[2,(xL shr 8) and $FF]) + SBox[3,xL and $FF]) xor PBox[2];
xL:= xL xor (((SBox[0,(xR shr 24) and $FF] + SBox[1,(xR shr 16) and $FF]) xor
SBox[2,(xR shr 8) and $FF]) + SBox[3,xR and $FF]) xor PBox[1];
xR:= xR xor PBox[0];
xL:= (xL shr 24) or ((xL shr 8) and $FF00) or ((xL shl 8) and $FF0000) or (xL shl 24);
xR:= (xR shr 24) or ((xR shr 8) and $FF00) or ((xR shl 8) and $FF0000) or (xR shl 24);
Pdword(@OutData)^:= xR;
Pdword(longword(@OutData)+4)^:= xL;
end;
{$R-}{$Q-}
{--------------------}
{ Destructor ������� }
{--------------------}
destructor TCast128.Destroy;
begin
// All Strings := '';
// Free_And_Nil(All PObj);
inherited;
end;
////////////////////////////////////////////////////////////////////////////////
{-----------------------------}
{ ����������� ��� KOL ������� }
{-----------------------------}
function NewCast128;
begin
New(Result, Create);
// code
end;
////////////////////////////////////////////////////////////////////////////////
function LRot32(a, n: dword): dword;
begin
Result:= (a shl n) or (a shr (32-n));
end;
procedure TCast128.InitKey(const Key; Size: longword);
var
x, t, z: array[0..3] of DWord;
i: longword;
begin
burn;
Size:= Size div 8;
if Size<= 10 then
Rounds:= 12
else
Rounds:= 16;
FillChar(x,Sizeof(x),0);
Move(Key,x,Size);
x[0]:= (x[0] shr 24) or ((x[0] shr 8) and $FF00) or ((x[0] shl 8) and $FF0000) or (x[0] shl 24);
x[1]:= (x[1] shr 24) or ((x[1] shr 8) and $FF00) or ((x[1] shl 8) and $FF0000) or (x[1] shl 24);
x[2]:= (x[2] shr 24) or ((x[2] shr 8) and $FF00) or ((x[2] shl 8) and $FF0000) or (x[2] shl 24);
x[3]:= (x[3] shr 24) or ((x[3] shr 8) and $FF00) or ((x[3] shl 8) and $FF0000) or (x[3] shl 24);
i:= 0;
while i< 32 do
begin
case (i and 4) of
0:
begin
z[0]:= x[0] xor cast_sbox5[(x[3] shr 16) and $FF] xor
cast_sbox6[x[3] and $FF] xor cast_sbox7[x[3] shr 24] xor
cast_sbox8[(x[3] shr 8) and $FF] xor cast_sbox7[x[2] shr 24];
t[0]:= z[0];
z[1]:= x[2] xor cast_sbox5[z[0] shr 24] xor
cast_sbox6[(z[0] shr 8) and $FF] xor cast_sbox7[(z[0] shr 16) and $FF] xor
cast_sbox8[z[0] and $FF] xor cast_sbox8[(x[2] shr 8) and $FF];
t[1]:= z[1];
z[2]:= x[3] xor cast_sbox5[z[1] and $FF] xor
cast_sbox6[(z[1] shr 8) and $FF] xor cast_sbox7[(z[1] shr 16) and $FF] xor
cast_sbox8[z[1] shr 24] xor cast_sbox5[(x[2] shr 16) and $FF];
t[2]:= z[2];
z[3]:= x[1] xor cast_sbox5[(z[2] shr 8) and $FF] xor
cast_sbox6[(z[2] shr 16) and $FF] xor cast_sbox7[z[2] and $FF] xor
cast_sbox8[z[2] shr 24] xor cast_sbox6[x[2] and $FF];
t[3]:= z[3];
end;
4:
begin
x[0]:= z[2] xor cast_sbox5[(z[1] shr 16) and $FF] xor
cast_sbox6[z[1] and $FF] xor cast_sbox7[z[1] shr 24] xor
cast_sbox8[(z[1] shr 8) and $FF] xor cast_sbox7[z[0] shr 24];
t[0]:= x[0];
x[1]:= z[0] xor cast_sbox5[x[0] shr 24] xor
cast_sbox6[(x[0] shr 8) and $FF] xor cast_sbox7[(x[0] shr 16) and $FF] xor
cast_sbox8[x[0] and $FF] xor cast_sbox8[(z[0] shr 8) and $FF];
t[1]:= x[1];
x[2]:= z[1] xor cast_sbox5[x[1] and $FF] xor
cast_sbox6[(x[1] shr 8) and $FF] xor cast_sbox7[(x[1] shr 16) and $FF] xor
cast_sbox8[x[1] shr 24] xor cast_sbox5[(z[0] shr 16) and $FF];
t[2]:= x[2];
x[3]:= z[3] xor cast_sbox5[(x[2] shr 8) and $FF] xor
cast_sbox6[(x[2] shr 16) and $FF] xor cast_sbox7[x[2] and $FF] xor
cast_sbox8[x[2] shr 24] xor cast_sbox6[z[0] and $FF];
t[3]:= x[3];
end;
end;
case (i and 12) of
0,12:
begin
KeyData[i+0]:= cast_sbox5[t[2] shr 24] xor cast_sbox6[(t[2] shr 16) and $FF] xor
cast_sbox7[t[1] and $FF] xor cast_sbox8[(t[1] shr 8) and $FF];
KeyData[i+1]:= cast_sbox5[(t[2] shr 8) and $FF] xor cast_sbox6[t[2] and $FF] xor
cast_sbox7[(t[1] shr 16) and $FF] xor cast_sbox8[t[1] shr 24];
KeyData[i+2]:= cast_sbox5[t[3] shr 24] xor cast_sbox6[(t[3] shr 16) and $FF] xor
cast_sbox7[t[0] and $FF] xor cast_sbox8[(t[0] shr 8) and $FF];
KeyData[i+3]:= cast_sbox5[(t[3] shr 8) and $FF] xor cast_sbox6[t[3] and $FF] xor
cast_sbox7[(t[0] shr 16) and $FF] xor cast_sbox8[t[0] shr 24];
end;
4,8:
begin
KeyData[i+0]:= cast_sbox5[t[0] and $FF] xor cast_sbox6[(t[0] shr 8) and $FF] xor
cast_sbox7[t[3] shr 24] xor cast_sbox8[(t[3] shr 16) and $FF];
KeyData[i+1]:= cast_sbox5[(t[0] shr 16) and $FF] xor cast_sbox6[t[0] shr 24] xor
cast_sbox7[(t[3] shr 8) and $FF] xor cast_sbox8[t[3] and $FF];
KeyData[i+2]:= cast_sbox5[t[1] and $FF] xor cast_sbox6[(t[1] shr 8) and $FF] xor
cast_sbox7[t[2] shr 24] xor cast_sbox8[(t[2] shr 16) and $FF];
KeyData[i+3]:= cast_sbox5[(t[1] shr 16) and $FF] xor cast_sbox6[t[1] shr 24] xor
cast_sbox7[(t[2] shr 8) and $FF] xor cast_sbox8[t[2] and $FF];
end;
end;
case (i and 12) of
0:
begin
KeyData[i+0]:= KeyData[i+0] xor cast_sbox5[(z[0] shr 8) and $FF];
KeyData[i+1]:= KeyData[i+1] xor cast_sbox6[(z[1] shr 8) and $FF];
KeyData[i+2]:= KeyData[i+2] xor cast_sbox7[(z[2] shr 16) and $FF];
KeyData[i+3]:= KeyData[i+3] xor cast_sbox8[z[3] shr 24];
end;
4:
begin
KeyData[i+0]:= KeyData[i+0] xor cast_sbox5[x[2] shr 24];
KeyData[i+1]:= KeyData[i+1] xor cast_sbox6[(x[3] shr 16) and $FF];
KeyData[i+2]:= KeyData[i+2] xor cast_sbox7[x[0] and $FF];
KeyData[i+3]:= KeyData[i+3] xor cast_sbox8[x[1] and $FF];
end;
8:
begin
KeyData[i+0]:= KeyData[i+0] xor cast_sbox5[(z[2] shr 16) and $FF];
KeyData[i+1]:= KeyData[i+1] xor cast_sbox6[z[3] shr 24];
KeyData[i+2]:= KeyData[i+2] xor cast_sbox7[(z[0] shr 8) and $FF];
KeyData[i+3]:= KeyData[i+3] xor cast_sbox8[(z[1] shr 8) and $FF];
end;
12:
begin
KeyData[i+0]:= KeyData[i+0] xor cast_sbox5[x[0] and $FF];
KeyData[i+1]:= KeyData[i+1] xor cast_sbox6[x[1] and $FF];
KeyData[i+2]:= KeyData[i+2] xor cast_sbox7[x[2] shr 24];
KeyData[i+3]:= KeyData[i+3] xor cast_sbox8[(x[3] shr 16) and $FF];
end;
end;
if (i >= 16) then
begin
KeyData[i+0]:= KeyData[i+0] and 31;
KeyData[i+1]:= KeyData[i+1] and 31;
KeyData[i+2]:= KeyData[i+2] and 31;
KeyData[i+3]:= KeyData[i+3] and 31;
end;
Inc(i,4);
end;
end;
procedure TCast128.Burn;
begin
FillChar(KeyData,Sizeof(KeyData),$FF);
Rounds:= 0;
inherited Burn;
end;
procedure TCast128.EncryptECB(const InData; var OutData);
var
t, l, r: DWord;
begin
// if not fInitialized then
// raise EDCP_blockcipher.Create('Cipher not initialized');
l:= Pdword(@InData)^;
r:= Pdword(longword(@InData)+4)^;
l:= (l shr 24) or ((l shr 8) and $FF00) or ((l shl 8) and $FF0000) or (l shl 24);
r:= (r shr 24) or ((r shr 8) and $FF00) or ((r shl 8) and $FF0000) or (r shl 24);
t:= LRot32(KeyData[0]+r, KeyData[0+16]);
l:= l xor (((cast_sbox1[t shr 24] xor cast_sbox2[(t shr 16) and $FF]) -
cast_sbox3[(t shr 8) and $FF]) + cast_sbox4[t and $FF]);
t:= LRot32(KeyData[1] xor l, KeyData[1+16]);
r:= r xor (((cast_sbox1[t shr 24] - cast_sbox2[(t shr 16) and $FF]) +
cast_sbox3[(t shr 8) and $FF]) xor cast_sbox4[t and $FF]);
t:= LRot32(KeyData[2]-r, KeyData[2+16]);
l:= l xor (((cast_sbox1[t shr 24] + cast_sbox2[(t shr 16) and $FF]) xor
cast_sbox3[(t shr 8) and $FF]) - cast_sbox4[t and $FF]);
t:= LRot32(KeyData[3]+l, KeyData[3+16]);
r:= r xor (((cast_sbox1[t shr 24] xor cast_sbox2[(t shr 16) and $FF]) -
cast_sbox3[(t shr 8) and $FF]) + cast_sbox4[t and $FF]);
t:= LRot32(KeyData[4] xor r, KeyData[4+16]);
l:= l xor (((cast_sbox1[t shr 24] - cast_sbox2[(t shr 16) and $FF]) +
cast_sbox3[(t shr 8) and $FF]) xor cast_sbox4[t and $FF]);
t:= LRot32(KeyData[5]-l, KeyData[5+16]);
r:= r xor (((cast_sbox1[t shr 24] + cast_sbox2[(t shr 16) and $FF]) xor
cast_sbox3[(t shr 8) and $FF]) - cast_sbox4[t and $FF]);
t:= LRot32(KeyData[6]+r, KeyData[6+16]);
l:= l xor (((cast_sbox1[t shr 24] xor cast_sbox2[(t shr 16) and $FF]) -
cast_sbox3[(t shr 8) and $FF]) + cast_sbox4[t and $FF]);
t:= LRot32(KeyData[7] xor l, KeyData[7+16]);
r:= r xor (((cast_sbox1[t shr 24] - cast_sbox2[(t shr 16) and $FF]) +
cast_sbox3[(t shr 8) and $FF]) xor cast_sbox4[t and $FF]);
t:= LRot32(KeyData[8]-r, KeyData[8+16]);
l:= l xor (((cast_sbox1[t shr 24] + cast_sbox2[(t shr 16) and $FF]) xor
cast_sbox3[(t shr 8) and $FF]) - cast_sbox4[t and $FF]);
t:= LRot32(KeyData[9]+l, KeyData[9+16]);
r:= r xor (((cast_sbox1[t shr 24] xor cast_sbox2[(t shr 16) and $FF]) -
cast_sbox3[(t shr 8) and $FF]) + cast_sbox4[t and $FF]);
t:= LRot32(KeyData[10] xor r, KeyData[10+16]);
l:= l xor (((cast_sbox1[t shr 24] - cast_sbox2[(t shr 16) and $FF]) +
cast_sbox3[(t shr 8) and $FF]) xor cast_sbox4[t and $FF]);
t:= LRot32(KeyData[11]-l, KeyData[11+16]);
r:= r xor (((cast_sbox1[t shr 24] + cast_sbox2[(t shr 16) and $FF]) xor
cast_sbox3[(t shr 8) and $FF]) - cast_sbox4[t and $FF]);
if Rounds> 12 then
begin
t:= LRot32(KeyData[12]+r, KeyData[12+16]);
l:= l xor (((cast_sbox1[t shr 24] xor cast_sbox2[(t shr 16) and $FF]) -
cast_sbox3[(t shr 8) and $FF]) + cast_sbox4[t and $FF]);
t:= LRot32(KeyData[13] xor l, KeyData[13+16]);
r:= r xor (((cast_sbox1[t shr 24] - cast_sbox2[(t shr 16) and $FF]) +
cast_sbox3[(t shr 8) and $FF]) xor cast_sbox4[t and $FF]);
t:= LRot32(KeyData[14]-r, KeyData[14+16]);
l:= l xor (((cast_sbox1[t shr 24] + cast_sbox2[(t shr 16) and $FF]) xor
cast_sbox3[(t shr 8) and $FF]) - cast_sbox4[t and $FF]);
t:= LRot32(KeyData[15]+l, KeyData[15+16]);
r:= r xor (((cast_sbox1[t shr 24] xor cast_sbox2[(t shr 16) and $FF]) -
cast_sbox3[(t shr 8) and $FF]) + cast_sbox4[t and $FF]);
end;
l:= (l shr 24) or ((l shr 8) and $FF00) or ((l shl 8) and $FF0000) or (l shl 24);
r:= (r shr 24) or ((r shr 8) and $FF00) or ((r shl 8) and $FF0000) or (r shl 24);
Pdword(@OutData)^:= r;
Pdword(longword(@OutData)+4)^:= l;
end;
procedure TCast128.DecryptECB(const InData; var OutData);
var
t, l, r: DWord;
begin
// if not fInitialized then
// raise EDCP_blockcipher.Create('Cipher not initialized');
r:= Pdword(@InData)^;
l:= Pdword(longword(@InData)+4)^;
l:= (l shr 24) or ((l shr 8) and $FF00) or ((l shl 8) and $FF0000) or (l shl 24);
r:= (r shr 24) or ((r shr 8) and $FF00) or ((r shl 8) and $FF0000) or (r shl 24);
if Rounds> 12 then
begin
t:= LRot32(KeyData[15]+l, KeyData[15+16]);
r:= r xor (((cast_sbox1[t shr 24] xor cast_sbox2[(t shr 16) and $FF]) -
cast_sbox3[(t shr 8) and $FF]) + cast_sbox4[t and $FF]);
t:= LRot32(KeyData[14]-r, KeyData[14+16]);
l:= l xor (((cast_sbox1[t shr 24] + cast_sbox2[(t shr 16) and $FF]) xor
cast_sbox3[(t shr 8) and $FF]) - cast_sbox4[t and $FF]);
t:= LRot32(KeyData[13] xor l, KeyData[13+16]);
r:= r xor (((cast_sbox1[t shr 24] - cast_sbox2[(t shr 16) and $FF]) +
cast_sbox3[(t shr 8) and $FF]) xor cast_sbox4[t and $FF]);
t:= LRot32(KeyData[12]+r, KeyData[12+16]);
l:= l xor (((cast_sbox1[t shr 24] xor cast_sbox2[(t shr 16) and $FF]) -
cast_sbox3[(t shr 8) and $FF]) + cast_sbox4[t and $FF]);
end;
t:= LRot32(KeyData[11]-l, KeyData[11+16]);
r:= r xor (((cast_sbox1[t shr 24] + cast_sbox2[(t shr 16) and $FF]) xor
cast_sbox3[(t shr 8) and $FF]) - cast_sbox4[t and $FF]);
t:= LRot32(KeyData[10] xor r, KeyData[10+16]);
l:= l xor (((cast_sbox1[t shr 24] - cast_sbox2[(t shr 16) and $FF]) +
cast_sbox3[(t shr 8) and $FF]) xor cast_sbox4[t and $FF]);
t:= LRot32(KeyData[9]+l, KeyData[9+16]);
r:= r xor (((cast_sbox1[t shr 24] xor cast_sbox2[(t shr 16) and $FF]) -
cast_sbox3[(t shr 8) and $FF]) + cast_sbox4[t and $FF]);
t:= LRot32(KeyData[8]-r, KeyData[8+16]);
l:= l xor (((cast_sbox1[t shr 24] + cast_sbox2[(t shr 16) and $FF]) xor
cast_sbox3[(t shr 8) and $FF]) - cast_sbox4[t and $FF]);
t:= LRot32(KeyData[7] xor l, KeyData[7+16]);
r:= r xor (((cast_sbox1[t shr 24] - cast_sbox2[(t shr 16) and $FF]) +
cast_sbox3[(t shr 8) and $FF]) xor cast_sbox4[t and $FF]);
t:= LRot32(KeyData[6]+r, KeyData[6+16]);
l:= l xor (((cast_sbox1[t shr 24] xor cast_sbox2[(t shr 16) and $FF]) -
cast_sbox3[(t shr 8) and $FF]) + cast_sbox4[t and $FF]);
t:= LRot32(KeyData[5]-l, KeyData[5+16]);
r:= r xor (((cast_sbox1[t shr 24] + cast_sbox2[(t shr 16) and $FF]) xor
cast_sbox3[(t shr 8) and $FF]) - cast_sbox4[t and $FF]);
t:= LRot32(KeyData[4] xor r, KeyData[4+16]);
l:= l xor (((cast_sbox1[t shr 24] - cast_sbox2[(t shr 16) and $FF]) +
cast_sbox3[(t shr 8) and $FF]) xor cast_sbox4[t and $FF]);
t:= LRot32(KeyData[3]+l, KeyData[3+16]);
r:= r xor (((cast_sbox1[t shr 24] xor cast_sbox2[(t shr 16) and $FF]) -
cast_sbox3[(t shr 8) and $FF]) + cast_sbox4[t and $FF]);
t:= LRot32(KeyData[2]-r, KeyData[2+16]);
l:= l xor (((cast_sbox1[t shr 24] + cast_sbox2[(t shr 16) and $FF]) xor
cast_sbox3[(t shr 8) and $FF]) - cast_sbox4[t and $FF]);
t:= LRot32(KeyData[1] xor l, KeyData[1+16]);
r:= r xor (((cast_sbox1[t shr 24] - cast_sbox2[(t shr 16) and $FF]) +
cast_sbox3[(t shr 8) and $FF]) xor cast_sbox4[t and $FF]);
t:= LRot32(KeyData[0]+r, KeyData[0+16]);
l:= l xor (((cast_sbox1[t shr 24] xor cast_sbox2[(t shr 16) and $FF]) -
cast_sbox3[(t shr 8) and $FF]) + cast_sbox4[t and $FF]);
l:= (l shr 24) or ((l shr 8) and $FF00) or ((l shl 8) and $FF0000) or (l shl 24);
r:= (r shr 24) or ((r shr 8) and $FF00) or ((r shl 8) and $FF0000) or (r shl 24);
Pdword(@OutData)^:= l;
Pdword(longword(@OutData)+4)^:= r;
end;
destructor TGOST.Destroy;
begin
// All Strings := '';
// Free_And_Nil(All PObj);
inherited;
end;
////////////////////////////////////////////////////////////////////////////////
{-----------------------------}
{ ����������� ��� KOL ������� }
{-----------------------------}
function NewGOST;
begin
New(Result, Create);
// code
end;
////////////////////////////////////////////////////////////////////////////////
{$R-}{$Q-}
//{$I DCPgost.inc}
procedure TGOST.InitKey(const Key; Size: longword);
var
i: longword;
userkey: array[0..31] of byte;
begin
burn;
Size:= Size div 8;
FillChar(userkey,Sizeof(userkey),0);
Move(Key,userkey,Size);
for i:= 0 to 7 do
KeyData[i]:= (dword(UserKey[4*i+3]) shl 24) or (dword(UserKey[4*i+2]) shl 16) or
(dword(UserKey[4*i+1]) shl 8) or (dword(UserKey[4*i+0]));
end;
procedure TGOST.Burn;
begin
FillChar(KeyData,Sizeof(KeyData),0);
inherited Burn;
end;
procedure TGOST.EncryptECB(const InData; var OutData);
var
n1, n2: DWord;
i: longword;
begin
// if not fInitialized then
// raise EDCP_blockcipher.Create('Cipher not initialized');
n1:= PDword(@InData)^;
n2:= PDword(dword(@InData)+4)^;
for i:= 0 to 2 do
begin
n2:= n2 xor (sTable[3,(n1+KeyData[0]) shr 24] xor sTable[2,((n1+KeyData[0]) shr 16) and $FF]
xor sTable[1,((n1+KeyData[0]) shr 8) and $FF] xor sTable[0,(n1+KeyData[0]) and $FF]);
n1:= n1 xor (sTable[3,(n2+KeyData[1]) shr 24] xor sTable[2,((n2+KeyData[1]) shr 16) and $FF]
xor sTable[1,((n2+KeyData[1]) shr 8) and $FF] xor sTable[0,(n2+KeyData[1]) and $FF]);
n2:= n2 xor (sTable[3,(n1+KeyData[2]) shr 24] xor sTable[2,((n1+KeyData[2]) shr 16) and $FF]
xor sTable[1,((n1+KeyData[2]) shr 8) and $FF] xor sTable[0,(n1+KeyData[2]) and $FF]);
n1:= n1 xor (sTable[3,(n2+KeyData[3]) shr 24] xor sTable[2,((n2+KeyData[3]) shr 16) and $FF]
xor sTable[1,((n2+KeyData[3]) shr 8) and $FF] xor sTable[0,(n2+KeyData[3]) and $FF]);
n2:= n2 xor (sTable[3,(n1+KeyData[4]) shr 24] xor sTable[2,((n1+KeyData[4]) shr 16) and $FF]
xor sTable[1,((n1+KeyData[4]) shr 8) and $FF] xor sTable[0,(n1+KeyData[4]) and $FF]);
n1:= n1 xor (sTable[3,(n2+KeyData[5]) shr 24] xor sTable[2,((n2+KeyData[5]) shr 16) and $FF]
xor sTable[1,((n2+KeyData[5]) shr 8) and $FF] xor sTable[0,(n2+KeyData[5]) and $FF]);
n2:= n2 xor (sTable[3,(n1+KeyData[6]) shr 24] xor sTable[2,((n1+KeyData[6]) shr 16) and $FF]
xor sTable[1,((n1+KeyData[6]) shr 8) and $FF] xor sTable[0,(n1+KeyData[6]) and $FF]);
n1:= n1 xor (sTable[3,(n2+KeyData[7]) shr 24] xor sTable[2,((n2+KeyData[7]) shr 16) and $FF]
xor sTable[1,((n2+KeyData[7]) shr 8) and $FF] xor sTable[0,(n2+KeyData[7]) and $FF]);
end;
n2:= n2 xor (sTable[3,(n1+KeyData[7]) shr 24] xor sTable[2,((n1+KeyData[7]) shr 16) and $FF]
xor sTable[1,((n1+KeyData[7]) shr 8) and $FF] xor sTable[0,(n1+KeyData[7]) and $FF]);
n1:= n1 xor (sTable[3,(n2+KeyData[6]) shr 24] xor sTable[2,((n2+KeyData[6]) shr 16) and $FF]
xor sTable[1,((n2+KeyData[6]) shr 8) and $FF] xor sTable[0,(n2+KeyData[6]) and $FF]);
n2:= n2 xor (sTable[3,(n1+KeyData[5]) shr 24] xor sTable[2,((n1+KeyData[5]) shr 16) and $FF]
xor sTable[1,((n1+KeyData[5]) shr 8) and $FF] xor sTable[0,(n1+KeyData[5]) and $FF]);
n1:= n1 xor (sTable[3,(n2+KeyData[4]) shr 24] xor sTable[2,((n2+KeyData[4]) shr 16) and $FF]
xor sTable[1,((n2+KeyData[4]) shr 8) and $FF] xor sTable[0,(n2+KeyData[4]) and $FF]);
n2:= n2 xor (sTable[3,(n1+KeyData[3]) shr 24] xor sTable[2,((n1+KeyData[3]) shr 16) and $FF]
xor sTable[1,((n1+KeyData[3]) shr 8) and $FF] xor sTable[0,(n1+KeyData[3]) and $FF]);
n1:= n1 xor (sTable[3,(n2+KeyData[2]) shr 24] xor sTable[2,((n2+KeyData[2]) shr 16) and $FF]
xor sTable[1,((n2+KeyData[2]) shr 8) and $FF] xor sTable[0,(n2+KeyData[2]) and $FF]);
n2:= n2 xor (sTable[3,(n1+KeyData[1]) shr 24] xor sTable[2,((n1+KeyData[1]) shr 16) and $FF]
xor sTable[1,((n1+KeyData[1]) shr 8) and $FF] xor sTable[0,(n1+KeyData[1]) and $FF]);
n1:= n1 xor (sTable[3,(n2+KeyData[0]) shr 24] xor sTable[2,((n2+KeyData[0]) shr 16) and $FF]
xor sTable[1,((n2+KeyData[0]) shr 8) and $FF] xor sTable[0,(n2+KeyData[0]) and $FF]);
PDword(@OutData)^:= n2;
PDword(dword(@OutData)+4)^:= n1;
end;
procedure TGOST.DecryptECB(const InData; var OutData);
var
n1, n2: DWord;
i: longword;
begin
// if not fInitialized then
// raise EDCP_blockcipher.Create('Cipher not initialized');
n1:= PDword(@InData)^;
n2:= PDword(dword(@InData)+4)^;
n2:= n2 xor (sTable[3,(n1+KeyData[0]) shr 24] xor sTable[2,((n1+KeyData[0]) shr 16) and $FF]
xor sTable[1,((n1+KeyData[0]) shr 8) and $FF] xor sTable[0,(n1+KeyData[0]) and $FF]);
n1:= n1 xor (sTable[3,(n2+KeyData[1]) shr 24] xor sTable[2,((n2+KeyData[1]) shr 16) and $FF]
xor sTable[1,((n2+KeyData[1]) shr 8) and $FF] xor sTable[0,(n2+KeyData[1]) and $FF]);
n2:= n2 xor (sTable[3,(n1+KeyData[2]) shr 24] xor sTable[2,((n1+KeyData[2]) shr 16) and $FF]
xor sTable[1,((n1+KeyData[2]) shr 8) and $FF] xor sTable[0,(n1+KeyData[2]) and $FF]);
n1:= n1 xor (sTable[3,(n2+KeyData[3]) shr 24] xor sTable[2,((n2+KeyData[3]) shr 16) and $FF]
xor sTable[1,((n2+KeyData[3]) shr 8) and $FF] xor sTable[0,(n2+KeyData[3]) and $FF]);
n2:= n2 xor (sTable[3,(n1+KeyData[4]) shr 24] xor sTable[2,((n1+KeyData[4]) shr 16) and $FF]
xor sTable[1,((n1+KeyData[4]) shr 8) and $FF] xor sTable[0,(n1+KeyData[4]) and $FF]);
n1:= n1 xor (sTable[3,(n2+KeyData[5]) shr 24] xor sTable[2,((n2+KeyData[5]) shr 16) and $FF]
xor sTable[1,((n2+KeyData[5]) shr 8) and $FF] xor sTable[0,(n2+KeyData[5]) and $FF]);
n2:= n2 xor (sTable[3,(n1+KeyData[6]) shr 24] xor sTable[2,((n1+KeyData[6]) shr 16) and $FF]
xor sTable[1,((n1+KeyData[6]) shr 8) and $FF] xor sTable[0,(n1+KeyData[6]) and $FF]);
n1:= n1 xor (sTable[3,(n2+KeyData[7]) shr 24] xor sTable[2,((n2+KeyData[7]) shr 16) and $FF]
xor sTable[1,((n2+KeyData[7]) shr 8) and $FF] xor sTable[0,(n2+KeyData[7]) and $FF]);
for i:= 0 to 2 do
begin
n2:= n2 xor (sTable[3,(n1+KeyData[7]) shr 24] xor sTable[2,((n1+KeyData[7]) shr 16) and $FF]
xor sTable[1,((n1+KeyData[7]) shr 8) and $FF] xor sTable[0,(n1+KeyData[7]) and $FF]);
n1:= n1 xor (sTable[3,(n2+KeyData[6]) shr 24] xor sTable[2,((n2+KeyData[6]) shr 16) and $FF]
xor sTable[1,((n2+KeyData[6]) shr 8) and $FF] xor sTable[0,(n2+KeyData[6]) and $FF]);
n2:= n2 xor (sTable[3,(n1+KeyData[5]) shr 24] xor sTable[2,((n1+KeyData[5]) shr 16) and $FF]
xor sTable[1,((n1+KeyData[5]) shr 8) and $FF] xor sTable[0,(n1+KeyData[5]) and $FF]);
n1:= n1 xor (sTable[3,(n2+KeyData[4]) shr 24] xor sTable[2,((n2+KeyData[4]) shr 16) and $FF]
xor sTable[1,((n2+KeyData[4]) shr 8) and $FF] xor sTable[0,(n2+KeyData[4]) and $FF]);
n2:= n2 xor (sTable[3,(n1+KeyData[3]) shr 24] xor sTable[2,((n1+KeyData[3]) shr 16) and $FF]
xor sTable[1,((n1+KeyData[3]) shr 8) and $FF] xor sTable[0,(n1+KeyData[3]) and $FF]);
n1:= n1 xor (sTable[3,(n2+KeyData[2]) shr 24] xor sTable[2,((n2+KeyData[2]) shr 16) and $FF]
xor sTable[1,((n2+KeyData[2]) shr 8) and $FF] xor sTable[0,(n2+KeyData[2]) and $FF]);
n2:= n2 xor (sTable[3,(n1+KeyData[1]) shr 24] xor sTable[2,((n1+KeyData[1]) shr 16) and $FF]
xor sTable[1,((n1+KeyData[1]) shr 8) and $FF] xor sTable[0,(n1+KeyData[1]) and $FF]);
n1:= n1 xor (sTable[3,(n2+KeyData[0]) shr 24] xor sTable[2,((n2+KeyData[0]) shr 16) and $FF]
xor sTable[1,((n2+KeyData[0]) shr 8) and $FF] xor sTable[0,(n2+KeyData[0]) and $FF]);
end;
PDword(@OutData)^:= n2;
PDword(dword(@OutData)+4)^:= n1;
end;
destructor TIDEA.Destroy;
begin
// All Strings := '';
// Free_And_Nil(All PObj);
inherited;
end;
////////////////////////////////////////////////////////////////////////////////
{-----------------------------}
{ ����������� ��� KOL ������� }
{-----------------------------}
function NewIDEA;
begin
New(Result, Create);
// code
end;
////////////////////////////////////////////////////////////////////////////////
{$R-}{$Q-}
function MulInv(x: word): word;
var
t0, t1, q, y: word;
begin
if x<= 1 then
begin
Result:= x;
Exit;
end;
t1:= DWord($10001) div x;
y:= DWord($10001) mod x;
if y= 1 then
begin
Result:= (1 - t1) and $FFFF;
Exit;
end;
t0:= 1;
repeat
q:= x div y;
x:= x mod y;
t0:= t0 + (q*t1);
if x= 1 then
begin
Result:= t0;
Exit;
end;
q:= y div x;
y:= y mod x;
t1:= t1 + (q*t0);
until y= 1;
Result:= (1-t1) and $FFFF;
end;
procedure TIDEA.InitKey(const Key; Size: longword);
var
i: integer;
begin
burn;
Size:= Size div 8;
FillChar(EK,Sizeof(EK),0);
Move(Key,EK,Size);
for i:= 0 to 7 do
EK[i]:= (EK[i] shl 8) or (EK[i] shr 8);
for i:= 1 to 5 do
begin
EK[(i*8)+0]:= (EK[((i-1)*8)+1] shl 9) or (EK[((i-1)*8)+2] shr 7);
EK[(i*8)+1]:= (EK[((i-1)*8)+2] shl 9) or (EK[((i-1)*8)+3] shr 7);
EK[(i*8)+2]:= (EK[((i-1)*8)+3] shl 9) or (EK[((i-1)*8)+4] shr 7);
EK[(i*8)+3]:= (EK[((i-1)*8)+4] shl 9) or (EK[((i-1)*8)+5] shr 7);
EK[(i*8)+4]:= (EK[((i-1)*8)+5] shl 9) or (EK[((i-1)*8)+6] shr 7);
EK[(i*8)+5]:= (EK[((i-1)*8)+6] shl 9) or (EK[((i-1)*8)+7] shr 7);
EK[(i*8)+6]:= (EK[((i-1)*8)+7] shl 9) or (EK[((i-1)*8)+0] shr 7);
EK[(i*8)+7]:= (EK[((i-1)*8)+0] shl 9) or (EK[((i-1)*8)+1] shr 7);
end;
EK[48]:= (EK[41] shl 9) or (EK[42] shr 7);
EK[49]:= (EK[42] shl 9) or (EK[43] shr 7);
EK[50]:= (EK[43] shl 9) or (EK[44] shr 7);
EK[51]:= (EK[44] shl 9) or (EK[45] shr 7);
DK[51]:= MulInv(EK[3]);
DK[50]:= -EK[2];
DK[49]:= -EK[1];
DK[48]:= MulInv(EK[0]);
for i:= 0 to 6 do
begin
DK[47-i*6]:= EK[i*6+5];
DK[46-i*6]:= EK[i*6+4];
DK[45-i*6]:= MulInv(EK[i*6+9]);
DK[44-i*6]:= -EK[i*6+7];
DK[43-i*6]:= -EK[i*6+8];
DK[42-i*6]:= MulInv(EK[i*6+6]);
end;
DK[5]:= EK[47];
DK[4]:= EK[46];
DK[3]:= MulInv(EK[51]);
DK[2]:= -EK[50];
DK[1]:= -EK[49];
DK[0]:= MulInv(EK[48]);
end;
procedure TIDEA.Burn;
begin
FillChar(EK,Sizeof(EK),0);
FillChar(DK,Sizeof(DK),0);
inherited Burn;
end;
procedure Mul(var x: word; const y: word);
var
p: DWord;
t16: word;
begin
p:= DWord(x)*y;
if p= 0 then
x:= 1 - x - y
else
begin
x:= p shr 16;
t16:= p and $FFFF;
x:= t16 - x;
if (t16 < x) then
Inc(x);
end;
end;
procedure TIDEA.EncryptECB(const InData; var OutData);
var
x: array[1..4] of word;
s3, s2: word;
i: longword;
begin
// if not fInitialized then
// raise EDCP_blockcipher.Create('Cipher not initialized');
PDword(@X[1])^:= PDword(@InData)^;
PDword(@X[3])^:= PDword(dword(@InData)+4)^;
for i:= 1 to 4 do
x[i]:= (x[i] shl 8) or (x[i] shr 8);
for i:= 0 to 7 do
begin
Mul(x[1],EK[(i*6)+0]);
Inc(x[2],EK[(i*6)+1]);
Inc(x[3],EK[(i*6)+2]);
Mul(x[4],EK[(i*6)+3]);
s3:= x[3];
x[3]:= x[3] xor x[1];
Mul(x[3],EK[(i*6)+4]);
s2:= x[2];
x[2]:= x[2] xor x[4];
Inc(x[2],x[3]);
Mul(x[2],EK[(i*6)+5]);
Inc(x[3],x[2]);
x[1]:= x[1] xor x[2];
x[4]:= x[4] xor x[3];
x[2]:= x[2] xor s3;
x[3]:= x[3] xor s2;
end;
Mul(x[1],EK[48]);
Inc(x[3],EK[49]);
Inc(x[2],EK[50]);
Mul(x[4],EK[51]);
x[1]:= (x[1] shl 8) or (x[1] shr 8);
s2:= (x[3] shl 8) or (x[3] shr 8);
x[3]:= (x[2] shl 8) or (x[2] shr 8);
x[4]:= (x[4] shl 8) or (x[4] shr 8);
x[2]:= s2;
PDword(@OutData)^:= PDword(@x[1])^;
PDword(dword(@OutData)+4)^:= PDword(@x[3])^;
end;
procedure TIDEA.DecryptECB(const InData; var OutData);
var
x: array[1..4] of word;
s3, s2: word;
i: longword;
begin
// if not fInitialized then
// raise EDCP_blockcipher.Create('Cipher not initialized');
PDword(@X[1])^:= PDword(@InData)^;
PDword(@X[3])^:= PDword(dword(@InData)+4)^;
for i:= 1 to 4 do
x[i]:= (x[i] shl 8) or (x[i] shr 8);
for i:= 0 to 7 do
begin
Mul(x[1],DK[(i*6)+0]);
Inc(x[2],DK[(i*6)+1]);
Inc(x[3],DK[(i*6)+2]);
Mul(x[4],DK[(i*6)+3]);
s3:= x[3];
x[3]:= x[3] xor x[1];
Mul(x[3],DK[(i*6)+4]);
s2:= x[2];
x[2]:= x[2] xor x[4];
Inc(x[2],x[3]);
Mul(x[2],DK[(i*6)+5]);
Inc(x[3],x[2]);
x[1]:= x[1] xor x[2];
x[4]:= x[4] xor x[3];
x[2]:= x[2] xor s3;
x[3]:= x[3] xor s2;
end;
Mul(x[1],DK[48]);
Inc(x[3],DK[49]);
Inc(x[2],DK[50]);
Mul(x[4],DK[51]);
x[1]:= (x[1] shl 8) or (x[1] shr 8);
s2:= (x[3] shl 8) or (x[3] shr 8);
x[3]:= (x[2] shl 8) or (x[2] shr 8);
x[4]:= (x[4] shl 8) or (x[4] shr 8);
x[2]:= s2;
PDword(@OutData)^:= PDword(@x[1])^;
PDword(dword(@OutData)+4)^:= PDword(@x[3])^;
end;
{--------------------}
{ Destructor ������� }
{--------------------}
destructor TMisty1.Destroy;
begin
// All Strings := '';
// Free_And_Nil(All PObj);
inherited;
end;
////////////////////////////////////////////////////////////////////////////////
{-----------------------------}
{ ����������� ��� KOL ������� }
{-----------------------------}
function NewMisty1;
begin
New(Result, Create);
// code
end;
////////////////////////////////////////////////////////////////////////////////
//{$I DCPmisty1.inc}
function SwapDword(a: dword): dword;
begin
Result:= ((a and $FF) shl 24) or ((a and $FF00) shl 8) or ((a and $FF0000) shr 8) or ((a and $FF000000) shr 24);
end;
function TMisty1.FI(const FI_IN, FI_KEY: DWord): DWord;
var
d7, d9: DWord;
begin
d9:= (FI_IN shr 7) and $1ff;
d7:= FI_IN and $7f;
d9:= S9Table[d9] xor d7;
d7:= (S7Table[d7] xor d9) and $7f;
d7:= d7 xor ((FI_KEY shr 9) and $7f);
d9:= d9 xor (FI_KEY and $1ff);
d9:= S9Table[d9] xor d7;
Result:= (d7 shl 9) or d9;
end;
function TMisty1.FO(const FO_IN: DWord; const k: longword): DWord;
var
t0, t1: DWord;
begin
t0:= FO_IN shr 16;
t1:= FO_IN and $FFFF;
t0:= t0 xor KeyData[k];
t0:= FI(t0,KeyData[((k+5) mod 8) + 8]);
t0:= t0 xor t1;
t1:= t1 xor KeyData[(k+2) mod 8];
t1:= FI(t1,KeyData[((k+1) mod 8) + 8]);
t1:= t1 xor t0;
t0:= t0 xor KeyData[(k+7) mod 8];
t0:= FI(t0,KeyData[((k+3) mod 8) + 8]);
t0:= t0 xor t1;
t1:= t1 xor KeyData[(k+4) mod 8];
Result:= (t1 shl 16) or t0;
end;
function TMisty1.FL(const FL_IN: DWord; const k: longword): DWord;
var
d0, d1: DWord;
t: byte;
begin
d0:= FL_IN shr 16;
d1:= FL_IN and $FFFF;
if (k mod 2)<> 0 then
begin
t:= (k-1) div 2;
d1:= d1 xor (d0 and KeyData[((t + 2) mod 8) + 8]);
d0:= d0 xor (d1 or KeyData[(t + 4) mod 8]);
end
else
begin
t:= k div 2;
d1:= d1 xor (d0 and KeyData[t]);
d0:= d0 xor (d1 or KeyData[((t+6) mod 8) + 8]);
end;
Result:= (d0 shl 16) or d1;
end;
function TMisty1.FLINV(const FL_IN: DWord; const k: longword): DWord;
var
d0, d1: DWord;
t: byte;
begin
d0:= FL_IN shr 16;
d1:= FL_IN and $FFFF;
if (k mod 2)<> 0 then
begin
t:= (k-1) div 2;
d0:= d0 xor (d1 or KeyData[(t+4) mod 8]);
d1:= d1 xor (d0 and KeyData[((t+2) mod 8) + 8]);
end
else
begin
t:= k div 2;
d0:= d0 xor (d1 or KeyData[((t+6) mod 8) + 8]);
d1:= d1 xor (d0 and KeyData[t]);
end;
Result:= (d0 shl 16) or d1;
end;
procedure TMisty1.InitKey(const Key; Size: longword);
var
KeyB: array[0..15] of byte;
i: longword;
begin
burn;
FillChar(KeyB,Sizeof(KeyB),0);
Move(Key,KeyB,Size div 8);
for i:= 0 to 7 do
KeyData[i]:= (KeyB[i*2] * 256) + KeyB[i*2+1];
for i:= 0 to 7 do
begin
KeyData[i+8]:= FI(KeyData[i],KeyData[(i+1) mod 8]);
KeyData[i+16]:= KeyData[i+8] and $1FF;
KeyData[i+24]:= KeyData[i+8] shr 9;
end;
end;
procedure TMisty1.Burn;
begin
FillChar(KeyData,Sizeof(KeyData),0);
inherited Burn;
end;
procedure TMisty1.EncryptECB(const InData; var OutData);
var
d0, d1: DWord;
i: longword;
begin
// if not fInitialized then
// raise EDCP_blockcipher.Create('Cipher not initialized');
d0:= SwapDWord(PDWord(@InData)^);
d1:= SwapDWord(PDWord(longword(@InData)+4)^);
for i:= 0 to NUMROUNDSMY1-1 do
begin
if (i mod 2)= 0 then
begin
d0:= FL(D0,i);
d1:= FL(D1,i+1);
d1:= d1 xor FO(d0,i);
end
else
d0:= d0 xor FO(d1,i);
end;
d0:= FL(d0,NUMROUNDSMY1);
d1:= FL(d1,NUMROUNDSMY1+1);
PDWord(@OutData)^:= SwapDWord(d1);
PDWord(longword(@OutData)+4)^:= SwapDWord(d0);
end;
procedure TMisty1.DecryptECB(const InData; var OutData);
var
d0, d1: DWord;
i: longword;
begin
// if not fInitialized then
// raise EDCP_blockcipher.Create('Cipher not initialized');
d1:= SwapDWord(PDWord(@InData)^);
d0:= SwapDWord(PDWord(longword(@InData)+4)^);
d1:= FLINV(d1,NUMROUNDSMY1+1);
d0:= FLINV(d0,NUMROUNDSMY1);
for i:= NUMROUNDSMY1-1 downto 0 do
begin
if (i mod 2)= 0 then
begin
d1:= d1 xor FO(d0,i);
d0:= FLINV(D0,i);
d1:= FLINV(D1,i+1);
end
else
d0:= d0 xor FO(d1,i);
end;
PDWord(@OutData)^:= SwapDWord(d0);
PDWord(longword(@OutData)+4)^:= SwapDWord(d1);
end;
{--------------------}
{ Destructor ������� }
{--------------------}
destructor TRC2.Destroy;
begin
// All Strings := '';
// Free_And_Nil(All PObj);
inherited;
end;
////////////////////////////////////////////////////////////////////////////////
{-----------------------------}
{ ����������� ��� KOL ������� }
{-----------------------------}
function NewRC2;
begin
New(Result, Create);
// code
end;
////////////////////////////////////////////////////////////////////////////////
function LRot16(a, n: word): word;
begin
Result:= (a shl n) or (a shr (16-n));
end;
function RRot16(a, n: word): word;
begin
Result:= (a shr n) or (a shl (16-n));
end;
procedure TRC2.InitKey(const Key; Size: longword);
var
i: longword;
KeyB: array[0..127] of byte;
begin
burn;
Move(Key,KeyB,Size div 8);
for i:= (Size div 8) to 127 do
KeyB[i]:= sBoxRC2[(KeyB[i-(Size div 8)]+KeyB[i-1]) and $FF];
KeyB[0]:= sBoxRC2[KeyB[0]];
Move(KeyB,KeyData,Sizeof(KeyData));
end;
procedure TRC2.Burn;
begin
FillChar(KeyData,Sizeof(KeyData),0);
inherited Burn;
end;
procedure TRC2.EncryptECB(const InData; var OutData);
var
i, j: longword;
w: array[0..3] of word;
begin
// if not fInitialized then
// raise EDCP_blockcipher.Create('Cipher not initialized');
Pdword(@w[0])^:= Pdword(@InData)^;
Pdword(@w[2])^:= Pdword(longword(@InData)+4)^;
for i:= 0 to 15 do
begin
j:= i*4;
w[0]:= LRot16((w[0]+(w[1] and (not w[3]))+(w[2] and w[3])+KeyData[j+0]),1);
w[1]:= LRot16((w[1]+(w[2] and (not w[0]))+(w[3] and w[0])+KeyData[j+1]),2);
w[2]:= LRot16((w[2]+(w[3] and (not w[1]))+(w[0] and w[1])+KeyData[j+2]),3);
w[3]:= LRot16((w[3]+(w[0] and (not w[2]))+(w[1] and w[2])+KeyData[j+3]),5);
if (i= 4) or (i= 10) then
begin
w[0]:= w[0]+KeyData[w[3] and 63];
w[1]:= w[1]+KeyData[w[0] and 63];
w[2]:= w[2]+KeyData[w[1] and 63];
w[3]:= w[3]+KeyData[w[2] and 63];
end;
end;
Pdword(@OutData)^:= Pdword(@w[0])^;
Pdword(longword(@OutData)+4)^:= Pdword(@w[2])^;
end;
procedure TRC2.DecryptECB(const InData; var OutData);
var
i, j: longword;
w: array[0..3] of word;
begin
// if not fInitialized then
// raise EDCP_blockcipher.Create('Cipher not initialized');
Pdword(@w[0])^:= Pdword(@InData)^;
Pdword(@w[2])^:= Pdword(longword(@InData)+4)^;
for i:= 15 downto 0 do
begin
j:= i*4;
w[3]:= RRot16(w[3],5)-(w[0] and (not w[2]))-(w[1] and w[2])-KeyData[j+3];
w[2]:= RRot16(w[2],3)-(w[3] and (not w[1]))-(w[0] and w[1])-KeyData[j+2];
w[1]:= RRot16(w[1],2)-(w[2] and (not w[0]))-(w[3] and w[0])-KeyData[j+1];
w[0]:= RRot16(w[0],1)-(w[1] and (not w[3]))-(w[2] and w[3])-KeyData[j+0];
if (i= 5) or (i= 11) then
begin
w[3]:= w[3]-KeyData[w[2] and 63];
w[2]:= w[2]-KeyData[w[1] and 63];
w[1]:= w[1]-KeyData[w[0] and 63];
w[0]:= w[0]-KeyData[w[3] and 63];
end;
end;
Pdword(@OutData)^:= Pdword(@w[0])^;
Pdword(longword(@OutData)+4)^:= Pdword(@w[2])^;
end;
{--------------------}
{ Destructor ������� }
{--------------------}
destructor TRC4.Destroy;
begin
// All Strings := '';
// Free_And_Nil(All PObj);
inherited;
end;
////////////////////////////////////////////////////////////////////////////////
{-----------------------------}
{ ����������� ��� KOL ������� }
{-----------------------------}
function NewRC4;
begin
New(Result, Create);
// code
end;
////////////////////////////////////////////////////////////////////////////////
procedure Trc4.InitKey(const Key; Size: longword; InitVector: pointer);
var
i, j, t: longword;
xKey: array[0..255] of byte;
begin
// if fInitialized then
Burn;
// inherited Init(Key,Size,nil);
Size:= Size div 8;
i:= 0;
while i< 255 do
begin
KeyData[i]:= i;
xKey[i]:= PByte(longword(@Key)+(i mod Size))^;
KeyData[i+1]:= i+1;
xKey[i+1]:= PByte(longword(@Key)+((i+1) mod Size))^;
KeyData[i+2]:= i+2;
xKey[i+2]:= PByte(longword(@Key)+((i+2) mod Size))^;
KeyData[i+3]:= i+3;
xKey[i+3]:= PByte(longword(@Key)+((i+3) mod Size))^;
KeyData[i+4]:= i+4;
xKey[i+4]:= PByte(longword(@Key)+((i+4) mod Size))^;
KeyData[i+5]:= i+5;
xKey[i+5]:= PByte(longword(@Key)+((i+5) mod Size))^;
KeyData[i+6]:= i+6;
xKey[i+6]:= PByte(longword(@Key)+((i+6) mod Size))^;
KeyData[i+7]:= i+7;
xKey[i+7]:= PByte(longword(@Key)+((i+7) mod Size))^;
Inc(i,8);
end;
j:= 0;
i:= 0;
while i< 255 do
begin
j:= (j+KeyData[i]+xKey[i]) and $FF;
t:= KeyData[i];
KeyData[i]:= KeyData[j];
KeyData[j]:= t;
j:= (j+KeyData[i+1]+xKey[i+1]) and $FF;
t:= KeyData[i+1];
KeyData[i+1]:= KeyData[j];
KeyData[j]:= t;
j:= (j+KeyData[i+2]+xKey[i+2]) and $FF;
t:= KeyData[i+2];
KeyData[i+2]:= KeyData[j];
KeyData[j]:= t;
j:= (j+KeyData[i+3]+xKey[i+3]) and $FF;
t:= KeyData[i+3];
KeyData[i+3]:= KeyData[j];
KeyData[j]:= t;
j:= (j+KeyData[i+4]+xKey[i+4]) and $FF;
t:= KeyData[i+4];
KeyData[i+4]:= KeyData[j];
KeyData[j]:= t;
j:= (j+KeyData[i+5]+xKey[i+5]) and $FF;
t:= KeyData[i+5];
KeyData[i+5]:= KeyData[j];
KeyData[j]:= t;
j:= (j+KeyData[i+6]+xKey[i+6]) and $FF;
t:= KeyData[i+6];
KeyData[i+6]:= KeyData[j];
KeyData[j]:= t;
j:= (j+KeyData[i+7]+xKey[i+7]) and $FF;
t:= KeyData[i+7];
KeyData[i+7]:= KeyData[j];
KeyData[j]:= t;
Inc(i,8);
end;
Move(KeyData,KeyOrg,Sizeof(KeyOrg));
end;
procedure Trc4.Reset;
begin
Move(KeyOrg,KeyData,Sizeof(KeyData));
end;
procedure Trc4.Burn;
begin
FillChar(KeyOrg,Sizeof(KeyOrg),$FF);
FillChar(KeyData,Sizeof(KeyData),$FF);
// inherited Burn;
end;
procedure Trc4.Encrypt(const InData; var OutData; Size: longword);
var
i, j, t, k: longword;
begin
// if not fInitialized then
// raise EDCP_cipher.Create('Cipher not initialized');
i:= 0; j:= 0;
for k:= 0 to Size-1 do
begin
i:= (i + 1) and $FF;
t:= KeyData[i];
j:= (j + t) and $FF;
KeyData[i]:= KeyData[j];
KeyData[j]:= t;
t:= (t + KeyData[i]) and $FF;
Pbytearray(@OutData)^[k]:= Pbytearray(@InData)^[k] xor KeyData[t];
end;
end;
procedure Trc4.Decrypt(const InData; var OutData; Size: longword);
var
i, j, t, k: longword;
begin
// if not fInitialized then
// raise EDCP_cipher.Create('Cipher not initialized');
i:= 0; j:= 0;
for k:= 0 to Size-1 do
begin
i:= (i + 1) and $FF;
t:= KeyData[i];
j:= (j + t) and $FF;
KeyData[i]:= KeyData[j];
KeyData[j]:= t;
t:= (t + KeyData[i]) and $FF;
Pbytearray(@OutData)^[k]:= Pbytearray(@InData)^[k] xor KeyData[t];
end;
end;
{--------------------}
{ Destructor ������� }
{--------------------}
destructor TRC5.Destroy;
begin
// All Strings := '';
// Free_And_Nil(All PObj);
inherited;
end;
////////////////////////////////////////////////////////////////////////////////
{-----------------------------}
{ ����������� ��� KOL ������� }
{-----------------------------}
function NewRC5;
begin
New(Result, Create);
// code
end;
////////////////////////////////////////////////////////////////////////////////
function RRot32(a, b: longword): longword;
begin
Result:= (a shr b) or (a shl (32-b));
end;
procedure TRC5.InitKey(const Key; Size: longword);
var
xKeyD: array[0..63] of DWord;
i, j, k, xKeyLen: longword;
A, B: DWord;
begin
burn;
FillChar(xKeyD,Sizeof(xKeyD),0);
Size:= Size div 8;
Move(Key,xKeyD,Size);
xKeyLen:= Size div 4;
if (Size mod 4)<> 0 then
Inc(xKeyLen);
Move(sBoxRC5,KeyData,(NUMROUNDSRC5+1)*8);
i:= 0; j:= 0;
A:= 0; B:= 0;
if xKeyLen> ((NUMROUNDSRC5+1)*2) then
k:= xKeyLen*3
else
k:= (NUMROUNDSRC5+1)*6;
for k:= k downto 1 do
begin
A:= LRot32(KeyData[i]+A+B,3);
KeyData[i]:= A;
B:= LRot32(xKeyD[j]+A+B,A+B);
xKeyD[j]:= B;
i:= (i+1) mod ((NUMROUNDSRC5+1)*2);
j:= (j+1) mod xKeyLen;
end;
FillChar(xKeyD,Sizeof(xKeyD),0);
end;
procedure TRC5.Burn;
begin
FillChar(KeyData,Sizeof(KeyData),$FF);
inherited Burn;
end;
procedure TRC5.EncryptECB(const InData; var OutData);
var
A, B: DWord;
i: longword;
begin
// if not fInitialized then
// raise EDCP_blockcipher.Create('Cipher not initialized');
A:= PDword(@InData)^ + KeyData[0];
B:= PDword(longword(@InData)+4)^ + KeyData[1];
for i:= 1 to NUMROUNDSRC5 do
begin
A:= A xor B;
A:= LRot32(A,B)+KeyData[2*i];
B:= B xor A;
B:= LRot32(B,A)+KeyData[(2*i)+1];
end;
PDword(@OutData)^:= A;
PDword(longword(@OutData)+4)^:= B;
end;
procedure TRC5.DecryptECB(const InData; var OutData);
var
A, B: DWord;
i: longword;
begin
// if not fInitialized then
// raise EDCP_blockcipher.Create('Cipher not initialized');
A:= PDword(@InData)^;
B:= PDword(longword(@InData)+4)^;
for i:= NUMROUNDSRC5 downto 1 do
begin
B:= RRot32(B-KeyData[(2*i)+1],A);
B:= B xor A;
A:= RRot32(A-KeyData[2*i],B);
A:= A xor B;
end;
PDword(@OutData)^:= A - KeyData[0];
PDword(longword(@OutData)+4)^:= B - KeyData[1];
end;
{--------------------}
{ Destructor ������� }
{--------------------}
destructor TTEA.Destroy;
begin
// All Strings := '';
// Free_And_Nil(All PObj);
inherited;
end;
////////////////////////////////////////////////////////////////////////////////
{-----------------------------}
{ ����������� ��� KOL ������� }
{-----------------------------}
function NewTEA;
begin
New(Result, Create);
// code
end;
////////////////////////////////////////////////////////////////////////////////
procedure TTEA.InitKey(const Key; Size: longword);
begin
burn;
FillChar(KeyData,Sizeof(KeyData),0);
Move(Key,KeyData,Size div 8);
KeyData[0]:= SwapDWord(KeyData[0]); KeyData[1]:= SwapDWord(KeyData[1]);
KeyData[2]:= SwapDWord(KeyData[2]); KeyData[3]:= SwapDWord(KeyData[3]);
end;
procedure TTEA.Burn;
begin
FillChar(KeyData,Sizeof(KeyData),0);
inherited Burn;
end;
procedure TTEA.EncryptECB(const InData; var OutData);
var
a, b, c, d, x, y, n, sum: dword;
begin
// if not fInitialized then
// raise EDCP_blockcipher.Create('Cipher not initialized');
x:= SwapDWord(pdword(@InData)^);
y:= SwapDWord(pdword(longword(@InData)+4)^);
sum:= 0; a:= KeyData[0]; b:= KeyData[1]; c:= KeyData[2]; d:= KeyData[3];
for n:= 1 to Rounds do
begin
Inc(sum,Delta);
Inc(x,(y shl 4) + (a xor y) + (sum xor (y shr 5)) + b);
Inc(y,(x shl 4) + (c xor x) + (sum xor (x shr 5)) + d);
end;
pdword(@OutData)^:= SwapDWord(x);
pdword(longword(@OutData)+4)^:= SwapDWord(y);
end;
procedure TTEA.DecryptECB(const InData; var OutData);
var
a, b, c, d, x, y, n, sum: dword;
begin
// if not fInitialized then
// raise EDCP_blockcipher.Create('Cipher not initialized');
x:= SwapDWord(pdword(@InData)^);
y:= SwapDWord(pdword(longword(@InData)+4)^);
sum:= Delta shl 5; a:= KeyData[0]; b:= KeyData[1]; c:= KeyData[2]; d:= KeyData[3];
for n:= 1 to Rounds do
begin
Dec(y,(x shl 4) + (c xor x) + (sum xor (x shr 5)) + d);
Dec(x,(y shl 4) + (a xor y) + (sum xor (y shr 5)) + b);
Dec(sum,Delta);
end;
pdword(@OutData)^:= SwapDWord(x);
pdword(longword(@OutData)+4)^:= SwapDWord(y);
end;
{--------------------}
{ Destructor ������� }
{--------------------}
destructor TDES.Destroy;
begin
// All Strings := '';
// Free_And_Nil(All PObj);
inherited;
end;
////////////////////////////////////////////////////////////////////////////////
{-----------------------------}
{ ����������� ��� KOL ������� }
{-----------------------------}
function NewDES;
begin
New(Result, Create);
// code
end;
////////////////////////////////////////////////////////////////////////////////
procedure hperm_op(var a, t: dword; n, m: dword);
begin
t:= ((a shl (16 - n)) xor a) and m;
a:= a xor t xor (t shr (16 - n));
end;
procedure perm_op(var a, b, t: dword; n, m: dword);
begin
t:= ((a shr n) xor b) and m;
b:= b xor t;
a:= a xor (t shl n);
end;
procedure Tcustomdes.DoInit(KeyB: PByteArray; KeyData: PDwordArray);
var
c, d, t, s, t2, i: dword;
begin
c:= KeyB^[0] or (KeyB^[1] shl 8) or (KeyB^[2] shl 16) or (KeyB^[3] shl 24);
d:= KeyB^[4] or (KeyB^[5] shl 8) or (KeyB^[6] shl 16) or (KeyB^[7] shl 24);
perm_op(d,c,t,4,$0f0f0f0f);
hperm_op(c,t,dword(-2),$cccc0000);
hperm_op(d,t,dword(-2),$cccc0000);
perm_op(d,c,t,1,$55555555);
perm_op(c,d,t,8,$00ff00ff);
perm_op(d,c,t,1,$55555555);
d:= ((d and $ff) shl 16) or (d and $ff00) or ((d and $ff0000) shr 16) or
((c and $f0000000) shr 4);
c:= c and $fffffff;
for i:= 0 to 15 do
begin
if shifts2[i]<> 0 then
begin
c:= ((c shr 2) or (c shl 26));
d:= ((d shr 2) or (d shl 26));
end
else
begin
c:= ((c shr 1) or (c shl 27));
d:= ((d shr 1) or (d shl 27));
end;
c:= c and $fffffff;
d:= d and $fffffff;
s:= des_skb[0,c and $3f] or
des_skb[1,((c shr 6) and $03) or ((c shr 7) and $3c)] or
des_skb[2,((c shr 13) and $0f) or ((c shr 14) and $30)] or
des_skb[3,((c shr 20) and $01) or ((c shr 21) and $06) or ((c shr 22) and $38)];
t:= des_skb[4,d and $3f] or
des_skb[5,((d shr 7) and $03) or ((d shr 8) and $3c)] or
des_skb[6, (d shr 15) and $3f ] or
des_skb[7,((d shr 21) and $0f) or ((d shr 22) and $30)];
t2:= ((t shl 16) or (s and $ffff));
KeyData^[(i shl 1)]:= ((t2 shl 2) or (t2 shr 30));
t2:= ((s shr 16) or (t and $ffff0000));
KeyData^[(i shl 1)+1]:= ((t2 shl 6) or (t2 shr 26));
end;
end;
procedure Tcustomdes.EncryptBlock(const InData; var OutData; KeyData: PDWordArray);
var
l, r, t, u: dword;
i: longint;
begin
r:= PDword(@InData)^;
l:= PDword(dword(@InData)+4)^;
t:= ((l shr 4) xor r) and $0f0f0f0f;
r:= r xor t;
l:= l xor (t shl 4);
t:= ((r shr 16) xor l) and $0000ffff;
l:= l xor t;
r:= r xor (t shl 16);
t:= ((l shr 2) xor r) and $33333333;
r:= r xor t;
l:= l xor (t shl 2);
t:= ((r shr 8) xor l) and $00ff00ff;
l:= l xor t;
r:= r xor (t shl 8);
t:= ((l shr 1) xor r) and $55555555;
r:= r xor t;
l:= l xor (t shl 1);
r:= (r shr 29) or (r shl 3);
l:= (l shr 29) or (l shl 3);
i:= 0;
while i< 32 do
begin
u:= r xor KeyData^[i ];
t:= r xor KeyData^[i+1];
t:= (t shr 4) or (t shl 28);
l:= l xor des_SPtrans[0,(u shr 2) and $3f] xor
des_SPtrans[2,(u shr 10) and $3f] xor
des_SPtrans[4,(u shr 18) and $3f] xor
des_SPtrans[6,(u shr 26) and $3f] xor
des_SPtrans[1,(t shr 2) and $3f] xor
des_SPtrans[3,(t shr 10) and $3f] xor
des_SPtrans[5,(t shr 18) and $3f] xor
des_SPtrans[7,(t shr 26) and $3f];
u:= l xor KeyData^[i+2];
t:= l xor KeyData^[i+3];
t:= (t shr 4) or (t shl 28);
r:= r xor des_SPtrans[0,(u shr 2) and $3f] xor
des_SPtrans[2,(u shr 10) and $3f] xor
des_SPtrans[4,(u shr 18) and $3f] xor
des_SPtrans[6,(u shr 26) and $3f] xor
des_SPtrans[1,(t shr 2) and $3f] xor
des_SPtrans[3,(t shr 10) and $3f] xor
des_SPtrans[5,(t shr 18) and $3f] xor
des_SPtrans[7,(t shr 26) and $3f];
u:= r xor KeyData^[i+4];
t:= r xor KeyData^[i+5];
t:= (t shr 4) or (t shl 28);
l:= l xor des_SPtrans[0,(u shr 2) and $3f] xor
des_SPtrans[2,(u shr 10) and $3f] xor
des_SPtrans[4,(u shr 18) and $3f] xor
des_SPtrans[6,(u shr 26) and $3f] xor
des_SPtrans[1,(t shr 2) and $3f] xor
des_SPtrans[3,(t shr 10) and $3f] xor
des_SPtrans[5,(t shr 18) and $3f] xor
des_SPtrans[7,(t shr 26) and $3f];
u:= l xor KeyData^[i+6];
t:= l xor KeyData^[i+7];
t:= (t shr 4) or (t shl 28);
r:= r xor des_SPtrans[0,(u shr 2) and $3f] xor
des_SPtrans[2,(u shr 10) and $3f] xor
des_SPtrans[4,(u shr 18) and $3f] xor
des_SPtrans[6,(u shr 26) and $3f] xor
des_SPtrans[1,(t shr 2) and $3f] xor
des_SPtrans[3,(t shr 10) and $3f] xor
des_SPtrans[5,(t shr 18) and $3f] xor
des_SPtrans[7,(t shr 26) and $3f];
Inc(i,8);
end;
r:= (r shr 3) or (r shl 29);
l:= (l shr 3) or (l shl 29);
t:= ((r shr 1) xor l) and $55555555;
l:= l xor t;
r:= r xor (t shl 1);
t:= ((l shr 8) xor r) and $00ff00ff;
r:= r xor t;
l:= l xor (t shl 8);
t:= ((r shr 2) xor l) and $33333333;
l:= l xor t;
r:= r xor (t shl 2);
t:= ((l shr 16) xor r) and $0000ffff;
r:= r xor t;
l:= l xor (t shl 16);
t:= ((r shr 4) xor l) and $0f0f0f0f;
l:= l xor t;
r:= r xor (t shl 4);
PDword(@OutData)^:= l;
PDword(dword(@OutData)+4)^:= r;
end;
procedure Tcustomdes.DecryptBlock(const InData; var OutData; KeyData: PDWordArray);
var
l, r, t, u: dword;
i: longint;
begin
r:= PDword(@InData)^;
l:= PDword(dword(@InData)+4)^;
t:= ((l shr 4) xor r) and $0f0f0f0f;
r:= r xor t;
l:= l xor (t shl 4);
t:= ((r shr 16) xor l) and $0000ffff;
l:= l xor t;
r:= r xor (t shl 16);
t:= ((l shr 2) xor r) and $33333333;
r:= r xor t;
l:= l xor (t shl 2);
t:= ((r shr 8) xor l) and $00ff00ff;
l:= l xor t;
r:= r xor (t shl 8);
t:= ((l shr 1) xor r) and $55555555;
r:= r xor t;
l:= l xor (t shl 1);
r:= (r shr 29) or (r shl 3);
l:= (l shr 29) or (l shl 3);
i:= 30;
while i> 0 do
begin
u:= r xor KeyData^[i ];
t:= r xor KeyData^[i+1];
t:= (t shr 4) or (t shl 28);
l:= l xor des_SPtrans[0,(u shr 2) and $3f] xor
des_SPtrans[2,(u shr 10) and $3f] xor
des_SPtrans[4,(u shr 18) and $3f] xor
des_SPtrans[6,(u shr 26) and $3f] xor
des_SPtrans[1,(t shr 2) and $3f] xor
des_SPtrans[3,(t shr 10) and $3f] xor
des_SPtrans[5,(t shr 18) and $3f] xor
des_SPtrans[7,(t shr 26) and $3f];
u:= l xor KeyData^[i-2];
t:= l xor KeyData^[i-1];
t:= (t shr 4) or (t shl 28);
r:= r xor des_SPtrans[0,(u shr 2) and $3f] xor
des_SPtrans[2,(u shr 10) and $3f] xor
des_SPtrans[4,(u shr 18) and $3f] xor
des_SPtrans[6,(u shr 26) and $3f] xor
des_SPtrans[1,(t shr 2) and $3f] xor
des_SPtrans[3,(t shr 10) and $3f] xor
des_SPtrans[5,(t shr 18) and $3f] xor
des_SPtrans[7,(t shr 26) and $3f];
u:= r xor KeyData^[i-4];
t:= r xor KeyData^[i-3];
t:= (t shr 4) or (t shl 28);
l:= l xor des_SPtrans[0,(u shr 2) and $3f] xor
des_SPtrans[2,(u shr 10) and $3f] xor
des_SPtrans[4,(u shr 18) and $3f] xor
des_SPtrans[6,(u shr 26) and $3f] xor
des_SPtrans[1,(t shr 2) and $3f] xor
des_SPtrans[3,(t shr 10) and $3f] xor
des_SPtrans[5,(t shr 18) and $3f] xor
des_SPtrans[7,(t shr 26) and $3f];
u:= l xor KeyData^[i-6];
t:= l xor KeyData^[i-5];
t:= (t shr 4) or (t shl 28);
r:= r xor des_SPtrans[0,(u shr 2) and $3f] xor
des_SPtrans[2,(u shr 10) and $3f] xor
des_SPtrans[4,(u shr 18) and $3f] xor
des_SPtrans[6,(u shr 26) and $3f] xor
des_SPtrans[1,(t shr 2) and $3f] xor
des_SPtrans[3,(t shr 10) and $3f] xor
des_SPtrans[5,(t shr 18) and $3f] xor
des_SPtrans[7,(t shr 26) and $3f];
Dec(i,8);
end;
r:= (r shr 3) or (r shl 29);
l:= (l shr 3) or (l shl 29);
t:= ((r shr 1) xor l) and $55555555;
l:= l xor t;
r:= r xor (t shl 1);
t:= ((l shr 8) xor r) and $00ff00ff;
r:= r xor t;
l:= l xor (t shl 8);
t:= ((r shr 2) xor l) and $33333333;
l:= l xor t;
r:= r xor (t shl 2);
t:= ((l shr 16) xor r) and $0000ffff;
r:= r xor t;
l:= l xor (t shl 16);
t:= ((r shr 4) xor l) and $0f0f0f0f;
l:= l xor t;
r:= r xor (t shl 4);
PDword(@OutData)^:= l;
PDword(dword(@OutData)+4)^:= r;
end;
procedure Tdes.InitKey(const Key; Size: longword);
var
KeyB: array[0..7] of byte;
begin
burn;
FillChar(KeyB,Sizeof(KeyB),0);
Move(Key,KeyB,Size div 8);
DoInit(@KeyB,@KeyData);
end;
procedure Tdes.Burn;
begin
FillChar(KeyData,Sizeof(KeyData),0);
inherited Burn;
end;
procedure Tdes.EncryptECB(const InData; var OutData);
begin
// if not fInitialized then
// raise EDCP_blockcipher.Create('Cipher not initialized');
EncryptBlock(InData,OutData,@KeyData);
end;
procedure Tdes.DecryptECB(const InData; var OutData);
begin
// if not fInitialized then
// raise EDCP_blockcipher.Create('Cipher not initialized');
DecryptBlock(InData,OutData,@KeyData);
end;
{--------------------}
{ Destructor ������� }
{--------------------}
destructor T3DES.Destroy;
begin
// All Strings := '';
// Free_And_Nil(All PObj);
inherited;
end;
////////////////////////////////////////////////////////////////////////////////
{-----------------------------}
{ ����������� ��� KOL ������� }
{-----------------------------}
function New3DES;
begin
New(Result, Create);
//burn;
// code
end;
////////////////////////////////////////////////////////////////////////////////
procedure T3DES.InitKey(const Key; Size: longword);
var
KeyB: array[0..2,0..7] of byte;
begin
burn;
FillChar(KeyB,Sizeof(KeyB),0);
Move(Key,KeyB,Size div 8);
DoInit(@KeyB[0],@KeyData[0]);
DoInit(@KeyB[1],@KeyData[1]);
if Size> 128 then
DoInit(@KeyB[2],@KeyData[2])
else
Move(KeyData[0],KeyData[2],128);
end;
procedure T3DES.Burn;
begin
FillChar(KeyData,Sizeof(KeyData),0);
inherited Burn;
end;
procedure T3des.EncryptECB(const InData; var OutData);
begin
// if not fInitialized then
// raise EDCP_blockcipher.Create('Cipher not initialized');
EncryptBlock(InData,OutData,@KeyData[0]);
DecryptBlock(OutData,OutData,@KeyData[1]);
EncryptBlock(OutData,OutData,@KeyData[2]);
end;
procedure T3des.DecryptECB(const InData; var OutData);
begin
// if not fInitialized then
// raise EDCP_blockcipher.Create('Cipher not initialized');
DecryptBlock(InData,OutData,@KeyData[2]);
EncryptBlock(OutData,OutData,@KeyData[1]);
DecryptBlock(OutData,OutData,@KeyData[0]);
end;
var
ice_sbox: array[0..3,0..1023] of dword;
ice_sboxdone: boolean;
const
ice_smod: array[0..3,0..3] of dword= (
(333, 313, 505, 369),
(379, 375, 319, 391),
(361, 445, 451, 397),
(397, 425, 395, 505));
ice_sxor: array[0..3,0..3] of dword= (
($83, $85, $9b, $cd),
($cc, $a7, $ad, $41),
($4b, $2e, $d4, $33),
($ea, $cb, $2e, $04));
ice_keyrot: array[0..15] of dword= (
0, 1, 2, 3, 2, 1, 3, 0,
1, 3, 2, 0, 3, 1, 0, 2);
ice_pbox: array[0..31] of dword= (
$00000001, $00000080, $00000400, $00002000,
$00080000, $00200000, $01000000, $40000000,
$00000008, $00000020, $00000100, $00004000,
$00010000, $00800000, $04000000, $20000000,
$00000004, $00000010, $00000200, $00008000,
$00020000, $00400000, $08000000, $10000000,
$00000002, $00000040, $00000800, $00001000,
$00040000, $00100000, $02000000, $80000000);
{******************************************************************************}
function gf_mult(a, b, m: dword): dword;
var
res: dword;
begin
res:= 0;
while b<> 0 do
begin
if (b and 1)<> 0 then
res:= res xor a;
a:= a shl 1;
b:= b shr 1;
if a>= 256 then
a:= a xor m;
end;
Result:= res;
end;
function gf_exp7(b, m: dword): dword;
var
x: dword;
begin
if b= 0 then
Result:= 0
else
begin
x:= gf_mult(b,b,m);
x:= gf_mult(b,x,m);
x:= gf_mult(x,x,m);
Result:= gf_mult(b,x,m);
end;
end;
function ice_perm32(x: dword): dword;
var
res: dword;
pbox: pdword;
begin
res:= 0;
pbox:= @ice_pbox;
while x<> 0 do
begin
if (x and 1)<> 0 then
res:= res or pbox^;
Inc(pbox);
x:= x shr 1;
end;
Result:= res;
end;
procedure ice_sboxes_init;
var
i, col, row: dword;
x: dword;
begin
for i:= 0 to 1023 do
begin
col:= (i shr 1) and $FF;
row:= (i and 1) or ((i and $200) shr 8);
x:= gf_exp7(col xor ice_sxor[0,row],ice_smod[0,row]) shl 24;
ice_sbox[0,i]:= ice_perm32(x);
x:= gf_exp7(col xor ice_sxor[1,row],ice_smod[1,row]) shl 16;
ice_sbox[1,i]:= ice_perm32(x);
x:= gf_exp7(col xor ice_sxor[2,row],ice_smod[2,row]) shl 8;
ice_sbox[2,i]:= ice_perm32(x);
x:= gf_exp7(col xor ice_sxor[3,row],ice_smod[3,row]);
ice_sbox[3,i]:= ice_perm32(x);
end;
end;
function Tcustomice.f(p, sk: dword): dword;
var
tl, tr, al, ar: dword;
begin
tl:= ((p shr 16) and $3ff) or (((p shr 14) or (p shl 18)) and $ffc00);
tr:= (p and $3ff) or ((p shl 2) and $ffc00);
al:= ik_keysched[sk,2] and (tl xor tr);
ar:= al xor tr;
al:= al xor tl;
al:= al xor ik_keysched[sk,0];
ar:= ar xor ik_keysched[sk,1];
Result:= ice_sbox[0,al shr 10] or ice_sbox[1,al and $3ff] or
ice_sbox[2,ar shr 10] or ice_sbox[3,ar and $3ff];
end;
procedure Tcustomice.key_sched_build(kb: pwordarray; n: dword; keyrot: pdwordarray);
var
i, j, k, kr: dword;
keys: pdwordarray;
currentsk: pdword;
currentkb: pword;
bit: dword;
begin
for i:= 0 to 7 do
begin
kr:= keyrot^[i];
keys:= @ik_keysched[n+i];
for j:= 0 to 2 do
keys^[j]:= 0;
for j:= 0 to 14 do
begin
currentsk:= @keys^[j mod 3];
for k:= 0 to 3 do
begin
currentkb:= @kb^[(kr + k) and 3];
bit:= currentkb^ and 1;
currentsk^:= (currentsk^ shl 1) or bit;
currentkb^:= (currentkb^ shr 1) or ((bit xor 1) shl 15);
end;
end;
end;
end;
procedure Tcustomice.InitIce(const Key; Size: longword; n: dword);
var
i, j: dword;
kb: array[0..3] of word;
keyb: array[0..15] of byte;
begin
FillChar(keyb,Sizeof(keyb),0);
Move(key,keyb,Size div 8);
if n> 0 then
rounds:= 16 * n
else
rounds:= 8;
if rounds= 8 then
begin
for i:= 0 to 4 do
kb[3 - i]:= (keyb[i*2] shl 8) or keyb[i*2 + 1];
key_sched_build(@kb,0,@ice_keyrot);
end
else
begin
for i:= 0 to (n-1) do
begin
for j:= 0 to 3 do
kb[3-j]:= (keyb[i*8 + j*2] shl 8) or keyb[i*8 + j*2 + 1];
key_sched_build(@kb,i*8,@ice_keyrot);
key_sched_build(@kb,rounds - 8 - i*8,@ice_keyrot[8]);
end;
end;
end;
procedure Tcustomice.Burn;
begin
FillChar(ik_keysched,Sizeof(ik_keysched),0);
Rounds:= 0;
inherited Burn;
end;
procedure Tcustomice.EncryptECB(const InData; var OutData);
var
i, l, r: dword;
begin
// if not fInitialized then
// raise EDCP_blockcipher.Create('Cipher not initialized');
l:= SwapDWord(Pdword(@InData)^);
r:= SwapDWord(Pdword(longword(@InData)+4)^);
i:= 0;
while i< rounds do
begin
l:= l xor f(r,i);
r:= r xor f(l,i+1);
Inc(i,2);
end;
Pdword(@OutData)^:= SwapDWord(r);
Pdword(longword(@OutData)+4)^:= SwapDWord(l);
end;
procedure Tcustomice.DecryptECB(const InData; var OutData);
var
l, r: dword;
i: integer;
begin
// if not fInitialized then
// raise EDCP_blockcipher.Create('Cipher not initialized');
l:= SwapDWord(Pdword(@InData)^);
r:= SwapDWord(Pdword(longword(@InData)+4)^);
i:= rounds-1;
while i> 0 do
begin
l:= l xor f(r,i);
r:= r xor f(l,i-1);
Dec(i,2);
end;
Pdword(@OutData)^:= SwapDWord(r);
Pdword(longword(@OutData)+4)^:= SwapDWord(l);
end;
destructor TICE.Destroy;
begin
// All Strings := '';
// Free_And_Nil(All PObj);
inherited;
end;
////////////////////////////////////////////////////////////////////////////////
{-----------------------------}
{ ����������� ��� KOL ������� }
{-----------------------------}
function NewICE;
begin
New(Result, Create);
if not ice_sboxdone then
begin
ice_sboxes_init;
ice_sboxdone:= true;
end;
// code
end;
destructor TICE2.Destroy;
begin
// All Strings := '';
// Free_And_Nil(All PObj);
inherited;
end;
////////////////////////////////////////////////////////////////////////////////
procedure Tice.InitKey(const Key; Size: longword);
begin
burn;
InitIce(Key,Size,1);
end;
{-----------------------------}
{ ����������� ��� KOL ������� }
{-----------------------------}
function NewICE2;
begin
New(Result, Create);
if not ice_sboxdone then
begin
ice_sboxes_init;
ice_sboxdone:= true;
end;
// code
end;
destructor TThinICE.Destroy;
begin
// All Strings := '';
// Free_And_Nil(All PObj);
inherited;
end;
////////////////////////////////////////////////////////////////////////////////
procedure Tice2.InitKey(const Key; Size: longword);
begin
burn;
InitIce(Key,Size,2);
end;
{-----------------------------}
{ ����������� ��� KOL ������� }
{-----------------------------}
function NewThinICE;
begin
New(Result, Create);
if not ice_sboxdone then
begin
ice_sboxes_init;
ice_sboxdone:= true;
end;
// code
end;
procedure Tthinice.InitKey(const Key; Size: longword);
begin
burn;
InitIce(Key,Size,0);
end;
{--------------------}
{ Destructor ������� }
{--------------------}
destructor TCast256.Destroy;
begin
// All Strings := '';
// Free_And_Nil(All PObj);
inherited;
end;
////////////////////////////////////////////////////////////////////////////////
{-----------------------------}
{ ����������� ��� KOL ������� }
{-----------------------------}
function NewCast256;
begin
New(Result, Create);
// code
end;
////////////////////////////////////////////////////////////////////////////////
function F1(a,rk,mk: DWord): DWord;
var
t: DWord;
begin
t:= LRot32(mk + a,rk);
Result:= ((S1[t shr 24] xor S2[(t shr 16) and $FF]) - S3[(t shr 8) and $FF]) + S4[t and $FF];
end;
function F2(a,rk,mk: DWord): DWord;
var
t: DWord;
begin
t:= LRot32(mk xor a,rk);
Result:= ((S1[t shr 24] - S2[(t shr 16) and $FF]) + S3[(t shr 8) and $FF]) xor S4[t and $FF];
end;
function F3(a,rk,mk: DWord): DWord;
var
t: DWord;
begin
t:= LRot32(mk - a,rk);
Result:= ((S1[t shr 24] + S2[(t shr 16) and $FF]) xor S3[(t shr 8) and $FF]) - S4[t and $FF];
end;
procedure Tcast256.InitKey(const Key; Size: longword);
var
x: array[0..7] of DWord;
cm, cr: DWord;
i, j: longword;
tr, tm: array[0..7] of DWord;
begin
burn;
Size:= Size div 8;
FillChar(x,Sizeof(x),0);
Move(Key,x,Size);
cm:= $5a827999;
cr:= 19;
for i:= 0 to 7 do
x[i]:= (x[i] shl 24) or ((x[i] shl 8) and $FF0000) or ((x[i] shr 8) and $FF00) or (x[i] shr 24);
for i:= 0 to 11 do
begin
for j:= 0 to 7 do
begin
tm[j]:= cm;
Inc(cm,$6ed9eba1);
tr[j]:= cr;
Inc(cr,17);
end;
x[6]:= x[6] xor f1(x[7],tr[0],tm[0]);
x[5]:= x[5] xor f2(x[6],tr[1],tm[1]);
x[4]:= x[4] xor f3(x[5],tr[2],tm[2]);
x[3]:= x[3] xor f1(x[4],tr[3],tm[3]);
x[2]:= x[2] xor f2(x[3],tr[4],tm[4]);
x[1]:= x[1] xor f3(x[2],tr[5],tm[5]);
x[0]:= x[0] xor f1(x[1],tr[6],tm[6]);
x[7]:= x[7] xor f2(x[0],tr[7],tm[7]);
for j:= 0 to 7 do
begin
tm[j]:= cm;
Inc(cm,$6ed9eba1);
tr[j]:= cr;
Inc(cr,17);
end;
x[6]:= x[6] xor f1(x[7],tr[0],tm[0]);
x[5]:= x[5] xor f2(x[6],tr[1],tm[1]);
x[4]:= x[4] xor f3(x[5],tr[2],tm[2]);
x[3]:= x[3] xor f1(x[4],tr[3],tm[3]);
x[2]:= x[2] xor f2(x[3],tr[4],tm[4]);
x[1]:= x[1] xor f3(x[2],tr[5],tm[5]);
x[0]:= x[0] xor f1(x[1],tr[6],tm[6]);
x[7]:= x[7] xor f2(x[0],tr[7],tm[7]);
Kr[i,0]:= x[0] and 31;
Kr[i,1]:= x[2] and 31;
Kr[i,2]:= x[4] and 31;
Kr[i,3]:= x[6] and 31;
Km[i,0]:= x[7];
Km[i,1]:= x[5];
Km[i,2]:= x[3];
Km[i,3]:= x[1];
end;
FillChar(x,Sizeof(x),$FF);
end;
procedure Tcast256.Burn;
begin
FillChar(Kr,Sizeof(Kr),$FF);
FillChar(Km,Sizeof(Km),$FF);
inherited Burn;
end;
procedure Tcast256.EncryptECB(const InData; var OutData);
var
A: array[0..3] of DWord;
begin
// if not fInitialized then
// raise EDCP_blockcipher.Create('Cipher not initialized');
A[0]:= PDWord(@InData)^;
A[1]:= PDWord(longword(@InData)+4)^;
A[2]:= PDWord(longword(@InData)+8)^;
A[3]:= PDWord(longword(@InData)+12)^;
A[0]:= SwapDWord(A[0]);
A[1]:= SwapDWord(A[1]);
A[2]:= SwapDWord(A[2]);
A[3]:= SwapDWord(A[3]);
A[2]:= A[2] xor f1(A[3],kr[0,0],km[0,0]);
A[1]:= A[1] xor f2(A[2],kr[0,1],km[0,1]);
A[0]:= A[0] xor f3(A[1],kr[0,2],km[0,2]);
A[3]:= A[3] xor f1(A[0],kr[0,3],km[0,3]);
A[2]:= A[2] xor f1(A[3],kr[1,0],km[1,0]);
A[1]:= A[1] xor f2(A[2],kr[1,1],km[1,1]);
A[0]:= A[0] xor f3(A[1],kr[1,2],km[1,2]);
A[3]:= A[3] xor f1(A[0],kr[1,3],km[1,3]);
A[2]:= A[2] xor f1(A[3],kr[2,0],km[2,0]);
A[1]:= A[1] xor f2(A[2],kr[2,1],km[2,1]);
A[0]:= A[0] xor f3(A[1],kr[2,2],km[2,2]);
A[3]:= A[3] xor f1(A[0],kr[2,3],km[2,3]);
A[2]:= A[2] xor f1(A[3],kr[3,0],km[3,0]);
A[1]:= A[1] xor f2(A[2],kr[3,1],km[3,1]);
A[0]:= A[0] xor f3(A[1],kr[3,2],km[3,2]);
A[3]:= A[3] xor f1(A[0],kr[3,3],km[3,3]);
A[2]:= A[2] xor f1(A[3],kr[4,0],km[4,0]);
A[1]:= A[1] xor f2(A[2],kr[4,1],km[4,1]);
A[0]:= A[0] xor f3(A[1],kr[4,2],km[4,2]);
A[3]:= A[3] xor f1(A[0],kr[4,3],km[4,3]);
A[2]:= A[2] xor f1(A[3],kr[5,0],km[5,0]);
A[1]:= A[1] xor f2(A[2],kr[5,1],km[5,1]);
A[0]:= A[0] xor f3(A[1],kr[5,2],km[5,2]);
A[3]:= A[3] xor f1(A[0],kr[5,3],km[5,3]);
A[3]:= A[3] xor f1(A[0],kr[6,3],km[6,3]);
A[0]:= A[0] xor f3(A[1],kr[6,2],km[6,2]);
A[1]:= A[1] xor f2(A[2],kr[6,1],km[6,1]);
A[2]:= A[2] xor f1(A[3],kr[6,0],km[6,0]);
A[3]:= A[3] xor f1(A[0],kr[7,3],km[7,3]);
A[0]:= A[0] xor f3(A[1],kr[7,2],km[7,2]);
A[1]:= A[1] xor f2(A[2],kr[7,1],km[7,1]);
A[2]:= A[2] xor f1(A[3],kr[7,0],km[7,0]);
A[3]:= A[3] xor f1(A[0],kr[8,3],km[8,3]);
A[0]:= A[0] xor f3(A[1],kr[8,2],km[8,2]);
A[1]:= A[1] xor f2(A[2],kr[8,1],km[8,1]);
A[2]:= A[2] xor f1(A[3],kr[8,0],km[8,0]);
A[3]:= A[3] xor f1(A[0],kr[9,3],km[9,3]);
A[0]:= A[0] xor f3(A[1],kr[9,2],km[9,2]);
A[1]:= A[1] xor f2(A[2],kr[9,1],km[9,1]);
A[2]:= A[2] xor f1(A[3],kr[9,0],km[9,0]);
A[3]:= A[3] xor f1(A[0],kr[10,3],km[10,3]);
A[0]:= A[0] xor f3(A[1],kr[10,2],km[10,2]);
A[1]:= A[1] xor f2(A[2],kr[10,1],km[10,1]);
A[2]:= A[2] xor f1(A[3],kr[10,0],km[10,0]);
A[3]:= A[3] xor f1(A[0],kr[11,3],km[11,3]);
A[0]:= A[0] xor f3(A[1],kr[11,2],km[11,2]);
A[1]:= A[1] xor f2(A[2],kr[11,1],km[11,1]);
A[2]:= A[2] xor f1(A[3],kr[11,0],km[11,0]);
A[0]:= SwapDWord(A[0]);
A[1]:= SwapDWord(A[1]);
A[2]:= SwapDWord(A[2]);
A[3]:= SwapDWord(A[3]);
PDWord(@OutData)^:= A[0];
PDWord(longword(@OutData)+4)^:= A[1];
PDWord(longword(@OutData)+8)^:= A[2];
PDWord(longword(@OutData)+12)^:= A[3];
end;
procedure Tcast256.DecryptECB(const InData; var OutData);
var
A: array[0..3] of DWord;
begin
// if not fInitialized then
// raise EDCP_blockcipher.Create('Cipher not initialized');
A[0]:= PDWord(@InData)^;
A[1]:= PDWord(longword(@InData)+4)^;
A[2]:= PDWord(longword(@InData)+8)^;
A[3]:= PDWord(longword(@InData)+12)^;
A[0]:= SwapDWord(A[0]);
A[1]:= SwapDWord(A[1]);
A[2]:= SwapDWord(A[2]);
A[3]:= SwapDWord(A[3]);
A[2]:= A[2] xor f1(A[3],kr[11,0],km[11,0]);
A[1]:= A[1] xor f2(A[2],kr[11,1],km[11,1]);
A[0]:= A[0] xor f3(A[1],kr[11,2],km[11,2]);
A[3]:= A[3] xor f1(A[0],kr[11,3],km[11,3]);
A[2]:= A[2] xor f1(A[3],kr[10,0],km[10,0]);
A[1]:= A[1] xor f2(A[2],kr[10,1],km[10,1]);
A[0]:= A[0] xor f3(A[1],kr[10,2],km[10,2]);
A[3]:= A[3] xor f1(A[0],kr[10,3],km[10,3]);
A[2]:= A[2] xor f1(A[3],kr[9,0],km[9,0]);
A[1]:= A[1] xor f2(A[2],kr[9,1],km[9,1]);
A[0]:= A[0] xor f3(A[1],kr[9,2],km[9,2]);
A[3]:= A[3] xor f1(A[0],kr[9,3],km[9,3]);
A[2]:= A[2] xor f1(A[3],kr[8,0],km[8,0]);
A[1]:= A[1] xor f2(A[2],kr[8,1],km[8,1]);
A[0]:= A[0] xor f3(A[1],kr[8,2],km[8,2]);
A[3]:= A[3] xor f1(A[0],kr[8,3],km[8,3]);
A[2]:= A[2] xor f1(A[3],kr[7,0],km[7,0]);
A[1]:= A[1] xor f2(A[2],kr[7,1],km[7,1]);
A[0]:= A[0] xor f3(A[1],kr[7,2],km[7,2]);
A[3]:= A[3] xor f1(A[0],kr[7,3],km[7,3]);
A[2]:= A[2] xor f1(A[3],kr[6,0],km[6,0]);
A[1]:= A[1] xor f2(A[2],kr[6,1],km[6,1]);
A[0]:= A[0] xor f3(A[1],kr[6,2],km[6,2]);
A[3]:= A[3] xor f1(A[0],kr[6,3],km[6,3]);
A[3]:= A[3] xor f1(A[0],kr[5,3],km[5,3]);
A[0]:= A[0] xor f3(A[1],kr[5,2],km[5,2]);
A[1]:= A[1] xor f2(A[2],kr[5,1],km[5,1]);
A[2]:= A[2] xor f1(A[3],kr[5,0],km[5,0]);
A[3]:= A[3] xor f1(A[0],kr[4,3],km[4,3]);
A[0]:= A[0] xor f3(A[1],kr[4,2],km[4,2]);
A[1]:= A[1] xor f2(A[2],kr[4,1],km[4,1]);
A[2]:= A[2] xor f1(A[3],kr[4,0],km[4,0]);
A[3]:= A[3] xor f1(A[0],kr[3,3],km[3,3]);
A[0]:= A[0] xor f3(A[1],kr[3,2],km[3,2]);
A[1]:= A[1] xor f2(A[2],kr[3,1],km[3,1]);
A[2]:= A[2] xor f1(A[3],kr[3,0],km[3,0]);
A[3]:= A[3] xor f1(A[0],kr[2,3],km[2,3]);
A[0]:= A[0] xor f3(A[1],kr[2,2],km[2,2]);
A[1]:= A[1] xor f2(A[2],kr[2,1],km[2,1]);
A[2]:= A[2] xor f1(A[3],kr[2,0],km[2,0]);
A[3]:= A[3] xor f1(A[0],kr[1,3],km[1,3]);
A[0]:= A[0] xor f3(A[1],kr[1,2],km[1,2]);
A[1]:= A[1] xor f2(A[2],kr[1,1],km[1,1]);
A[2]:= A[2] xor f1(A[3],kr[1,0],km[1,0]);
A[3]:= A[3] xor f1(A[0],kr[0,3],km[0,3]);
A[0]:= A[0] xor f3(A[1],kr[0,2],km[0,2]);
A[1]:= A[1] xor f2(A[2],kr[0,1],km[0,1]);
A[2]:= A[2] xor f1(A[3],kr[0,0],km[0,0]);
A[0]:= SwapDWord(A[0]);
A[1]:= SwapDWord(A[1]);
A[2]:= SwapDWord(A[2]);
A[3]:= SwapDWord(A[3]);
PDWord(@OutData)^:= A[0];
PDWord(longword(@OutData)+4)^:= A[1];
PDWord(longword(@OutData)+8)^:= A[2];
PDWord(longword(@OutData)+12)^:= A[3];
end;
{--------------------}
{ Destructor ������� }
{--------------------}
destructor TMars.Destroy;
begin
// All Strings := '';
// Free_And_Nil(All PObj);
inherited;
end;
////////////////////////////////////////////////////////////////////////////////
{-----------------------------}
{ ����������� ��� KOL ������� }
{-----------------------------}
function NewMars;
begin
New(Result, Create);
// code
end;
////////////////////////////////////////////////////////////////////////////////
procedure gen_mask(var x, m: DWord);
var
u: DWord;
begin
u:= x and (x shr 1); u:= u and (u shr 2);
u:= u and (u shr 4); u:= u and (u shr 1) and (u shr 2);
m:= u;
u:= (x xor $FFFFFFFF) and ((x xor $FFFFFFFF) shr 1); u:= u and (u shr 2);
u:= u and (u shr 4); u:= u and (u shr 1) and (u shr 2);
u:= u or m;
m:= (u shl 1) or (u shl 2) or (u shl 3)
or (u shl 4) or (u shl 5) or (u shl 6)
or (u shl 7) or (u shl 8);
m:= (m or u or (u shl 9)) and ((x xor $FFFFFFFF) xor (x shl 1)) and ((x xor $FFFFFFFF) xor (x shr 1));
m:= m and $FFFFFFFC;
end;
procedure Tmars.InitKey(const Key; Size: longword);
var
i, j, m, u, w: DWord;
t: array[-7..39] of DWord;
KeyB: array[0..39] of DWord;
begin
burn;
Size:= Size div 8;
FillChar(KeyB,Sizeof(KeyB),0);
Move(Key,KeyB,Size);
Size:= Size div 4;
Move(vk,t,Sizeof(vk));
for i:= 0 to 38 do
begin
u:= t[i-7] xor t[i-2];
t[i]:= LRot32(u,3) xor KeyB[i mod DWord(Size)] xor i;
end;
t[39]:= Size;
for j:= 0 to 6 do
begin
for i:= 1 to 39 do
begin
u:= t[i] + s_box[t[i-1] and $1FF];
t[i]:= LRot32(u,9);
end;
u:= t[0] + s_box[t[39] and $1FF];
t[0]:= LRot32(u,9);
end;
for i:= 0 to 39 do
KeyData[(7*i) mod 40]:= t[i];
i:= 5;
repeat
u:= s_box[265+(KeyData[i] and $3)];
j:= KeyData[i+3] and $1f;
w:= KeyData[i] or $3;
gen_mask(w,m);
KeyData[i]:= w xor (LRot32(u,j) and m);
Inc(i,2);
until i>= 37;
end;
procedure Tmars.Burn;
begin
FillChar(KeyData,Sizeof(KeyData),$FF);
inherited Burn;
end;
procedure Tmars.EncryptECB(const InData; var OutData);
var
l, m, r, t: DWord;
blk: array[0..3] of DWord;
begin
// if not fInitialized then
// raise EDCP_blockcipher.Create('Cipher not initialized');
Blk[0]:= PDWord(@InData)^;
Blk[1]:= PDWord(longword(@InData)+4)^;
Blk[2]:= PDWord(longword(@InData)+8)^;
Blk[3]:= PDWord(longword(@InData)+12)^;
blk[0]:= blk[0] + KeyData[0]; blk[1]:= blk[1] + KeyData[1];
blk[2]:= blk[2] + KeyData[2]; blk[3]:= blk[3] + KeyData[3];
blk[1]:= blk[1] xor s_box[ blk[0] and $FF];
blk[1]:= blk[1] + s_box[((blk[0] shr 8) and $FF) + 256];
blk[2]:= blk[2] + s_box[ (blk[0] shr 16) and $FF];
blk[3]:= blk[3] xor s_box[((blk[0] shr 24) and $FF) + 256];
blk[0]:= RRot32(blk[0], 24); blk[0]:= blk[0] + blk[3];
blk[2]:= blk[2] xor s_box[ blk[1] and $FF];
blk[2]:= blk[2] + s_box[((blk[1] shr 8) and $FF) + 256];
blk[3]:= blk[3] + s_box[ (blk[1] shr 16) and $FF];
blk[0]:= blk[0] xor s_box[((blk[1] shr 24) and $FF) + 256];
blk[1]:= RRot32(blk[1], 24); blk[1]:= blk[1] + blk[2];
blk[3]:= blk[3] xor s_box[ blk[2] and $FF];
blk[3]:= blk[3] + s_box[((blk[2] shr 8) and $FF) + 256];
blk[0]:= blk[0] + s_box[ (blk[2] shr 16) and $FF];
blk[1]:= blk[1] xor s_box[((blk[2] shr 24) and $FF) + 256];
blk[2]:= RRot32(blk[2], 24);
blk[0]:= blk[0] xor s_box[ blk[3] and $FF];
blk[0]:= blk[0] + s_box[((blk[3] shr 8) and $FF) + 256];
blk[1]:= blk[1] + s_box[ (blk[3] shr 16) and $FF];
blk[2]:= blk[2] xor s_box[((blk[3] shr 24) and $FF) + 256];
blk[3]:= RRot32(blk[3], 24);
blk[1]:= blk[1] xor s_box[ blk[0] and $FF];
blk[1]:= blk[1] + s_box[((blk[0] shr 8) and $FF) + 256];
blk[2]:= blk[2] + s_box[ (blk[0] shr 16) and $FF];
blk[3]:= blk[3] xor s_box[((blk[0] shr 24) and $FF) + 256];
blk[0]:= RRot32(blk[0], 24); blk[0]:= blk[0] + blk[3];
blk[2]:= blk[2] xor s_box[ blk[1] and $FF];
blk[2]:= blk[2] + s_box[((blk[1] shr 8) and $FF) + 256];
blk[3]:= blk[3] + s_box[ (blk[1] shr 16) and $FF];
blk[0]:= blk[0] xor s_box[((blk[1] shr 24) and $FF) + 256];
blk[1]:= RRot32(blk[1], 24); blk[1]:= blk[1] + blk[2];
blk[3]:= blk[3] xor s_box[ blk[2] and $FF];
blk[3]:= blk[3] + s_box[((blk[2] shr 8) and $FF) + 256];
blk[0]:= blk[0] + s_box[ (blk[2] shr 16) and $FF];
blk[1]:= blk[1] xor s_box[((blk[2] shr 24) and $FF) + 256];
blk[2]:= RRot32(blk[2], 24);
blk[0]:= blk[0] xor s_box[ blk[3] and $FF];
blk[0]:= blk[0] + s_box[((blk[3] shr 8) and $FF) + 256];
blk[1]:= blk[1] + s_box[ (blk[3] shr 16) and $FF];
blk[2]:= blk[2] xor s_box[((blk[3] shr 24) and $FF) + 256];
blk[3]:= RRot32(blk[3], 24);
m:= blk[0] + KeyData[4];
r:= LRot32(blk[0],13) * KeyData[5];
l:= s_box[m and $1FF]; r:= LRot32(r,5);
t:= r and $1f; m:= LRot32(m,t);
l:= l xor r; r:= LRot32(r,5); l:= l xor r;
t:= r and $1f; l:= LRot32(l,t);
blk[0]:= LRot32(blk[0],13);
blk[1]:= blk[1] + l;
blk[2]:= blk[2] + m;
blk[3]:= blk[3] xor r;
m:= blk[1] + KeyData[6];
r:= LRot32(blk[1],13) * KeyData[7];
l:= s_box[m and $1FF]; r:= LRot32(r,5);
t:= r and $1f; m:= LRot32(m,t);
l:= l xor r; r:= LRot32(r,5); l:= l xor r;
t:= r and $1f; l:= LRot32(l,t);
blk[1]:= LRot32(blk[1],13);
blk[2]:= blk[2] + l;
blk[3]:= blk[3] + m;
blk[0]:= blk[0] xor r;
m:= blk[2] + KeyData[8];
r:= LRot32(blk[2],13) * KeyData[9];
l:= s_box[m and $1FF]; r:= LRot32(r,5);
t:= r and $1f; m:= LRot32(m,t);
l:= l xor r; r:= LRot32(r,5); l:= l xor r;
t:= r and $1f; l:= LRot32(l,t);
blk[2]:= LRot32(blk[2],13);
blk[3]:= blk[3] + l;
blk[0]:= blk[0] + m;
blk[1]:= blk[1] xor r;
m:= blk[3] + KeyData[10];
r:= LRot32(blk[3],13) * KeyData[11];
l:= s_box[m and $1FF]; r:= LRot32(r,5);
t:= r and $1f; m:= LRot32(m,t);
l:= l xor r; r:= LRot32(r,5); l:= l xor r;
t:= r and $1f; l:= LRot32(l,t);
blk[3]:= LRot32(blk[3],13);
blk[0]:= blk[0] + l;
blk[1]:= blk[1] + m;
blk[2]:= blk[2] xor r;
m:= blk[0] + KeyData[12];
r:= LRot32(blk[0],13) * KeyData[13];
l:= s_box[m and $1FF]; r:= LRot32(r,5);
t:= r and $1f; m:= LRot32(m,t);
l:= l xor r; r:= LRot32(r,5); l:= l xor r;
t:= r and $1f; l:= LRot32(l,t);
blk[0]:= LRot32(blk[0],13);
blk[1]:= blk[1] + l;
blk[2]:= blk[2] + m;
blk[3]:= blk[3] xor r;
m:= blk[1] + KeyData[14];
r:= LRot32(blk[1],13) * KeyData[15];
l:= s_box[m and $1FF]; r:= LRot32(r,5);
t:= r and $1f; m:= LRot32(m,t);
l:= l xor r; r:= LRot32(r,5); l:= l xor r;
t:= r and $1f; l:= LRot32(l,t);
blk[1]:= LRot32(blk[1],13);
blk[2]:= blk[2] + l;
blk[3]:= blk[3] + m;
blk[0]:= blk[0] xor r;
m:= blk[2] + KeyData[16];
r:= LRot32(blk[2],13) * KeyData[17];
l:= s_box[m and $1FF]; r:= LRot32(r,5);
t:= r and $1f; m:= LRot32(m,t);
l:= l xor r; r:= LRot32(r,5); l:= l xor r;
t:= r and $1f; l:= LRot32(l,t);
blk[2]:= LRot32(blk[2],13);
blk[3]:= blk[3] + l;
blk[0]:= blk[0] + m;
blk[1]:= blk[1] xor r;
m:= blk[3] + KeyData[18];
r:= LRot32(blk[3],13) * KeyData[19];
l:= s_box[m and $1FF]; r:= LRot32(r,5);
t:= r and $1f; m:= LRot32(m,t);
l:= l xor r; r:= LRot32(r,5); l:= l xor r;
t:= r and $1f; l:= LRot32(l,t);
blk[3]:= LRot32(blk[3],13);
blk[0]:= blk[0] + l;
blk[1]:= blk[1] + m;
blk[2]:= blk[2] xor r;
m:= blk[0] + KeyData[20];
r:= LRot32(blk[0],13) * KeyData[21];
l:= s_box[m and $1FF]; r:= LRot32(r,5);
t:= r and $1f; m:= LRot32(m,t);
l:= l xor r; r:= LRot32(r,5); l:= l xor r;
t:= r and $1f; l:= LRot32(l,t);
blk[0]:= LRot32(blk[0],13);
blk[3]:= blk[3] + l;
blk[2]:= blk[2] + m;
blk[1]:= blk[1] xor r;
m:= blk[1] + KeyData[22];
r:= LRot32(blk[1],13) * KeyData[23];
l:= s_box[m and $1FF]; r:= LRot32(r,5);
t:= r and $1f; m:= LRot32(m,t);
l:= l xor r; r:= LRot32(r,5); l:= l xor r;
t:= r and $1f; l:= LRot32(l,t);
blk[1]:= LRot32(blk[1],13);
blk[0]:= blk[0] + l;
blk[3]:= blk[3] + m;
blk[2]:= blk[2] xor r;
m:= blk[2] + KeyData[24];
r:= LRot32(blk[2],13) * KeyData[25];
l:= s_box[m and $1FF]; r:= LRot32(r,5);
t:= r and $1f; m:= LRot32(m,t);
l:= l xor r; r:= LRot32(r,5); l:= l xor r;
t:= r and $1f; l:= LRot32(l,t);
blk[2]:= LRot32(blk[2],13);
blk[1]:= blk[1] + l;
blk[0]:= blk[0] + m;
blk[3]:= blk[3] xor r;
m:= blk[3] + KeyData[26];
r:= LRot32(blk[3],13) * KeyData[27];
l:= s_box[m and $1FF]; r:= LRot32(r,5);
t:= r and $1f; m:= LRot32(m,t);
l:= l xor r; r:= LRot32(r,5); l:= l xor r;
t:= r and $1f; l:= LRot32(l,t);
blk[3]:= LRot32(blk[3],13);
blk[2]:= blk[2] + l;
blk[1]:= blk[1] + m;
blk[0]:= blk[0] xor r;
m:= blk[0] + KeyData[28];
r:= LRot32(blk[0],13) * KeyData[29];
l:= s_box[m and $1FF]; r:= LRot32(r,5);
t:= r and $1f; m:= LRot32(m,t);
l:= l xor r; r:= LRot32(r,5); l:= l xor r;
t:= r and $1f; l:= LRot32(l,t);
blk[0]:= LRot32(blk[0],13);
blk[3]:= blk[3] + l;
blk[2]:= blk[2] + m;
blk[1]:= blk[1] xor r;
m:= blk[1] + KeyData[30];
r:= LRot32(blk[1],13) * KeyData[31];
l:= s_box[m and $1FF]; r:= LRot32(r,5);
t:= r and $1f; m:= LRot32(m,t);
l:= l xor r; r:= LRot32(r,5); l:= l xor r;
t:= r and $1f; l:= LRot32(l,t);
blk[1]:= LRot32(blk[1],13);
blk[0]:= blk[0] + l;
blk[3]:= blk[3] + m;
blk[2]:= blk[2] xor r;
m:= blk[2] + KeyData[32];
r:= LRot32(blk[2],13) * KeyData[33];
l:= s_box[m and $1FF]; r:= LRot32(r,5);
t:= r and $1f; m:= LRot32(m,t);
l:= l xor r; r:= LRot32(r,5); l:= l xor r;
t:= r and $1f; l:= LRot32(l,t);
blk[2]:= LRot32(blk[2],13);
blk[1]:= blk[1] + l;
blk[0]:= blk[0] + m;
blk[3]:= blk[3] xor r;
m:= blk[3] + KeyData[34];
r:= LRot32(blk[3],13) * KeyData[35];
l:= s_box[m and $1FF]; r:= LRot32(r,5);
t:= r and $1f; m:= LRot32(m,t);
l:= l xor r; r:= LRot32(r,5); l:= l xor r;
t:= r and $1f; l:= LRot32(l,t);
blk[3]:= LRot32(blk[3],13);
blk[2]:= blk[2] + l;
blk[1]:= blk[1] + m;
blk[0]:= blk[0] xor r;
blk[1]:= blk[1] xor s_box[ (blk[0] and $FF) + 256];
blk[2]:= blk[2] - s_box[ (blk[0] shr 24) and $FF];
blk[3]:= blk[3] - s_box[((blk[0] shr 16) and $FF) + 256];
blk[3]:= blk[3] xor s_box[ (blk[0] shr 8) and $FF];
blk[0]:= LRot32(blk[0], 24);
blk[2]:= blk[2] xor s_box[ (blk[1] and $FF) + 256];
blk[3]:= blk[3] - s_box[ (blk[1] shr 24) and $FF];
blk[0]:= blk[0] - s_box[((blk[1] shr 16) and $FF) + 256];
blk[0]:= blk[0] xor s_box[ (blk[1] shr 8) and $FF];
blk[1]:= LRot32(blk[1], 24); blk[2]:= blk[2] - blk[1];
blk[3]:= blk[3] xor s_box[ (blk[2] and $FF) + 256];
blk[0]:= blk[0] - s_box[ (blk[2] shr 24) and $FF];
blk[1]:= blk[1] - s_box[((blk[2] shr 16) and $FF) + 256];
blk[1]:= blk[1] xor s_box[ (blk[2] shr 8) and $FF];
blk[2]:= LRot32(blk[2], 24); blk[3]:= blk[3] - blk[0];
blk[0]:= blk[0] xor s_box[ (blk[3] and $FF) + 256];
blk[1]:= blk[1] - s_box[ (blk[3] shr 24) and $FF];
blk[2]:= blk[2] - s_box[((blk[3] shr 16) and $FF) + 256];
blk[2]:= blk[2] xor s_box[ (blk[3] shr 8) and $FF];
blk[3]:= LRot32(blk[3], 24);
blk[1]:= blk[1] xor s_box[ (blk[0] and $FF) + 256];
blk[2]:= blk[2] - s_box[ (blk[0] shr 24) and $FF];
blk[3]:= blk[3] - s_box[((blk[0] shr 16) and $FF) + 256];
blk[3]:= blk[3] xor s_box[ (blk[0] shr 8) and $FF];
blk[0]:= LRot32(blk[0], 24);
blk[2]:= blk[2] xor s_box[ (blk[1] and $FF) + 256];
blk[3]:= blk[3] - s_box[ (blk[1] shr 24) and $FF];
blk[0]:= blk[0] - s_box[((blk[1] shr 16) and $FF) + 256];
blk[0]:= blk[0] xor s_box[ (blk[1] shr 8) and $FF];
blk[1]:= LRot32(blk[1], 24); blk[2]:= blk[2] - blk[1];
blk[3]:= blk[3] xor s_box[ (blk[2] and $FF) + 256];
blk[0]:= blk[0] - s_box[ (blk[2] shr 24) and $FF];
blk[1]:= blk[1] - s_box[((blk[2] shr 16) and $FF) + 256];
blk[1]:= blk[1] xor s_box[ (blk[2] shr 8) and $FF];
blk[2]:= LRot32(blk[2], 24); blk[3]:= blk[3] - blk[0];
blk[0]:= blk[0] xor s_box[ (blk[3] and $FF) + 256];
blk[1]:= blk[1] - s_box[ (blk[3] shr 24) and $FF];
blk[2]:= blk[2] - s_box[((blk[3] shr 16) and $FF) + 256];
blk[2]:= blk[2] xor s_box[ (blk[3] shr 8) and $FF];
blk[3]:= LRot32(blk[3], 24);
blk[0]:= blk[0] - KeyData[36]; blk[1]:= blk[1] - KeyData[37];
blk[2]:= blk[2] - KeyData[38]; blk[3]:= blk[3] - KeyData[39];
PDWord(@OutData)^:= Blk[0];
PDWord(longword(@OutData)+4)^:= Blk[1];
PDWord(longword(@OutData)+8)^:= Blk[2];
PDWord(longword(@OutData)+12)^:= Blk[3];
end;
procedure Tmars.DecryptECB(const InData; var OutData);
var
l, m, r, t: DWord;
blk: array[0..3] of DWord;
begin
// if not fInitialized then
// raise EDCP_blockcipher.Create('Cipher not initialized');
Blk[0]:= PDWord(@InData)^;
Blk[1]:= PDWord(longword(@InData)+4)^;
Blk[2]:= PDWord(longword(@InData)+8)^;
Blk[3]:= PDWord(longword(@InData)+12)^;
blk[0]:= blk[0] + KeyData[36]; blk[1]:= blk[1] + KeyData[37];
blk[2]:= blk[2] + KeyData[38]; blk[3]:= blk[3] + KeyData[39];
blk[3]:= RRot32(blk[3], 24);
blk[2]:= blk[2] xor s_box[ (blk[3] shr 8) and $FF];
blk[2]:= blk[2] + s_box[((blk[3] shr 16) and $FF) + 256];
blk[1]:= blk[1] + s_box[ (blk[3] shr 24) and $FF];
blk[0]:= blk[0] xor s_box[ (blk[3] and $FF) + 256];
blk[3]:= blk[3] + blk[0]; blk[2]:= RRot32(blk[2], 24);
blk[1]:= blk[1] xor s_box[ (blk[2] shr 8) and $FF];
blk[1]:= blk[1] + s_box[((blk[2] shr 16) and $FF) + 256];
blk[0]:= blk[0] + s_box[ (blk[2] shr 24) and $FF];
blk[3]:= blk[3] xor s_box[ (blk[2] and $FF) + 256];
blk[2]:= blk[2] + blk[1]; blk[1]:= RRot32(blk[1], 24);
blk[0]:= blk[0] xor s_box[ (blk[1] shr 8) and $FF];
blk[0]:= blk[0] + s_box[((blk[1] shr 16) and $FF) + 256];
blk[3]:= blk[3] + s_box[ (blk[1] shr 24) and $FF];
blk[2]:= blk[2] xor s_box[ (blk[1] and $FF) + 256];
blk[0]:= RRot32(blk[0], 24);
blk[3]:= blk[3] xor s_box[ (blk[0] shr 8) and $FF];
blk[3]:= blk[3] + s_box[((blk[0] shr 16) and $FF) + 256];
blk[2]:= blk[2] + s_box[ (blk[0] shr 24) and $FF];
blk[1]:= blk[1] xor s_box[ (blk[0] and $FF) + 256];
blk[3]:= RRot32(blk[3], 24);
blk[2]:= blk[2] xor s_box[ (blk[3] shr 8) and $FF];
blk[2]:= blk[2] + s_box[((blk[3] shr 16) and $FF) + 256];
blk[1]:= blk[1] + s_box[ (blk[3] shr 24) and $FF];
blk[0]:= blk[0] xor s_box[ (blk[3] and $FF) + 256];
blk[3]:= blk[3] + blk[0]; blk[2]:= RRot32(blk[2], 24);
blk[1]:= blk[1] xor s_box[ (blk[2] shr 8) and $FF];
blk[1]:= blk[1] + s_box[((blk[2] shr 16) and $FF) + 256];
blk[0]:= blk[0] + s_box[ (blk[2] shr 24) and $FF];
blk[3]:= blk[3] xor s_box[ (blk[2] and $FF) + 256];
blk[2]:= blk[2] + blk[1]; blk[1]:= RRot32(blk[1], 24);
blk[0]:= blk[0] xor s_box[ (blk[1] shr 8) and $FF];
blk[0]:= blk[0] + s_box[((blk[1] shr 16) and $FF) + 256];
blk[3]:= blk[3] + s_box[ (blk[1] shr 24) and $FF];
blk[2]:= blk[2] xor s_box[ (blk[1] and $FF) + 256];
blk[0]:= RRot32(blk[0], 24);
blk[3]:= blk[3] xor s_box[ (blk[0] shr 8) and $FF];
blk[3]:= blk[3] + s_box[((blk[0] shr 16) and $FF) + 256];
blk[2]:= blk[2] + s_box[ (blk[0] shr 24) and $FF];
blk[1]:= blk[1] xor s_box[ (blk[0] and $FF) + 256];
blk[3]:= RRot32(blk[3],13);
m:= blk[3] + KeyData[34];
r:= LRot32(blk[3],13) * KeyData[35];
l:= s_box[m and $1FF]; r:= LRot32(r,5);
t:= r and $1f; m:= LRot32(m,t);
l:= l xor r; r:= LRot32(r,5); l:= l xor r;
t:= r and $1f; l:= LRot32(l,t);
blk[2]:= blk[2] - l;
blk[1]:= blk[1] - m;
blk[0]:= blk[0] xor r;
blk[2]:= RRot32(blk[2],13);
m:= blk[2] + KeyData[32];
r:= LRot32(blk[2],13) * KeyData[33];
l:= s_box[m and $1FF]; r:= LRot32(r,5);
t:= r and $1f; m:= LRot32(m,t);
l:= l xor r; r:= LRot32(r,5); l:= l xor r;
t:= r and $1f; l:= LRot32(l,t);
blk[1]:= blk[1] - l;
blk[0]:= blk[0] - m;
blk[3]:= blk[3] xor r;
blk[1]:= RRot32(blk[1],13);
m:= blk[1] + KeyData[30];
r:= LRot32(blk[1],13) * KeyData[31];
l:= s_box[m and $1FF]; r:= LRot32(r,5);
t:= r and $1f; m:= LRot32(m,t);
l:= l xor r; r:= LRot32(r,5); l:= l xor r;
t:= r and $1f; l:= LRot32(l,t);
blk[0]:= blk[0] - l;
blk[3]:= blk[3] - m;
blk[2]:= blk[2] xor r;
blk[0]:= RRot32(blk[0],13);
m:= blk[0] + KeyData[28];
r:= LRot32(blk[0],13) * KeyData[29];
l:= s_box[m and $1FF]; r:= LRot32(r,5);
t:= r and $1f; m:= LRot32(m,t);
l:= l xor r; r:= LRot32(r,5); l:= l xor r;
t:= r and $1f; l:= LRot32(l,t);
blk[3]:= blk[3] - l;
blk[2]:= blk[2] - m;
blk[1]:= blk[1] xor r;
blk[3]:= RRot32(blk[3],13);
m:= blk[3] + KeyData[26];
r:= LRot32(blk[3],13) * KeyData[27];
l:= s_box[m and $1FF]; r:= LRot32(r,5);
t:= r and $1f; m:= LRot32(m,t);
l:= l xor r; r:= LRot32(r,5); l:= l xor r;
t:= r and $1f; l:= LRot32(l,t);
blk[2]:= blk[2] - l;
blk[1]:= blk[1] - m;
blk[0]:= blk[0] xor r;
blk[2]:= RRot32(blk[2],13);
m:= blk[2] + KeyData[24];
r:= LRot32(blk[2],13) * KeyData[25];
l:= s_box[m and $1FF]; r:= LRot32(r,5);
t:= r and $1f; m:= LRot32(m,t);
l:= l xor r; r:= LRot32(r,5); l:= l xor r;
t:= r and $1f; l:= LRot32(l,t);
blk[1]:= blk[1] - l;
blk[0]:= blk[0] - m;
blk[3]:= blk[3] xor r;
blk[1]:= RRot32(blk[1],13);
m:= blk[1] + KeyData[22];
r:= LRot32(blk[1],13) * KeyData[23];
l:= s_box[m and $1FF]; r:= LRot32(r,5);
t:= r and $1f; m:= LRot32(m,t);
l:= l xor r; r:= LRot32(r,5); l:= l xor r;
t:= r and $1f; l:= LRot32(l,t);
blk[0]:= blk[0] - l;
blk[3]:= blk[3] - m;
blk[2]:= blk[2] xor r;
blk[0]:= RRot32(blk[0],13);
m:= blk[0] + KeyData[20];
r:= LRot32(blk[0],13) * KeyData[21];
l:= s_box[m and $1FF]; r:= LRot32(r,5);
t:= r and $1f; m:= LRot32(m,t);
l:= l xor r; r:= LRot32(r,5); l:= l xor r;
t:= r and $1f; l:= LRot32(l,t);
blk[3]:= blk[3] - l;
blk[2]:= blk[2] - m;
blk[1]:= blk[1] xor r;
blk[3]:= RRot32(blk[3],13);
m:= blk[3] + KeyData[18];
r:= LRot32(blk[3],13) * KeyData[19];
l:= s_box[m and $1FF]; r:= LRot32(r,5);
t:= r and $1f; m:= LRot32(m,t);
l:= l xor r; r:= LRot32(r,5); l:= l xor r;
t:= r and $1f; l:= LRot32(l,t);
blk[0]:= blk[0] - l;
blk[1]:= blk[1] - m;
blk[2]:= blk[2] xor r;
blk[2]:= RRot32(blk[2],13);
m:= blk[2] + KeyData[16];
r:= LRot32(blk[2],13) * KeyData[17];
l:= s_box[m and $1FF]; r:= LRot32(r,5);
t:= r and $1f; m:= LRot32(m,t);
l:= l xor r; r:= LRot32(r,5); l:= l xor r;
t:= r and $1f; l:= LRot32(l,t);
blk[3]:= blk[3] - l;
blk[0]:= blk[0] - m;
blk[1]:= blk[1] xor r;
blk[1]:= RRot32(blk[1],13);
m:= blk[1] + KeyData[14];
r:= LRot32(blk[1],13) * KeyData[15];
l:= s_box[m and $1FF]; r:= LRot32(r,5);
t:= r and $1f; m:= LRot32(m,t);
l:= l xor r; r:= LRot32(r,5); l:= l xor r;
t:= r and $1f; l:= LRot32(l,t);
blk[2]:= blk[2] - l;
blk[3]:= blk[3] - m;
blk[0]:= blk[0] xor r;
blk[0]:= RRot32(blk[0],13);
m:= blk[0] + KeyData[12];
r:= LRot32(blk[0],13) * KeyData[13];
l:= s_box[m and $1FF]; r:= LRot32(r,5);
t:= r and $1f; m:= LRot32(m,t);
l:= l xor r; r:= LRot32(r,5); l:= l xor r;
t:= r and $1f; l:= LRot32(l,t);
blk[1]:= blk[1] - l;
blk[2]:= blk[2] - m;
blk[3]:= blk[3] xor r;
blk[3]:= RRot32(blk[3],13);
m:= blk[3] + KeyData[10];
r:= LRot32(blk[3],13) * KeyData[11];
l:= s_box[m and $1FF]; r:= LRot32(r,5);
t:= r and $1f; m:= LRot32(m,t);
l:= l xor r; r:= LRot32(r,5); l:= l xor r;
t:= r and $1f; l:= LRot32(l,t);
blk[0]:= blk[0] - l;
blk[1]:= blk[1] - m;
blk[2]:= blk[2] xor r;
blk[2]:= RRot32(blk[2],13);
m:= blk[2] + KeyData[8];
r:= LRot32(blk[2],13) * KeyData[9];
l:= s_box[m and $1FF]; r:= LRot32(r,5);
t:= r and $1f; m:= LRot32(m,t);
l:= l xor r; r:= LRot32(r,5); l:= l xor r;
t:= r and $1f; l:= LRot32(l,t);
blk[3]:= blk[3] - l;
blk[0]:= blk[0] - m;
blk[1]:= blk[1] xor r;
blk[1]:= RRot32(blk[1],13);
m:= blk[1] + KeyData[6];
r:= LRot32(blk[1],13) * KeyData[7];
l:= s_box[m and $1FF]; r:= LRot32(r,5);
t:= r and $1f; m:= LRot32(m,t);
l:= l xor r; r:= LRot32(r,5); l:= l xor r;
t:= r and $1f; l:= LRot32(l,t);
blk[2]:= blk[2] - l;
blk[3]:= blk[3] - m;
blk[0]:= blk[0] xor r;
blk[0]:= RRot32(blk[0],13);
m:= blk[0] + KeyData[4];
r:= LRot32(blk[0],13) * KeyData[5];
l:= s_box[m and $1FF]; r:= LRot32(r,5);
t:= r and $1f; m:= LRot32(m,t);
l:= l xor r; r:= LRot32(r,5); l:= l xor r;
t:= r and $1f; l:= LRot32(l,t);
blk[1]:= blk[1] - l;
blk[2]:= blk[2] - m;
blk[3]:= blk[3] xor r;
blk[3]:= LRot32(blk[3], 24);
blk[2]:= blk[2] xor s_box[((blk[3] shr 24) and $FF) + 256];
blk[1]:= blk[1] - s_box[ (blk[3] shr 16) and $FF];
blk[0]:= blk[0] - s_box[((blk[3] shr 8) and $FF) + 256];
blk[0]:= blk[0] xor s_box[ blk[3] and $FF];
blk[2]:= LRot32(blk[2], 24);
blk[1]:= blk[1] xor s_box[((blk[2] shr 24) and $FF) + 256];
blk[0]:= blk[0] - s_box[ (blk[2] shr 16) and $FF];
blk[3]:= blk[3] - s_box[((blk[2] shr 8) and $FF) + 256];
blk[3]:= blk[3] xor s_box[ blk[2] and $FF];
blk[1]:= blk[1] - blk[2]; blk[1]:= LRot32(blk[1], 24);
blk[0]:= blk[0] xor s_box[((blk[1] shr 24) and $FF) + 256];
blk[3]:= blk[3] - s_box[ (blk[1] shr 16) and $FF];
blk[2]:= blk[2] - s_box[((blk[1] shr 8) and $FF) + 256];
blk[2]:= blk[2] xor s_box[ blk[1] and $FF];
blk[0]:= blk[0] - blk[3]; blk[0]:= LRot32(blk[0], 24);
blk[3]:= blk[3] xor s_box[((blk[0] shr 24) and $FF) + 256];
blk[2]:= blk[2] - s_box[ (blk[0] shr 16) and $FF];
blk[1]:= blk[1] - s_box[((blk[0] shr 8) and $FF) + 256];
blk[1]:= blk[1] xor s_box[ blk[0] and $FF];
blk[3]:= LRot32(blk[3], 24);
blk[2]:= blk[2] xor s_box[((blk[3] shr 24) and $FF) + 256];
blk[1]:= blk[1] - s_box[ (blk[3] shr 16) and $FF];
blk[0]:= blk[0] - s_box[((blk[3] shr 8) and $FF) + 256];
blk[0]:= blk[0] xor s_box[ blk[3] and $FF];
blk[2]:= LRot32(blk[2], 24);
blk[1]:= blk[1] xor s_box[((blk[2] shr 24) and $FF) + 256];
blk[0]:= blk[0] - s_box[ (blk[2] shr 16) and $FF];
blk[3]:= blk[3] - s_box[((blk[2] shr 8) and $FF) + 256];
blk[3]:= blk[3] xor s_box[ blk[2] and $FF];
blk[1]:= blk[1] - blk[2]; blk[1]:= LRot32(blk[1], 24);
blk[0]:= blk[0] xor s_box[((blk[1] shr 24) and $FF) + 256];
blk[3]:= blk[3] - s_box[ (blk[1] shr 16) and $FF];
blk[2]:= blk[2] - s_box[((blk[1] shr 8) and $FF) + 256];
blk[2]:= blk[2] xor s_box[ blk[1] and $FF];
blk[0]:= blk[0] - blk[3]; blk[0]:= LRot32(blk[0], 24);
blk[3]:= blk[3] xor s_box[((blk[0] shr 24) and $FF) + 256];
blk[2]:= blk[2] - s_box[ (blk[0] shr 16) and $FF];
blk[1]:= blk[1] - s_box[((blk[0] shr 8) and $FF) + 256];
blk[1]:= blk[1] xor s_box[ blk[0] and $FF];
blk[0]:= blk[0] - KeyData[0]; blk[1]:= blk[1] - KeyData[1];
blk[2]:= blk[2] - KeyData[2]; blk[3]:= blk[3] - KeyData[3];
PDWord(@OutData)^:= Blk[0];
PDWord(longword(@OutData)+4)^:= Blk[1];
PDWord(longword(@OutData)+8)^:= Blk[2];
PDWord(longword(@OutData)+12)^:= Blk[3];
end;
{--------------------}
{ Destructor ������� }
{--------------------}
destructor TRC6.Destroy;
begin
// All Strings := '';
// Free_And_Nil(All PObj);
inherited;
end;
////////////////////////////////////////////////////////////////////////////////
{-----------------------------}
{ ����������� ��� KOL ������� }
{-----------------------------}
function NewRC6;
begin
New(Result, Create);
// code
end;
////////////////////////////////////////////////////////////////////////////////
procedure Trc6.InitKey(const Key; Size: longword);
var
xKeyD: array[0..63] of DWord;
i, j, k, xKeyLen: longword;
A, B: DWord;
begin
burn;
Size:= Size div 8;
FillChar(xKeyD,Sizeof(xKeyD),0);
Move(Key,xKeyD,Size);
xKeyLen:= Size div 4;
if (Size mod 4)<> 0 then
Inc(xKeyLen);
Move(SBoxRC6,KeyData,((NUMROUNDSRC6*2)+4)*4);
i:= 0; j:= 0;
A:= 0; B:= 0;
if xKeyLen> ((NUMROUNDSRC6*2)+4) then
k:= xKeyLen*3
else
k:= ((NUMROUNDSRC6*2)+4)*3;
for k:= 1 to k do
begin
A:= LRot32(KeyData[i]+A+B,3);
KeyData[i]:= A;
B:= LRot32(xKeyD[j]+A+B,A+B);
xKeyD[j]:= B;
i:= (i+1) mod ((NUMROUNDSRC6*2)+4);
j:= (j+1) mod xKeyLen;
end;
FillChar(xKeyD,Sizeof(xKeyD),0);
end;
procedure Trc6.Burn;
begin
FillChar(KeyData,Sizeof(KeyData),$FF);
inherited Burn;
end;
procedure Trc6.EncryptECB(const InData; var OutData);
var
x0, x1, x2, x3: DWord;
u, t: DWord;
i: longword;
begin
// if not fInitialized then
// raise EDCP_blockcipher.Create('Cipher not initialized');
x0:= PDword(@InData)^;
x1:= PDword(longword(@InData)+4)^;
x2:= PDword(longword(@InData)+8)^;
x3:= PDword(longword(@InData)+12)^;
x1:= x1 + KeyData[0];
x3:= x3 + KeyData[1];
for i:= 1 to NUMROUNDSRC6 do
begin
t:= Lrot32(x1 * (2*x1 + 1),5);
u:= Lrot32(x3 * (2*x3 + 1),5);
x0:= Lrot32(x0 xor t,u) + KeyData[2*i];
x2:= Lrot32(x2 xor u,t) + KeyData[2*i+1];
t:= x0; x0:= x1; x1:= x2; x2:= x3; x3:= t;
end;
x0:= x0 + KeyData[(2*NUMROUNDSRC6)+2];
x2:= x2 + KeyData[(2*NUMROUNDSRC6)+3];
PDword(@OutData)^:= x0;
PDword(longword(@OutData)+4)^:= x1;
PDword(longword(@OutData)+8)^:= x2;
PDword(longword(@OutData)+12)^:= x3;
end;
procedure Trc6.DecryptECB(const InData; var OutData);
var
x0, x1, x2, x3: DWord;
u, t: DWord;
i: longword;
begin
// if not fInitialized then
// raise EDCP_blockcipher.Create('Cipher not initialized');
x0:= PDword(@InData)^;
x1:= PDword(longword(@InData)+4)^;
x2:= PDword(longword(@InData)+8)^;
x3:= PDword(longword(@InData)+12)^;
x2:= x2 - KeyData[(2*NUMROUNDSRC6)+3];
x0:= x0 - KeyData[(2*NUMROUNDSRC6)+2];
for i:= NUMROUNDSRC6 downto 1 do
begin
t:= x0; x0:= x3; x3:= x2; x2:= x1; x1:= t;
u:= Lrot32(x3 * (2*x3 + 1),5);
t:= Lrot32(x1 * (2*x1 + 1),5);
x2:= Rrot32(x2 - KeyData[2*i+1],t) xor u;
x0:= Rrot32(x0 - KeyData[2*i],u) xor t;
end;
x3:= x3 - KeyData[1];
x1:= x1 - KeyData[0];
PDword(@OutData)^:= x0;
PDword(longword(@OutData)+4)^:= x1;
PDword(longword(@OutData)+8)^:= x2;
PDword(longword(@OutData)+12)^:= x3;
end;
{--------------------}
{ Destructor ������� }
{--------------------}
destructor TRijndael.Destroy;
begin
// All Strings := '';
// Free_And_Nil(All PObj);
inherited;
end;
////////////////////////////////////////////////////////////////////////////////
{-----------------------------}
{ ����������� ��� KOL ������� }
{-----------------------------}
function NewRijndael;
begin
New(Result, Create);
// code
end;
////////////////////////////////////////////////////////////////////////////////
procedure InvMixColumn(a: PByteArray; BC: byte);
var
j: longword;
begin
for j:= 0 to (BC-1) do
PDWord(@(a^[j*4]))^:= PDWord(@U1[a^[j*4+0]])^ xor
PDWord(@U2[a^[j*4+1]])^ xor
PDWord(@U3[a^[j*4+2]])^ xor
PDWord(@U4[a^[j*4+3]])^;
end;
procedure Trijndael.InitKey(const Key; Size: longword);
var
KC, ROUNDS, j, r, t, rconpointer: longword;
tk: array[0..MAXKC-1,0..3] of byte;
begin
burn;
Size:= Size div 8;
FillChar(tk,Sizeof(tk),0);
Move(Key,tk,Size);
if Size<= 16 then
begin
KC:= 4;
Rounds:= 10;
end
else if Size<= 24 then
begin
KC:= 6;
Rounds:= 12;
end
else
begin
KC:= 8;
Rounds:= 14;
end;
numrounds:= rounds;
r:= 0;
t:= 0;
j:= 0;
while (j< KC) and (r< (rounds+1)) do
begin
while (j< KC) and (t< BCRJ) do
begin
rk[r,t]:= PDWord(@tk[j])^;
Inc(j);
Inc(t);
end;
if t= BCRJ then
begin
t:= 0;
Inc(r);
end;
end;
rconpointer:= 0;
while (r< (rounds+1)) do
begin
tk[0,0]:= tk[0,0] xor S[tk[KC-1,1]];
tk[0,1]:= tk[0,1] xor S[tk[KC-1,2]];
tk[0,2]:= tk[0,2] xor S[tk[KC-1,3]];
tk[0,3]:= tk[0,3] xor S[tk[KC-1,0]];
tk[0,0]:= tk[0,0] xor rcon[rconpointer];
Inc(rconpointer);
if KC<> 8 then
begin
for j:= 1 to (KC-1) do
PDWord(@tk[j])^:= PDWord(@tk[j])^ xor PDWord(@tk[j-1])^;
end
else
begin
for j:= 1 to ((KC div 2)-1) do
PDWord(@tk[j])^:= PDWord(@tk[j])^ xor PDWord(@tk[j-1])^;
tk[KC div 2,0]:= tk[KC div 2,0] xor S[tk[KC div 2 - 1,0]];
tk[KC div 2,1]:= tk[KC div 2,1] xor S[tk[KC div 2 - 1,1]];
tk[KC div 2,2]:= tk[KC div 2,2] xor S[tk[KC div 2 - 1,2]];
tk[KC div 2,3]:= tk[KC div 2,3] xor S[tk[KC div 2 - 1,3]];
for j:= ((KC div 2) + 1) to (KC-1) do
PDWord(@tk[j])^:= PDWord(@tk[j])^ xor PDWord(@tk[j-1])^;
end;
j:= 0;
while (j< KC) and (r< (rounds+1)) do
begin
while (j< KC) and (t< BCRJ) do
begin
rk[r,t]:= PDWord(@tk[j])^;
Inc(j);
Inc(t);
end;
if t= BCRJ then
begin
Inc(r);
t:= 0;
end;
end;
end;
Move(rk,drk,Sizeof(rk));
for r:= 1 to (numrounds-1) do
InvMixColumn(@drk[r],BCRJ);
end;
procedure Trijndael.Burn;
begin
numrounds:= 0;
FillChar(rk,Sizeof(rk),0);
FillChar(drk,Sizeof(drk),0);
inherited Burn;
end;
procedure Trijndael.EncryptECB(const InData; var OutData);
var
r: longword;
tempb: array[0..MAXBC-1,0..3] of byte;
a: array[0..MAXBC,0..3] of byte;
begin
// if not fInitialized then
// raise EDCP_blockcipher.Create('Cipher not initialized');
PDword(@a[0,0])^:= PDword(@InData)^;
PDword(@a[1,0])^:= PDword(dword(@InData)+4)^;
PDword(@a[2,0])^:= PDword(dword(@InData)+8)^;
PDword(@a[3,0])^:= PDword(dword(@InData)+12)^;
for r:= 0 to (numrounds-2) do
begin
PDWord(@tempb[0])^:= PDWord(@a[0])^ xor rk[r,0];
PDWord(@tempb[1])^:= PDWord(@a[1])^ xor rk[r,1];
PDWord(@tempb[2])^:= PDWord(@a[2])^ xor rk[r,2];
PDWord(@tempb[3])^:= PDWord(@a[3])^ xor rk[r,3];
PDWord(@a[0])^:= PDWord(@T1[tempb[0,0]])^ xor
PDWord(@T2[tempb[1,1]])^ xor
PDWord(@T3[tempb[2,2]])^ xor
PDWord(@T4[tempb[3,3]])^;
PDWord(@a[1])^:= PDWord(@T1[tempb[1,0]])^ xor
PDWord(@T2[tempb[2,1]])^ xor
PDWord(@T3[tempb[3,2]])^ xor
PDWord(@T4[tempb[0,3]])^;
PDWord(@a[2])^:= PDWord(@T1[tempb[2,0]])^ xor
PDWord(@T2[tempb[3,1]])^ xor
PDWord(@T3[tempb[0,2]])^ xor
PDWord(@T4[tempb[1,3]])^;
PDWord(@a[3])^:= PDWord(@T1[tempb[3,0]])^ xor
PDWord(@T2[tempb[0,1]])^ xor
PDWord(@T3[tempb[1,2]])^ xor
PDWord(@T4[tempb[2,3]])^;
end;
PDWord(@tempb[0])^:= PDWord(@a[0])^ xor rk[numrounds-1,0];
PDWord(@tempb[1])^:= PDWord(@a[1])^ xor rk[numrounds-1,1];
PDWord(@tempb[2])^:= PDWord(@a[2])^ xor rk[numrounds-1,2];
PDWord(@tempb[3])^:= PDWord(@a[3])^ xor rk[numrounds-1,3];
a[0,0]:= T1[tempb[0,0],1];
a[0,1]:= T1[tempb[1,1],1];
a[0,2]:= T1[tempb[2,2],1];
a[0,3]:= T1[tempb[3,3],1];
a[1,0]:= T1[tempb[1,0],1];
a[1,1]:= T1[tempb[2,1],1];
a[1,2]:= T1[tempb[3,2],1];
a[1,3]:= T1[tempb[0,3],1];
a[2,0]:= T1[tempb[2,0],1];
a[2,1]:= T1[tempb[3,1],1];
a[2,2]:= T1[tempb[0,2],1];
a[2,3]:= T1[tempb[1,3],1];
a[3,0]:= T1[tempb[3,0],1];
a[3,1]:= T1[tempb[0,1],1];
a[3,2]:= T1[tempb[1,2],1];
a[3,3]:= T1[tempb[2,3],1];
PDWord(@a[0])^:= PDWord(@a[0])^ xor rk[numrounds,0];
PDWord(@a[1])^:= PDWord(@a[1])^ xor rk[numrounds,1];
PDWord(@a[2])^:= PDWord(@a[2])^ xor rk[numrounds,2];
PDWord(@a[3])^:= PDWord(@a[3])^ xor rk[numrounds,3];
PDword(@OutData)^:= PDword(@a[0,0])^;
PDword(dword(@OutData)+4)^:= PDword(@a[1,0])^;
PDword(dword(@OutData)+8)^:= PDword(@a[2,0])^;
PDword(dword(@OutData)+12)^:= PDword(@a[3,0])^;
end;
procedure Trijndael.DecryptECB(const InData; var OutData);
var
r: longword;
tempb: array[0..MAXBC-1,0..3] of byte;
a: array[0..MAXBC,0..3] of byte;
begin
// if not fInitialized then
// raise EDCP_blockcipher.Create('Cipher not initialized');
PDword(@a[0,0])^:= PDword(@InData)^;
PDword(@a[1,0])^:= PDword(dword(@InData)+4)^;
PDword(@a[2,0])^:= PDword(dword(@InData)+8)^;
PDword(@a[3,0])^:= PDword(dword(@InData)+12)^;
for r:= NumRounds downto 2 do
begin
PDWord(@tempb[0])^:= PDWord(@a[0])^ xor drk[r,0];
PDWord(@tempb[1])^:= PDWord(@a[1])^ xor drk[r,1];
PDWord(@tempb[2])^:= PDWord(@a[2])^ xor drk[r,2];
PDWord(@tempb[3])^:= PDWord(@a[3])^ xor drk[r,3];
PDWord(@a[0])^:= PDWord(@T5[tempb[0,0]])^ xor
PDWord(@T6[tempb[3,1]])^ xor
PDWord(@T7[tempb[2,2]])^ xor
PDWord(@T8[tempb[1,3]])^;
PDWord(@a[1])^:= PDWord(@T5[tempb[1,0]])^ xor
PDWord(@T6[tempb[0,1]])^ xor
PDWord(@T7[tempb[3,2]])^ xor
PDWord(@T8[tempb[2,3]])^;
PDWord(@a[2])^:= PDWord(@T5[tempb[2,0]])^ xor
PDWord(@T6[tempb[1,1]])^ xor
PDWord(@T7[tempb[0,2]])^ xor
PDWord(@T8[tempb[3,3]])^;
PDWord(@a[3])^:= PDWord(@T5[tempb[3,0]])^ xor
PDWord(@T6[tempb[2,1]])^ xor
PDWord(@T7[tempb[1,2]])^ xor
PDWord(@T8[tempb[0,3]])^;
end;
PDWord(@tempb[0])^:= PDWord(@a[0])^ xor drk[1,0];
PDWord(@tempb[1])^:= PDWord(@a[1])^ xor drk[1,1];
PDWord(@tempb[2])^:= PDWord(@a[2])^ xor drk[1,2];
PDWord(@tempb[3])^:= PDWord(@a[3])^ xor drk[1,3];
a[0,0]:= S5[tempb[0,0]];
a[0,1]:= S5[tempb[3,1]];
a[0,2]:= S5[tempb[2,2]];
a[0,3]:= S5[tempb[1,3]];
a[1,0]:= S5[tempb[1,0]];
a[1,1]:= S5[tempb[0,1]];
a[1,2]:= S5[tempb[3,2]];
a[1,3]:= S5[tempb[2,3]];
a[2,0]:= S5[tempb[2,0]];
a[2,1]:= S5[tempb[1,1]];
a[2,2]:= S5[tempb[0,2]];
a[2,3]:= S5[tempb[3,3]];
a[3,0]:= S5[tempb[3,0]];
a[3,1]:= S5[tempb[2,1]];
a[3,2]:= S5[tempb[1,2]];
a[3,3]:= S5[tempb[0,3]];
PDWord(@a[0])^:= PDWord(@a[0])^ xor drk[0,0];
PDWord(@a[1])^:= PDWord(@a[1])^ xor drk[0,1];
PDWord(@a[2])^:= PDWord(@a[2])^ xor drk[0,2];
PDWord(@a[3])^:= PDWord(@a[3])^ xor drk[0,3];
PDword(@OutData)^:= PDword(@a[0,0])^;
PDword(dword(@OutData)+4)^:= PDword(@a[1,0])^;
PDword(dword(@OutData)+8)^:= PDword(@a[2,0])^;
PDword(dword(@OutData)+12)^:= PDword(@a[3,0])^;
end;
{--------------------}
{ Destructor ������� }
{--------------------}
destructor TSerpent.Destroy;
begin
// All Strings := '';
// Free_And_Nil(All PObj);
inherited;
end;
////////////////////////////////////////////////////////////////////////////////
{-----------------------------}
{ ����������� ��� KOL ������� }
{-----------------------------}
function NewSerpent;
begin
New(Result, Create);
// code
end;
////////////////////////////////////////////////////////////////////////////////
procedure Tserpent.InitKey(const Key; Size: longword);
var
kp: array[0..139] of dword;
i, n: integer;
t, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15, t16, t17: dword;
a, b, c, d: dword;
begin
burn;
FillChar(kp,256 div 8,0);
Move(Key,kp,Size div 8);
if Size < 256 then
begin
i:= Size div 32;
t:= 1 shl (Size mod 32);
kp[i]:= (kp[i] and (t - 1)) or t;
end;
for i:= 8 to 139 do
begin
t:= kp[i - 8] xor kp[i - 5] xor kp[i - 3] xor kp[i - 1] xor $9e3779b9 xor longword(i-8);
kp[i]:= (t shl 11) or (t shr 21);
end;
for i:= 0 to 3 do
begin
n:= i*32;
a:= kp[n + 4*0 + 8]; b:= kp[n + 4*0 + 9]; c:= kp[n + 4*0 + 10]; d:= kp[n + 4*0 + 11];
t1:= a xor c; t2:= a or d; t3:= a and b; t4:= a and d; t5:= b or t4; t6:= t1 and t2; kp[ 9+n]:= t5 xor t6; t8:= b xor d; t9:= c or t3; t10:= t6 xor t8; kp[ 11+n]:= t9 xor t10; t12:= c xor t3; t13:= t2 and kp[ 11+n]; kp[ 10+n]:= t12 xor t13; t15:= not kp[ 10+n]; t16:= t2 xor t3; t17:= kp[ 9+n] and t15; kp[ 8+n]:= t16 xor t17;
a:= kp[n + 4*1 + 8]; b:= kp[n + 4*1 + 9]; c:= kp[n + 4*1 + 10]; d:= kp[n + 4*1 + 11];
t1:= not a; t2:= b xor d; t3:= c and t1; kp[ 12+n]:= t2 xor t3; t5:= c xor t1; t6:= c xor kp[ 12+n]; t7:= b and t6; kp[ 15+n]:= t5 xor t7; t9:= d or t7; t10:= kp[ 12+n] or t5; t11:= t9 and t10; kp[ 14+n]:= a xor t11; t13:= d or t1; t14:= t2 xor kp[ 15+n]; t15:= kp[ 14+n] xor t13; kp[ 13+n]:= t14 xor t15;
a:= kp[n + 4*2 + 8]; b:= kp[n + 4*2 + 9]; c:= kp[n + 4*2 + 10]; d:= kp[n + 4*2 + 11];
t1:= a xor d; t2:= b xor d; t3:= a and b; t4:= not c; t5:= t2 xor t3; kp[ 18+n]:= t4 xor t5; t7:= a xor t2; t8:= b or t4; t9:= d or kp[ 18+n]; t10:= t7 and t9; kp[ 17+n]:= t8 xor t10; t12:= c xor d; t13:= t1 or t2; t14:= kp[ 17+n] xor t12; kp[ 19+n]:= t13 xor t14; t16:= t1 or kp[ 18+n]; t17:= t8 xor t14; kp[ 16+n]:= t16 xor t17;
a:= kp[n + 4*3 + 8]; b:= kp[n + 4*3 + 9]; c:= kp[n + 4*3 + 10]; d:= kp[n + 4*3 + 11];
t1:= b xor d; t2:= not t1; t3:= a or d; t4:= b xor c; kp[ 23+n]:= t3 xor t4; t6:= a xor b; t7:= a or t4; t8:= c and t6; t9:= t2 or t8; kp[ 20+n]:= t7 xor t9; t11:= a xor kp[ 23+n]; t12:= t1 and t6; t13:= kp[ 20+n] xor t11; kp[ 21+n]:= t12 xor t13; t15:= kp[ 20+n] or kp[ 21+n]; t16:= t3 and t15; kp[ 22+n]:= b xor t16;
a:= kp[n + 4*4 + 8]; b:= kp[n + 4*4 + 9]; c:= kp[n + 4*4 + 10]; d:= kp[n + 4*4 + 11];
t1:= not c; t2:= b xor c; t3:= b or t1; t4:= d xor t3; t5:= a and t4; kp[ 27+n]:= t2 xor t5; t7:= a xor d; t8:= b xor t5; t9:= t2 or t8; kp[ 25+n]:= t7 xor t9; t11:= d and t3; t12:= t5 xor kp[ 25+n]; t13:= kp[ 27+n] and t12; kp[ 26+n]:= t11 xor t13; t15:= t1 or t4; t16:= t12 xor kp[ 26+n]; kp[ 24+n]:= t15 xor t16;
a:= kp[n + 4*5 + 8]; b:= kp[n + 4*5 + 9]; c:= kp[n + 4*5 + 10]; d:= kp[n + 4*5 + 11];
t1:= a xor c; t2:= b or d; t3:= b xor c; t4:= not t3; t5:= a and d; kp[ 29+n]:= t4 xor t5; t7:= b or c; t8:= d xor t1; t9:= t7 and t8; kp[ 31+n]:= t2 xor t9; t11:= t1 and t7; t12:= t4 xor t8; t13:= kp[ 31+n] and t11; kp[ 28+n]:= t12 xor t13; t15:= t3 xor t11; t16:= kp[ 31+n] or t15; kp[ 30+n]:= t12 xor t16;
a:= kp[n + 4*6 + 8]; b:= kp[n + 4*6 + 9]; c:= kp[n + 4*6 + 10]; d:= kp[n + 4*6 + 11];
t1:= not a; t2:= a xor b; t3:= a xor d; t4:= c xor t1; t5:= t2 or t3; kp[ 32+n]:= t4 xor t5; t7:= not d; t8:= kp[ 32+n] and t7; kp[ 33+n]:= t2 xor t8; t10:= b or kp[ 33+n]; t11:= c or kp[ 32+n]; t12:= t7 xor t10; kp[ 35+n]:= t11 xor t12; t14:= d or kp[ 33+n]; t15:= t1 xor t14; t16:= kp[ 32+n] or kp[ 35+n]; kp[ 34+n]:= t15 xor t16;
a:= kp[n + 4*7 + 8]; b:= kp[n + 4*7 + 9]; c:= kp[n + 4*7 + 10]; d:= kp[n + 4*7 + 11];
t1:= not a; t2:= a xor d; t3:= a xor b; t4:= c xor t1; t5:= t2 or t3; kp[ 36+n]:= t4 xor t5; t7:= not kp[ 36+n]; t8:= b or t7; kp[ 39+n]:= t2 xor t8; t10:= a and kp[ 36+n]; t11:= b xor kp[ 39+n]; t12:= t8 and t11; kp[ 38+n]:= t10 xor t12; t14:= a or t7; t15:= t3 xor t14; t16:= kp[ 39+n] and kp[ 38+n]; kp[ 37+n]:= t15 xor t16;
end;
a:= kp[136]; b:= kp[137]; c:= kp[138]; d:= kp[139];
t1:= a xor c; t2:= a or d; t3:= a and b; t4:= a and d; t5:= b or t4; t6:= t1 and t2; kp[137]:= t5 xor t6; t8:= b xor d; t9:= c or t3; t10:= t6 xor t8; kp[139]:= t9 xor t10; t12:= c xor t3; t13:= t2 and kp[139]; kp[138]:= t12 xor t13; t15:= not kp[138]; t16:= t2 xor t3; t17:= kp[137] and t15; kp[136]:= t16 xor t17;
Move(kp[8],l_key,Sizeof(l_key));
FillChar(kp,Sizeof(kp),0);
end;
procedure Tserpent.Burn;
begin
FillChar(l_key,Sizeof(l_key),0);
inherited Burn;
end;
procedure Tserpent.EncryptECB(const InData; var OutData);
var
i: integer;
a, b, c, d, e, f, g, h: dword;
t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15, t16, t17: dword;
begin
// if not fInitialized then
// raise EDCP_blockcipher.Create('Cipher not initialized');
a:= PDWord(@InData)^;
b:= PDWord(longword(@InData)+4)^;
c:= PDWord(longword(@InData)+8)^;
d:= PDWord(longword(@InData)+12)^;
i:= 0;
while i < 32 do
begin
a:= a xor l_key[4*(i)]; b:= b xor l_key[4*(i)+1]; c:= c xor l_key[4*(i)+2]; d:= d xor l_key[4*(i)+3];
t1:= b xor d; t2:= not t1; t3:= a or d; t4:= b xor c; h:= t3 xor t4; t6:= a xor b; t7:= a or t4; t8:= c and t6; t9:= t2 or t8; e:= t7 xor t9; t11:= a xor h; t12:= t1 and t6; t13:= e xor t11; f:= t12 xor t13; t15:= e or f; t16:= t3 and t15; g:= b xor t16;
e:= (e shl 13) or (e shr 19); g:= (g shl 3) or (g shr 29); f:= f xor e xor g; h:= h xor g xor (e shl 3); f:= (f shl 1) or (f shr 31); h:= (h shl 7) or (h shr 25); e:= e xor f xor h; g:= g xor h xor (f shl 7); e:= (e shl 5) or (e shr 27); g:= (g shl 22) or (g shr 10);
e:= e xor l_key[4*(i+1)]; f:= f xor l_key[4*(i+1)+1]; g:= g xor l_key[4*(i+1)+2]; h:= h xor l_key[4*(i+1)+3];
t1:= e xor h; t2:= f xor h; t3:= e and f; t4:= not g; t5:= t2 xor t3; c:= t4 xor t5; t7:= e xor t2; t8:= f or t4; t9:= h or c; t10:= t7 and t9; b:= t8 xor t10; t12:= g xor h; t13:= t1 or t2; t14:= b xor t12; d:= t13 xor t14; t16:= t1 or c; t17:= t8 xor t14; a:= t16 xor t17;
a:= (a shl 13) or (a shr 19); c:= (c shl 3) or (c shr 29); b:= b xor a xor c; d:= d xor c xor (a shl 3); b:= (b shl 1) or (b shr 31); d:= (d shl 7) or (d shr 25); a:= a xor b xor d; c:= c xor d xor (b shl 7); a:= (a shl 5) or (a shr 27); c:= (c shl 22) or (c shr 10);
a:= a xor l_key[4*(i+2)]; b:= b xor l_key[4*(i+2)+1]; c:= c xor l_key[4*(i+2)+2]; d:= d xor l_key[4*(i+2)+3];
t1:= not a; t2:= b xor d; t3:= c and t1; e:= t2 xor t3; t5:= c xor t1; t6:= c xor e; t7:= b and t6; h:= t5 xor t7; t9:= d or t7; t10:= e or t5; t11:= t9 and t10; g:= a xor t11; t13:= d or t1; t14:= t2 xor h; t15:= g xor t13; f:= t14 xor t15;
e:= (e shl 13) or (e shr 19); g:= (g shl 3) or (g shr 29); f:= f xor e xor g; h:= h xor g xor (e shl 3); f:= (f shl 1) or (f shr 31); h:= (h shl 7) or (h shr 25); e:= e xor f xor h; g:= g xor h xor (f shl 7); e:= (e shl 5) or (e shr 27); g:= (g shl 22) or (g shr 10);
e:= e xor l_key[4*(i+3)]; f:= f xor l_key[4*(i+3)+1]; g:= g xor l_key[4*(i+3)+2]; h:= h xor l_key[4*(i+3)+3];
t1:= e xor g; t2:= e or h; t3:= e and f; t4:= e and h; t5:= f or t4; t6:= t1 and t2; b:= t5 xor t6; t8:= f xor h; t9:= g or t3; t10:= t6 xor t8; d:= t9 xor t10; t12:= g xor t3; t13:= t2 and d; c:= t12 xor t13; t15:= not c; t16:= t2 xor t3; t17:= b and t15; a:= t16 xor t17;
a:= (a shl 13) or (a shr 19); c:= (c shl 3) or (c shr 29); b:= b xor a xor c; d:= d xor c xor (a shl 3); b:= (b shl 1) or (b shr 31); d:= (d shl 7) or (d shr 25); a:= a xor b xor d; c:= c xor d xor (b shl 7); a:= (a shl 5) or (a shr 27); c:= (c shl 22) or (c shr 10);
a:= a xor l_key[4*(i+4)]; b:= b xor l_key[4*(i+4)+1]; c:= c xor l_key[4*(i+4)+2]; d:= d xor l_key[4*(i+4)+3];
t1:= not a; t2:= a xor d; t3:= a xor b; t4:= c xor t1; t5:= t2 or t3; e:= t4 xor t5; t7:= not e; t8:= b or t7; h:= t2 xor t8; t10:= a and e; t11:= b xor h; t12:= t8 and t11; g:= t10 xor t12; t14:= a or t7; t15:= t3 xor t14; t16:= h and g; f:= t15 xor t16;
e:= (e shl 13) or (e shr 19); g:= (g shl 3) or (g shr 29); f:= f xor e xor g; h:= h xor g xor (e shl 3); f:= (f shl 1) or (f shr 31); h:= (h shl 7) or (h shr 25); e:= e xor f xor h; g:= g xor h xor (f shl 7); e:= (e shl 5) or (e shr 27); g:= (g shl 22) or (g shr 10);
e:= e xor l_key[4*(i+5)]; f:= f xor l_key[4*(i+5)+1]; g:= g xor l_key[4*(i+5)+2]; h:= h xor l_key[4*(i+5)+3];
t1:= not e; t2:= e xor f; t3:= e xor h; t4:= g xor t1; t5:= t2 or t3; a:= t4 xor t5; t7:= not h; t8:= a and t7; b:= t2 xor t8; t10:= f or b; t11:= g or a; t12:= t7 xor t10; d:= t11 xor t12; t14:= h or b; t15:= t1 xor t14; t16:= a or d; c:= t15 xor t16;
a:= (a shl 13) or (a shr 19); c:= (c shl 3) or (c shr 29); b:= b xor a xor c; d:= d xor c xor (a shl 3); b:= (b shl 1) or (b shr 31); d:= (d shl 7) or (d shr 25); a:= a xor b xor d; c:= c xor d xor (b shl 7); a:= (a shl 5) or (a shr 27); c:= (c shl 22) or (c shr 10);
a:= a xor l_key[4*(i+6)]; b:= b xor l_key[4*(i+6)+1]; c:= c xor l_key[4*(i+6)+2]; d:= d xor l_key[4*(i+6)+3];
t1:= a xor c; t2:= b or d; t3:= b xor c; t4:= not t3; t5:= a and d; f:= t4 xor t5; t7:= b or c; t8:= d xor t1; t9:= t7 and t8; h:= t2 xor t9; t11:= t1 and t7; t12:= t4 xor t8; t13:= h and t11; e:= t12 xor t13; t15:= t3 xor t11; t16:= h or t15; g:= t12 xor t16;
e:= (e shl 13) or (e shr 19); g:= (g shl 3) or (g shr 29); f:= f xor e xor g; h:= h xor g xor (e shl 3); f:= (f shl 1) or (f shr 31); h:= (h shl 7) or (h shr 25); e:= e xor f xor h; g:= g xor h xor (f shl 7); e:= (e shl 5) or (e shr 27); g:= (g shl 22) or (g shr 10);
e:= e xor l_key[4*(i+7)]; f:= f xor l_key[4*(i+7)+1]; g:= g xor l_key[4*(i+7)+2]; h:= h xor l_key[4*(i+7)+3];
t1:= not g; t2:= f xor g; t3:= f or t1; t4:= h xor t3; t5:= e and t4; d:= t2 xor t5; t7:= e xor h; t8:= f xor t5; t9:= t2 or t8; b:= t7 xor t9; t11:= h and t3; t12:= t5 xor b; t13:= d and t12; c:= t11 xor t13; t15:= t1 or t4; t16:= t12 xor c; a:= t15 xor t16;
Inc(i,8);
if i < 32 then
begin
a:= (a shl 13) or (a shr 19); c:= (c shl 3) or (c shr 29); b:= b xor a xor c; d:= d xor c xor (a shl 3); b:= (b shl 1) or (b shr 31); d:= (d shl 7) or (d shr 25); a:= a xor b xor d; c:= c xor d xor (b shl 7); a:= (a shl 5) or (a shr 27); c:= (c shl 22) or (c shr 10);
end;
end;
a:= a xor l_key[128]; b:= b xor l_key[128+1]; c:= c xor l_key[128+2]; d:= d xor l_key[128+3];
PDWord(longword(@OutData)+ 0)^:= a;
PDWord(longword(@OutData)+ 4)^:= b;
PDWord(longword(@OutData)+ 8)^:= c;
PDWord(longword(@OutData)+12)^:= d;
end;
procedure Tserpent.DecryptECB(const InData; var OutData);
var
i: integer;
a, b, c, d, e, f, g, h: dword;
t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15, t16: dword;
begin
// if not fInitialized then
// raise EDCP_blockcipher.Create('Cipher not initialized');
a:= PDWord(@InData)^;
b:= PDWord(longword(@InData)+4)^;
c:= PDWord(longword(@InData)+8)^;
d:= PDWord(longword(@InData)+12)^;
i:= 32;
a:= a xor l_key[4*32]; b:= b xor l_key[4*32+1]; c:= c xor l_key[4*32+2]; d:= d xor l_key[4*32+3];
while i > 0 do
begin
if i < 32 then
begin
c:= (c shr 22) or (c shl 10); a:= (a shr 5) or (a shl 27); c:= c xor d xor (b shl 7); a:= a xor b xor d; d:= (d shr 7) or (d shl 25); b:= (b shr 1) or (b shl 31); d:= d xor c xor (a shl 3); b:= b xor a xor c; c:= (c shr 3) or (c shl 29); a:= (a shr 13) or (a shl 19);
end;
t1:= a and b; t2:= a or b; t3:= c or t1; t4:= d and t2; h:= t3 xor t4; t6:= not d; t7:= b xor t4; t8:= h xor t6; t9:= t7 or t8; f:= a xor t9; t11:= c xor t7; t12:= d or f; e:= t11 xor t12; t14:= a and h; t15:= t3 xor f; t16:= e xor t14; g:= t15 xor t16;
e:= e xor l_key[4*(i-1)]; f:= f xor l_key[4*(i-1)+1]; g:= g xor l_key[4*(i-1)+2]; h:= h xor l_key[4*(i-1)+3];
g:= (g shr 22) or (g shl 10); e:= (e shr 5) or (e shl 27); g:= g xor h xor (f shl 7); e:= e xor f xor h; h:= (h shr 7) or (h shl 25); f:= (f shr 1) or (f shl 31); h:= h xor g xor (e shl 3); f:= f xor e xor g; g:= (g shr 3) or (g shl 29); e:= (e shr 13) or (e shl 19);
t1:= not g; t2:= e xor g; t3:= f xor h; t4:= e or t1; b:= t3 xor t4; t6:= e or f; t7:= f and t2; t8:= b xor t6; t9:= t7 or t8; a:= g xor t9; t11:= not b; t12:= h or t2; t13:= t9 xor t11; d:= t12 xor t13; t15:= f xor t11; t16:= a and d; c:= t15 xor t16;
a:= a xor l_key[4*(i-2)]; b:= b xor l_key[4*(i-2)+1]; c:= c xor l_key[4*(i-2)+2]; d:= d xor l_key[4*(i-2)+3];
c:= (c shr 22) or (c shl 10); a:= (a shr 5) or (a shl 27); c:= c xor d xor (b shl 7); a:= a xor b xor d; d:= (d shr 7) or (d shl 25); b:= (b shr 1) or (b shl 31); d:= d xor c xor (a shl 3); b:= b xor a xor c; c:= (c shr 3) or (c shl 29); a:= (a shr 13) or (a shl 19);
t1:= not c; t2:= b and t1; t3:= d xor t2; t4:= a and t3; t5:= b xor t1; h:= t4 xor t5; t7:= b or h; t8:= a and t7; f:= t3 xor t8; t10:= a or d; t11:= t1 xor t7; e:= t10 xor t11; t13:= a xor c; t14:= b and t10; t15:= t4 or t13; g:= t14 xor t15;
e:= e xor l_key[4*(i-3)]; f:= f xor l_key[4*(i-3)+1]; g:= g xor l_key[4*(i-3)+2]; h:= h xor l_key[4*(i-3)+3];
g:= (g shr 22) or (g shl 10); e:= (e shr 5) or (e shl 27); g:= g xor h xor (f shl 7); e:= e xor f xor h; h:= (h shr 7) or (h shl 25); f:= (f shr 1) or (f shl 31); h:= h xor g xor (e shl 3); f:= f xor e xor g; g:= (g shr 3) or (g shl 29); e:= (e shr 13) or (e shl 19);
t1:= g xor h; t2:= g or h; t3:= f xor t2; t4:= e and t3; b:= t1 xor t4; t6:= e xor h; t7:= f or h; t8:= t6 and t7; d:= t3 xor t8; t10:= not e; t11:= g xor d; t12:= t10 or t11; a:= t3 xor t12; t14:= g or t4; t15:= t7 xor t14; t16:= d or t10; c:= t15 xor t16;
a:= a xor l_key[4*(i-4)]; b:= b xor l_key[4*(i-4)+1]; c:= c xor l_key[4*(i-4)+2]; d:= d xor l_key[4*(i-4)+3];
c:= (c shr 22) or (c shl 10); a:= (a shr 5) or (a shl 27); c:= c xor d xor (b shl 7); a:= a xor b xor d; d:= (d shr 7) or (d shl 25); b:= (b shr 1) or (b shl 31); d:= d xor c xor (a shl 3); b:= b xor a xor c; c:= (c shr 3) or (c shl 29); a:= (a shr 13) or (a shl 19);
t1:= b xor c; t2:= b or c; t3:= a xor c; t4:= t2 xor t3; t5:= d or t4; e:= t1 xor t5; t7:= a xor d; t8:= t1 or t5; t9:= t2 xor t7; g:= t8 xor t9; t11:= a and t4; t12:= e or t9; f:= t11 xor t12; t14:= a and g; t15:= t2 xor t14; t16:= e and t15; h:= t4 xor t16;
e:= e xor l_key[4*(i-5)]; f:= f xor l_key[4*(i-5)+1]; g:= g xor l_key[4*(i-5)+2]; h:= h xor l_key[4*(i-5)+3];
g:= (g shr 22) or (g shl 10); e:= (e shr 5) or (e shl 27); g:= g xor h xor (f shl 7); e:= e xor f xor h; h:= (h shr 7) or (h shl 25); f:= (f shr 1) or (f shl 31); h:= h xor g xor (e shl 3); f:= f xor e xor g; g:= (g shr 3) or (g shl 29); e:= (e shr 13) or (e shl 19);
t1:= f xor h; t2:= not t1; t3:= e xor g; t4:= g xor t1; t5:= f and t4; a:= t3 xor t5; t7:= e or t2; t8:= h xor t7; t9:= t3 or t8; d:= t1 xor t9; t11:= not t4; t12:= a or d; b:= t11 xor t12; t14:= h and t11; t15:= t3 xor t12; c:= t14 xor t15;
a:= a xor l_key[4*(i-6)]; b:= b xor l_key[4*(i-6)+1]; c:= c xor l_key[4*(i-6)+2]; d:= d xor l_key[4*(i-6)+3];
c:= (c shr 22) or (c shl 10); a:= (a shr 5) or (a shl 27); c:= c xor d xor (b shl 7); a:= a xor b xor d; d:= (d shr 7) or (d shl 25); b:= (b shr 1) or (b shl 31); d:= d xor c xor (a shl 3); b:= b xor a xor c; c:= (c shr 3) or (c shl 29); a:= (a shr 13) or (a shl 19);
t1:= a xor d; t2:= a and b; t3:= b xor c; t4:= a xor t3; t5:= b or d; h:= t4 xor t5; t7:= c or t1; t8:= b xor t7; t9:= t4 and t8; f:= t1 xor t9; t11:= not t2; t12:= h and f; t13:= t9 xor t11; g:= t12 xor t13; t15:= a and d; t16:= c xor t13; e:= t15 xor t16;
e:= e xor l_key[4*(i-7)]; f:= f xor l_key[4*(i-7)+1]; g:= g xor l_key[4*(i-7)+2]; h:= h xor l_key[4*(i-7)+3];
g:= (g shr 22) or (g shl 10); e:= (e shr 5) or (e shl 27); g:= g xor h xor (f shl 7); e:= e xor f xor h; h:= (h shr 7) or (h shl 25); f:= (f shr 1) or (f shl 31); h:= h xor g xor (e shl 3); f:= f xor e xor g; g:= (g shr 3) or (g shl 29); e:= (e shr 13) or (e shl 19);
t1:= e xor h; t2:= g xor h; t3:= not t2; t4:= e or f; c:= t3 xor t4; t6:= f xor t1; t7:= g or t6; t8:= e xor t7; t9:= t2 and t8; b:= t6 xor t9; t11:= not t8; t12:= f and h; t13:= b or t12; d:= t11 xor t13; t15:= t2 xor t12; t16:= b or d; a:= t15 xor t16;
a:= a xor l_key[4*(i-8)]; b:= b xor l_key[4*(i-8)+1]; c:= c xor l_key[4*(i-8)+2]; d:= d xor l_key[4*(i-8)+3];
Dec(i,8);
end;
PDWord(longword(@OutData)+ 0)^:= a;
PDWord(longword(@OutData)+ 4)^:= b;
PDWord(longword(@OutData)+ 8)^:= c;
PDWord(longword(@OutData)+12)^:= d;
end;
var
MDS: array[0..3,0..255] of dword;
MDSDone: boolean;
function LFSR1(x: DWord): DWord;
begin
if (x and 1)<> 0 then
Result:= (x shr 1) xor (MDS_GF_FDBK div 2)
else
Result:= (x shr 1);
end;
function LFSR2(x: DWord): DWord;
begin
if (x and 2)<> 0 then
if (x and 1)<> 0 then
Result:= (x shr 2) xor (MDS_GF_FDBK div 2) xor (MDS_GF_FDBK div 4)
else
Result:= (x shr 2) xor (MDS_GF_FDBK div 2)
else
if (x and 1)<> 0 then
Result:= (x shr 2) xor (MDS_GF_FDBK div 4)
else
Result:= (x shr 2);
end;
function Mul_X(x: DWord): DWord;
begin
Result:= x xor LFSR2(x);
end;
function Mul_Y(x: DWord): DWord;
begin
Result:= x xor LFSR1(x) xor LFSR2(x);
end;
function RS_MDS_Encode(lK0, lK1: DWord): DWord;
var
lR, nJ, lG2, lG3: DWord;
bB: byte;
begin
lR:= lK1;
for nJ:= 0 to 3 do
begin
bB:= lR shr 24;
if (bB and $80)<> 0 then
lG2:= ((bB shl 1) xor RS_GF_FDBK) and $FF
else
lG2:= (bB shl 1) and $FF;
if (bB and 1)<> 0 then
lG3:= ((bB shr 1) and $7f) xor (RS_GF_FDBK shr 1) xor lG2
else
lG3:= ((bB shr 1) and $7f) xor lG2;
lR:= (lR shl 8) xor (lG3 shl 24) xor (lG2 shl 16) xor (lG3 shl 8) xor bB;
end;
lR:= lR xor lK0;
for nJ:= 0 to 3 do
begin
bB:= lR shr 24;
if (bB and $80)<> 0 then
lG2:= ((bB shl 1) xor RS_GF_FDBK) and $FF
else
lG2:= (bB shl 1) and $FF;
if (bB and 1)<> 0 then
lG3:= ((bB shr 1) and $7f) xor (RS_GF_FDBK shr 1) xor lG2
else
lG3:= ((bB shr 1) and $7f) xor lG2;
lR:= (lR shl 8) xor (lG3 shl 24) xor (lG2 shl 16) xor (lG3 shl 8) xor bB;
end;
Result:= lR;
end;
function f32(x: DWord; K32: PDWordArray; Len: DWord): DWord;
var
t0, t1, t2, t3: DWord;
begin
t0:= x and $FF;
t1:= (x shr 8) and $FF;
t2:= (x shr 16) and $FF;
t3:= x shr 24;
if Len= 256 then
begin
t0:= p8x8[1,t0] xor ((K32^[3]) and $FF);
t1:= p8x8[0,t1] xor ((K32^[3] shr 8) and $FF);
t2:= p8x8[0,t2] xor ((K32^[3] shr 16) and $FF);
t3:= p8x8[1,t3] xor ((K32^[3] shr 24));
end;
if Len>= 192 then
begin
t0:= p8x8[1,t0] xor ((K32^[2]) and $FF);
t1:= p8x8[1,t1] xor ((K32^[2] shr 8) and $FF);
t2:= p8x8[0,t2] xor ((K32^[2] shr 16) and $FF);
t3:= p8x8[0,t3] xor ((K32^[2] shr 24));
end;
Result:= MDS[0,p8x8[0,p8x8[0,t0] xor ((K32^[1]) and $FF)] xor ((K32^[0]) and $FF)] xor
MDS[1,p8x8[0,p8x8[1,t1] xor ((K32^[1] shr 8) and $FF)] xor ((K32^[0] shr 8) and $FF)] xor
MDS[2,p8x8[1,p8x8[0,t2] xor ((K32^[1] shr 16) and $FF)] xor ((K32^[0] shr 16) and $FF)] xor
MDS[3,p8x8[1,p8x8[1,t3] xor ((K32^[1] shr 24))] xor ((K32^[0] shr 24))];
end;
procedure Xor256(Dst, Src: PDWordArray; v: byte);
var
i, j: DWord;
begin
i:= 0;
j:= v * $01010101;
while i< 64 do
begin
Dst^[i]:= Src^[i] xor j;
Dst^[i+1]:= Src^[i+1] xor j;
Dst^[i+2]:= Src^[i+2] xor j;
Dst^[i+3]:= Src^[i+3] xor j;
Inc(i,4);
end;
end;
procedure PreCompMDS;
var
m1, mx, my: array[0..1] of DWord;
nI: longword;
begin
for nI:= 0 to 255 do
begin
m1[0]:= p8x8[0,nI];
mx[0]:= Mul_X(m1[0]);
my[0]:= Mul_Y(m1[0]);
m1[1]:= p8x8[1,nI];
mx[1]:= Mul_X(m1[1]);
my[1]:= Mul_Y(m1[1]);
mds[0,nI]:= (m1[1] shl 0) or
(mx[1] shl 8) or
(my[1] shl 16) or
(my[1] shl 24);
mds[1,nI]:= (my[0] shl 0) or
(my[0] shl 8) or
(mx[0] shl 16) or
(m1[0] shl 24);
mds[2,nI]:= (mx[1] shl 0) or
(my[1] shl 8) or
(m1[1] shl 16) or
(my[1] shl 24);
mds[3,nI]:= (mx[0] shl 0) or
(m1[0] shl 8) or
(my[0] shl 16) or
(mx[0] shl 24);
end;
end;
{--------------------}
{ Destructor ������� }
{--------------------}
destructor TTwofish.Destroy;
begin
// All Strings := '';
// Free_And_Nil(All PObj);
inherited;
end;
////////////////////////////////////////////////////////////////////////////////
{-----------------------------}
{ ����������� ��� KOL ������� }
{-----------------------------}
function NewTwofish;
begin
New(Result, Create);
if not MDSDone then
begin
PreCompMDS;
MDSDone:= true;
end;
// code
end;
////////////////////////////////////////////////////////////////////////////////
procedure Ttwofish.InitKey(const Key; Size: longword);
const
subkeyCnt= ROUNDSUBKEYS + 2*NUMROUNDSTF;
var
key32: array[0..7] of DWord;
k32e, k32o, sboxkeys: array[0..3] of DWord;
k64Cnt, i, j, A, B, q: DWord;
L0, L1: array[0..255] of byte;
begin
burn;
FillChar(Key32,Sizeof(Key32),0);
Move(Key,Key32,Size div 8);
if Size<= 128 then { pad the key to either 128bit, 192bit or 256bit}
Size:= 128
else if Size<= 192 then
Size:= 192
else
Size:= 256;
k64Cnt:= Size div 64;
j:= k64Cnt-1;
for i:= 0 to j do
begin
k32e[i]:= key32[2*i];
k32o[i]:= key32[2*i+1];
sboxKeys[j]:= RS_MDS_Encode(k32e[i],k32o[i]);
Dec(j);
end;
q:= 0;
for i:= 0 to ((subkeyCnt div 2)-1) do
begin
A:= f32(q,@k32e,Size);
B:= f32(q+SK_BUMP,@k32o,Size);
B:= (B shl 8) or (B shr 24);
SubKeys[2*i]:= A+B;
B:= A + 2*B;
SubKeys[2*i+1]:= (B shl SK_ROTL) or (B shr (32 - SK_ROTL));
Inc(q,SK_STEP);
end;
case Size of
128: begin
Xor256(@L0,@p8x8[0],(sboxKeys[1] and $FF));
A:= (sboxKeys[0] and $FF);
i:= 0;
while i< 256 do
begin
sBox[0 and 2,2*i+(0 and 1)]:= MDS[0,p8x8[0,L0[i]] xor A];
sBox[0 and 2,2*i+(0 and 1)+2]:= MDS[0,p8x8[0,L0[i+1]] xor A];
Inc(i,2);
end;
Xor256(@L0,@p8x8[1],(sboxKeys[1] shr 8) and $FF);
A:= (sboxKeys[0] shr 8) and $FF;
i:= 0;
while i< 256 do
begin
sBox[1 and 2,2*i+(1 and 1)]:= MDS[1,p8x8[0,L0[i]] xor A];
sBox[1 and 2,2*i+(1 and 1)+2]:= MDS[1,p8x8[0,L0[i+1]] xor A];
Inc(i,2);
end;
Xor256(@L0,@p8x8[0],(sboxKeys[1] shr 16) and $FF);
A:= (sboxKeys[0] shr 16) and $FF;
i:= 0;
while i< 256 do
begin
sBox[2 and 2,2*i+(2 and 1)]:= MDS[2,p8x8[1,L0[i]] xor A];
sBox[2 and 2,2*i+(2 and 1)+2]:= MDS[2,p8x8[1,L0[i+1]] xor A];
Inc(i,2);
end;
Xor256(@L0,@p8x8[1],(sboxKeys[1] shr 24));
A:= (sboxKeys[0] shr 24);
i:= 0;
while i< 256 do
begin
sBox[3 and 2,2*i+(3 and 1)]:= MDS[3,p8x8[1,L0[i]] xor A];
sBox[3 and 2,2*i+(3 and 1)+2]:= MDS[3,p8x8[1,L0[i+1]] xor A];
Inc(i,2);
end;
end;
192: begin
Xor256(@L0,@p8x8[1],sboxKeys[2] and $FF);
A:= sboxKeys[0] and $FF;
B:= sboxKeys[1] and $FF;
i:= 0;
while i< 256 do
begin
sBox[0 and 2,2*i+(0 and 1)]:= MDS[0,p8x8[0,p8x8[0,L0[i]] xor B] xor A];
sBox[0 and 2,2*i+(0 and 1)+2]:= MDS[0,p8x8[0,p8x8[0,L0[i+1]] xor B] xor A];
Inc(i,2);
end;
Xor256(@L0,@p8x8[1],(sboxKeys[2] shr 8) and $FF);
A:= (sboxKeys[0] shr 8) and $FF;
B:= (sboxKeys[1] shr 8) and $FF;
i:= 0;
while i< 256 do
begin
sBox[1 and 2,2*i+(1 and 1)]:= MDS[1,p8x8[0,p8x8[1,L0[i]] xor B] xor A];
sBox[1 and 2,2*i+(1 and 1)+2]:= MDS[1,p8x8[0,p8x8[1,L0[i+1]] xor B] xor A];
Inc(i,2);
end;
Xor256(@L0,@p8x8[0],(sboxKeys[2] shr 16) and $FF);
A:= (sboxKeys[0] shr 16) and $FF;
B:= (sboxKeys[1] shr 16) and $FF;
i:= 0;
while i< 256 do
begin
sBox[2 and 2,2*i+(2 and 1)]:= MDS[2,p8x8[1,p8x8[0,L0[i]] xor B] xor A];
sBox[2 and 2,2*i+(2 and 1)+2]:= MDS[2,p8x8[1,p8x8[0,L0[i+1]] xor B] xor A];
Inc(i,2);
end;
Xor256(@L0,@p8x8[0],(sboxKeys[2] shr 24));
A:= (sboxKeys[0] shr 24);
B:= (sboxKeys[1] shr 24);
i:= 0;
while i< 256 do
begin
sBox[3 and 2,2*i+(3 and 1)]:= MDS[3,p8x8[1,p8x8[1,L0[i]] xor B] xor A];
sBox[3 and 2,2*i+(3 and 1)+2]:= MDS[3,p8x8[1,p8x8[1,L0[i+1]] xor B] xor A];
Inc(i,2);
end;
end;
256: begin
Xor256(@L1,@p8x8[1],(sboxKeys[3]) and $FF);
i:= 0;
while i< 256 do
begin
L0[i ]:= p8x8[1,L1[i]];
L0[i+1]:= p8x8[1,L1[i+1]];
Inc(i,2);
end;
Xor256(@L0,@L0,(sboxKeys[2]) and $FF);
A:= (sboxKeys[0]) and $FF;
B:= (sboxKeys[1]) and $FF;
i:= 0;
while i< 256 do
begin
sBox[0 and 2,2*i+(0 and 1)]:= MDS[0,p8x8[0,p8x8[0,L0[i]] xor B] xor A];
sBox[0 and 2,2*i+(0 and 1)+2]:= MDS[0,p8x8[0,p8x8[0,L0[i+1]] xor B] xor A];
Inc(i,2);
end;
Xor256(@L1,@p8x8[0],(sboxKeys[3] shr 8) and $FF);
i:= 0;
while i< 256 do
begin
L0[i ]:= p8x8[1,L1[i]];
L0[i+1]:= p8x8[1,L1[i+1]];
Inc(i,2);
end;
Xor256(@L0,@L0,(sboxKeys[2] shr 8) and $FF);
A:= (sboxKeys[0] shr 8) and $FF;
B:= (sboxKeys[1] shr 8) and $FF;
i:= 0;
while i< 256 do
begin
sBox[1 and 2,2*i+(1 and 1)]:= MDS[1,p8x8[0,p8x8[1,L0[i]] xor B] xor A];
sBox[1 and 2,2*i+(1 and 1)+2]:= MDS[1,p8x8[0,p8x8[1,L0[i+1]] xor B] xor A];
Inc(i,2);
end;
Xor256(@L1,@p8x8[0],(sboxKeys[3] shr 16) and $FF);
i:= 0;
while i< 256 do
begin
L0[i ]:= p8x8[0,L1[i]];
L0[i+1]:= p8x8[0,L1[i+1]];
Inc(i,2);
end;
Xor256(@L0,@L0,(sboxKeys[2] shr 16) and $FF);
A:= (sboxKeys[0] shr 16) and $FF;
B:= (sboxKeys[1] shr 16) and $FF;
i:= 0;
while i< 256 do
begin
sBox[2 and 2,2*i+(2 and 1)]:= MDS[2,p8x8[1,p8x8[0,L0[i]] xor B] xor A];
sBox[2 and 2,2*i+(2 and 1)+2]:= MDS[2,p8x8[1,p8x8[0,L0[i+1]] xor B] xor A];
Inc(i,2);
end;
Xor256(@L1,@p8x8[1],(sboxKeys[3] shr 24));
i:= 0;
while i< 256 do
begin
L0[i ]:= p8x8[0,L1[i]];
L0[i+1]:= p8x8[0,L1[i+1]];
Inc(i,2);
end;
Xor256(@L0,@L0,(sboxKeys[2] shr 24));
A:= (sboxKeys[0] shr 24);
B:= (sboxKeys[1] shr 24);
i:= 0;
while i< 256 do
begin
sBox[3 and 2,2*i+(3 and 1)]:= MDS[3,p8x8[1,p8x8[1,L0[i]] xor B] xor A];
sBox[3 and 2,2*i+(3 and 1)+2]:= MDS[3,p8x8[1,p8x8[1,L0[i+1]] xor B] xor A];
Inc(i,2);
end;
end;
end;
end;
procedure Ttwofish.Burn;
begin
FillChar(sBox,Sizeof(sBox),$FF);
FillChar(SubKeys,Sizeof(SubKeys),$FF);
inherited Burn;
end;
procedure Ttwofish.EncryptECB(const InData; var OutData);
var
i: longword;
t0, t1: DWord;
X: array[0..3] of DWord;
begin
// if not fInitialized then
// raise EDCP_blockcipher.Create('Cipher not initialized');
x[0]:= PDWord(@InData)^ xor SubKeys[INPUTWHITEN];
x[1]:= PDWord(longword(@InData)+4)^ xor SubKeys[INPUTWHITEN+1];
x[2]:= PDWord(longword(@InData)+8)^ xor SubKeys[INPUTWHITEN+2];
x[3]:= PDWord(longword(@InData)+12)^ xor SubKeys[INPUTWHITEN+3];
i:= 0;
while i<= NUMROUNDSTF-2 do
begin
t0:= sBox[0,(x[0] shl 1) and $1fe] xor sBox[0,((x[0] shr 7) and $1fe)+1]
xor sBox[2,(x[0] shr 15) and $1fe] xor sBox[2,((x[0] shr 23) and $1fe)+1];
t1:= sBox[0,((x[1] shr 23) and $1fe)] xor sBox[0,((x[1] shl 1) and $1fe)+1]
xor sBox[2,((x[1] shr 7) and $1fe)] xor sBox[2,((x[1] shr 15) and $1fe)+1];
x[3]:= (x[3] shl 1) or (x[3] shr 31);
x[2]:= x[2] xor (t0 + t1 + SubKeys[ROUNDSUBKEYS+2*i]);
x[3]:= x[3] xor (t0 + 2*t1 + SubKeys[ROUNDSUBKEYS+2*i+1]);
x[2]:= (x[2] shr 1) or (x[2] shl 31);
t0:= sBox[0,(x[2] shl 1) and $1fe] xor sBox[0,((x[2] shr 7) and $1fe)+1]
xor sBox[2,((x[2] shr 15) and $1fe)] xor sBox[2,((x[2] shr 23) and $1fe)+1];
t1:= sBox[0,((x[3] shr 23) and $1fe)] xor sBox[0,((x[3] shl 1) and $1fe)+1]
xor sBox[2,((x[3] shr 7) and $1fe)] xor sBox[2,((x[3] shr 15) and $1fe)+1];
x[1]:= (x[1] shl 1) or (x[1] shr 31);
x[0]:= x[0] xor (t0 + t1 + SubKeys[ROUNDSUBKEYS+2*(i+1)]);
x[1]:= x[1] xor (t0 + 2*t1 + SubKeys[ROUNDSUBKEYS+2*(i+1)+1]);
x[0]:= (x[0] shr 1) or (x[0] shl 31);
Inc(i,2);
end;
PDWord(longword(@OutData)+ 0)^:= x[2] xor SubKeys[OUTPUTWHITEN];
PDWord(longword(@OutData)+ 4)^:= x[3] xor SubKeys[OUTPUTWHITEN+1];
PDWord(longword(@OutData)+ 8)^:= x[0] xor SubKeys[OUTPUTWHITEN+2];
PDWord(longword(@OutData)+12)^:= x[1] xor SubKeys[OUTPUTWHITEN+3];
end;
procedure Ttwofish.DecryptECB(const InData; var OutData);
var
i: integer;
t0, t1: DWord;
X: array[0..3] of DWord;
begin
// if not fInitialized then
// raise EDCP_blockcipher.Create('Cipher not initialized');
X[2]:= PDWord(@InData)^ xor SubKeys[OUTPUTWHITEN];
X[3]:= PDWord(longword(@InData)+4)^ xor SubKeys[OUTPUTWHITEN+1];
X[0]:= PDWord(longword(@InData)+8)^ xor SubKeys[OUTPUTWHITEN+2];
X[1]:= PDWord(longword(@InData)+12)^ xor SubKeys[OUTPUTWHITEN+3];
i:= NUMROUNDSTF-2;
while i>= 0 do
begin
t0:= sBox[0,(x[2] shl 1) and $1fe] xor sBox[0,((x[2] shr 7) and $1fe)+1]
xor sBox[2,((x[2] shr 15) and $1fe)] xor sBox[2,((x[2] shr 23) and $1fe)+1];
t1:= sBox[0,((x[3] shr 23) and $1fe)] xor sBox[0,((x[3] shl 1) and $1fe)+1]
xor sBox[2,((x[3] shr 7) and $1fe)] xor sBox[2,((x[3] shr 15) and $1fe)+1];
x[0]:= (x[0] shl 1) or (x[0] shr 31);
x[0]:= x[0] xor (t0 + t1 + SubKeys[ROUNDSUBKEYS+2*(i+1)]);
x[1]:= x[1] xor (t0 + 2*t1 + SubKeys[ROUNDSUBKEYS+2*(i+1)+1]);
x[1]:= (x[1] shr 1) or (x[1] shl 31);
t0:= sBox[0,(x[0] shl 1) and $1fe] xor sBox[0,((x[0] shr 7) and $1fe)+1]
xor sBox[2,(x[0] shr 15) and $1fe] xor sBox[2,((x[0] shr 23) and $1fe)+1];
t1:= sBox[0,((x[1] shr 23) and $1fe)] xor sBox[0,((x[1] shl 1) and $1fe)+1]
xor sBox[2,((x[1] shr 7) and $1fe)] xor sBox[2,((x[1] shr 15) and $1fe)+1];
x[2]:= (x[2] shl 1) or (x[2] shr 31);
x[2]:= x[2] xor (t0 + t1 + SubKeys[ROUNDSUBKEYS+2*i]);
x[3]:= x[3] xor (t0 + 2*t1 + SubKeys[ROUNDSUBKEYS+2*i+1]);
x[3]:= (x[3] shr 1) or (x[3] shl 31);
Dec(i,2);
end;
PDWord(longword(@OutData)+ 0)^:= X[0] xor SubKeys[INPUTWHITEN];
PDWord(longword(@OutData)+ 4)^:= X[1] xor SubKeys[INPUTWHITEN+1];
PDWord(longword(@OutData)+ 8)^:= X[2] xor SubKeys[INPUTWHITEN+2];
PDWord(longword(@OutData)+12)^:= X[3] xor SubKeys[INPUTWHITEN+3];
end;
initialization
ice_sboxdone:= false;
MDSdone:= false;
end.