找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 8249|回复: 1

[开源] Delphi互通的AES加解密程序源码

[复制链接]

1214

主题

352

回帖

11

精华

管理员

菜鸟

积分
93755

贡献奖关注奖人气王精英奖乐于助人勋章

发表于 2010-12-25 12:22:47 | 显示全部楼层 |阅读模式
  1. //**********************************************
  2. // 文件名:        UnitAes.pas
  3. // 作者:                nanika
  4. // 电子邮件:        nanika@qq.com
  5. // 日期:                2010年03月06日
  6. // 声明:                AES数据加密/解密类(可与小虫制作的Asp文件互相加解密)
  7. //                        本代码可以自由使用,但请保留此版权声明信息
  8. //                        如果您对本上传类进行修改增强,
  9. //                        请发送一份给我。
  10. //           谢谢!^-^
  11. //**********************************************
  12. unit UnitAES;

  13. interface
  14. uses
  15.   SysUtils;
  16. type
  17.   TIOArray=array[0..15] of byte;
  18.   TAes=class
  19.     function EntryptString(const text,key:WideString;keysize:integer=128):WideString;
  20.     function DecryptString(const text,key:WideString;keysize:integer=128):WideString;
  21.   private
  22.     FNb,FNk,FNr:byte;
  23.     FKey:array[0..31] of byte;
  24.     FW:array[0..59,0..3] of byte;
  25.     FState:array[0..3,0..3] of byte;
  26.     function ArrayToHexStr(Src:array of byte):WideString;
  27.     function ArrayToStr(Src:array of byte):WideString;
  28.     procedure HexStrToArray(Src:WideString;var Out:TIOArray);
  29.     function HexStr(Src:widestring):WideString;
  30.     procedure InitKey(const Key:WideString);
  31.     procedure SetNbNkNr(keysize:integer);
  32.     procedure AddRoundKey(around:integer);
  33.     procedure KeyExpansion;
  34.     procedure SubBytes;
  35.     procedure InvSubBytes;
  36.     procedure ShiftRows;
  37.     procedure InvShiftRows;
  38.     procedure MixColumns;
  39.     procedure InvMixColumns;
  40.     function gfmultby01(b:byte):byte;
  41.     function gfmultby02(b:byte):byte;
  42.     function gfmultby03(b:byte):byte;
  43.     function gfmultby09(b:byte):byte;
  44.     function gfmultby0b(b:byte):byte;
  45.     function gfmultby0d(b:byte):byte;
  46.     function gfmultby0e(b:byte):byte;
  47.     procedure SubWord(var B1,B2,B3,B4:byte);
  48.     procedure RotWord(var B1,B2,B3,B4:byte);
  49.     procedure FCipher(input:TIOarray;var output:TIOarray);
  50.     procedure FInvCipher(input:TIOarray;var output:TIOarray);
  51.   public

  52.   end;

  53. var
  54.   AES:TAes;

  55. implementation
  56. var
  57.   FSBox:array[0..15,0..15] of byte=(
  58.     ($63,$7C,$77,$7B,$F2,$6B,$6F,$C5,$30,$01,$67,$2B,$FE,$D7,$AB,$76),
  59.     ($CA,$82,$C9,$7D,$FA,$59,$47,$F0,$AD,$D4,$A2,$AF,$9C,$A4,$72,$C0),
  60.     ($B7,$FD,$93,$26,$36,$3F,$F7,$CC,$34,$A5,$E5,$F1,$71,$D8,$31,$15),
  61.     ($04,$C7,$23,$C3,$18,$96,$05,$9A,$07,$12,$80,$E2,$EB,$27,$B2,$75),
  62.     ($09,$83,$2C,$1A,$1B,$6E,$5A,$A0,$52,$3B,$D6,$B3,$29,$E3,$2F,$84),
  63.     ($53,$D1,$00,$ED,$20,$FC,$B1,$5B,$6A,$CB,$BE,$39,$4A,$4C,$58,$CF),
  64.     ($D0,$EF,$AA,$FB,$43,$4D,$33,$85,$45,$F9,$02,$7F,$50,$3C,$9F,$A8),
  65.     ($51,$A3,$40,$8F,$92,$9D,$38,$F5,$BC,$B6,$DA,$21,$10,$FF,$F3,$D2),
  66.     ($CD,$0C,$13,$EC,$5F,$97,$44,$17,$C4,$A7,$7E,$3D,$64,$5D,$19,$73),
  67.     ($60,$81,$4F,$DC,$22,$2A,$90,$88,$46,$EE,$B8,$14,$DE,$5E,$0B,$DB),
  68.     ($E0,$32,$3A,$0A,$49,$06,$24,$5C,$C2,$D3,$AC,$62,$91,$95,$E4,$79),
  69.     ($E7,$C8,$37,$6D,$8D,$D5,$4E,$A9,$6C,$56,$F4,$EA,$65,$7A,$AE,$08),
  70.     ($BA,$78,$25,$2E,$1C,$A6,$B4,$C6,$E8,$DD,$74,$1F,$4B,$BD,$8B,$8A),
  71.     ($70,$3E,$B5,$66,$48,$03,$F6,$0E,$61,$35,$57,$B9,$86,$C1,$1D,$9E),
  72.     ($E1,$F8,$98,$11,$69,$D9,$8E,$94,$9B,$1E,$87,$E9,$CE,$55,$28,$DF),
  73.     ($8C,$A1,$89,$0D,$BF,$E6,$42,$68,$41,$99,$2D,$0F,$B0,$54,$BB,$16));

  74.   FIsBox:array[0..15,0..15] of byte=(
  75.     ($52,$09,$6A,$D5,$30,$36,$A5,$38,$BF,$40,$A3,$9E,$81,$F3,$D7,$FB),
  76.     ($7C,$E3,$39,$82,$9B,$2F,$FF,$87,$34,$8E,$43,$44,$C4,$DE,$E9,$CB),
  77.     ($54,$7B,$94,$32,$A6,$C2,$23,$3D,$EE,$4C,$95,$0B,$42,$FA,$C3,$4E),
  78.     ($08,$2E,$A1,$66,$28,$D9,$24,$B2,$76,$5B,$A2,$49,$6D,$8B,$D1,$25),
  79.     ($72,$F8,$F6,$64,$86,$68,$98,$16,$D4,$A4,$5C,$CC,$5D,$65,$B6,$92),
  80.     ($6C,$70,$48,$50,$FD,$ED,$B9,$DA,$5E,$15,$46,$57,$A7,$8D,$9D,$84),
  81.     ($90,$D8,$AB,$00,$8C,$BC,$D3,$0A,$F7,$E4,$58,$05,$B8,$B3,$45,$06),
  82.     ($D0,$2C,$1E,$8F,$CA,$3F,$0F,$02,$C1,$AF,$BD,$03,$01,$13,$8A,$6B),
  83.     ($3A,$91,$11,$41,$4F,$67,$DC,$EA,$97,$F2,$CF,$CE,$F0,$B4,$E6,$73),
  84.     ($96,$AC,$74,$22,$E7,$AD,$35,$85,$E2,$F9,$37,$E8,$1C,$75,$DF,$6E),
  85.     ($47,$F1,$1A,$71,$1D,$29,$C5,$89,$6F,$B7,$62,$0E,$AA,$18,$BE,$1B),
  86.     ($FC,$56,$3E,$4B,$C6,$D2,$79,$20,$9A,$DB,$C0,$FE,$78,$CD,$5A,$F4),
  87.     ($1F,$DD,$A8,$33,$88,$07,$C7,$31,$B1,$12,$10,$59,$27,$80,$EC,$5F),
  88.     ($60,$51,$7F,$A9,$19,$B5,$4A,$0D,$2D,$E5,$7A,$9F,$93,$C9,$9C,$EF),
  89.     ($A0,$E0,$3B,$4D,$AE,$2A,$F5,$B0,$C8,$EB,$BB,$3C,$83,$53,$99,$61),
  90.     ($17,$2B,$04,$7E,$BA,$77,$D6,$26,$E1,$69,$14,$63,$55,$21,$0C,$7D));

  91.   FRcon:array[0..10,0..3] of byte=(
  92.     ($00,$00,$00,$00),
  93.     ($01,$00,$00,$00),
  94.     ($02,$00,$00,$00),
  95.     ($04,$00,$00,$00),
  96.     ($08,$00,$00,$00),
  97.     ($10,$00,$00,$00),
  98.     ($20,$00,$00,$00),
  99.     ($40,$00,$00,$00),
  100.     ($80,$00,$00,$00),
  101.     ($1B,$00,$00,$00),
  102.     ($36,$00,$00,$00));

  103. //----------------------------------------------------------------------------
  104. function TAes.EntryptString(const text,key:WideString;keysize:integer=128):WideString;
  105. var
  106.   i,iLen:integer;
  107.   sLen,HexString:WideString;
  108.   str32:WideString;
  109.   input,output:TIOArray;
  110. begin
  111.   SetNbNkNr(keysize);
  112.   InitKey(key);
  113.   iLen:=length(text);
  114.   sLen:=inttohex(iLen,4);
  115.   HexString:=sLen+HexStr(text);
  116.   result:='';
  117.   i:=0;
  118.   str32:=copy(HexString,1,32);
  119.   While length(str32)>0 do
  120.   begin
  121.     HexStrToArray(str32,input);
  122.     FCipher(input,output);
  123.     result:=result+ArrayToHexStr(output);
  124.     i:=i+length(str32);
  125.     str32:=copy(HexString,i+1,32);
  126.   end;
  127. end;

  128. function TAes.DecryptString(const text,key:WideString;keysize:integer=128):WideString;
  129. var
  130.   i,iLen:integer;
  131.   sLen,HexString:WideString;
  132.   Str32,str:WideString;
  133.   input,output:TIOArray;
  134. begin
  135.   SetNbNkNr(keysize);
  136.   InitKey(key);
  137.   HexString:=text;
  138.   result:='';
  139.   i:=0;
  140.   str32:=copy(hexstring,1,32);
  141.   i:=i+length(str32);
  142.   HexStrToArray(str32,input);
  143.   FInvCipher(input,output);
  144.   str:=ArrayToHexStr(output);
  145.   sLen:=Copy(str,1,4);
  146.   iLen:=strtoint('$'+sLen);
  147.   str:=ArrayToStr(output);
  148.   result:=copy(str,length(str)-6,7);
  149.   str32:=copy(HexString,i+1,32);
  150.   while length(str32)>0 do
  151.   begin
  152.     HexStrToArray(str32,input);
  153.     FInvCipher(input,output);
  154.     result:=result+ArrayToStr(output);
  155.     i:=i+ length(str32);
  156.     str32:=copy(HexString,i+1,32);
  157.   end;
  158.   result:=copy(result,1,iLen);
  159. end;

  160. //----------------------------转换函数------------------------------

  161. function TAes.ArrayToHexStr(Src:array of byte):WideString;
  162. var
  163.   i:integer;
  164. begin
  165.   result:='';
  166.   For i:=Low(Src) to High(Src) do
  167.     result:=result+inttohex(Src[i],2);
  168. end;

  169. function TAes.ArrayToStr(Src:array of byte):WideString;
  170. var
  171.   i:integer;
  172. begin
  173.   result:='';
  174.   For i:=Low(Src) to (High(Src) div 2) do
  175.     result:=result+WideChar(Src[2*i]+Src[2*i+1]*$100);
  176. end;

  177. function TAes.HexStr(Src:WideString):WideString;
  178. var
  179.   i:integer;
  180.   temp:WideString;
  181. begin
  182.   result:='';
  183.   For i:=1 to length(Src) do
  184.   begin
  185.     temp:=inttohex(ord(Src[i]),4);
  186.     temp:=copy(temp,3,2)+copy(temp,1,2);
  187.     result:=result+temp;
  188.   end;
  189. end;

  190. procedure TAes.HexStrToArray(Src:WideString;var Out:TIOArray);
  191. var
  192.   i:integer;
  193. begin
  194.   for i:=0 to (length(Src) div 2)-1 do
  195.     Out[i]:=strtoint('$'+copy(Src,2*i+1,2));
  196.   for i:=(length(Src) div 2) to High(Out) do Out[i]:=0;
  197. end;

  198. //------------------------初始化-------------------------------------

  199. procedure TAes.InitKey(const key:WideString);
  200. var
  201.   i,count:integer;
  202. begin
  203.   FillChar(FKey,32,0);
  204.   If length(key)>FNk*4 then count:=FNk*4
  205.   else count:=length(key);
  206.   for i:=0 to count-1 do FKey[i]:=byte(ord(key[i+1]));
  207.   KeyExpansion;
  208. end;

  209. procedure TAes.SetNbNkNr(keysize:integer);
  210. begin
  211.   FNb:=4;
  212.   Case KeySize of
  213.     192:
  214.     begin
  215.       FNk:=6;
  216.       FNr:=12;
  217.     end;
  218.     256:
  219.     begin
  220.       FNk:=8;
  221.       FNr:=14;
  222.     end;
  223.     else
  224.     begin
  225.       FNk:=4;
  226.       FNr:=10;
  227.     end;
  228.   end;
  229. end;

  230. procedure TAes.AddRoundKey(around:integer);
  231. var
  232.   r,c:integer;
  233. begin
  234.   For r:=0 to 3 do
  235.   For c:=0 to 3 do
  236.   Fstate[r,c]:=Fstate[r,c] xor Fw[(around*4)+c,r];
  237. end;

  238. procedure TAes.KeyExpansion;
  239. var
  240.   row:integer;
  241.   temp:array[0..3] of byte;
  242.   i:integer;
  243. begin
  244.   for row:=0 to FNk-1 do
  245.   begin
  246.     FW[row,0]:=Fkey[4*row];
  247.     FW[row,1]:=Fkey[4*row+1];
  248.     FW[row,2]:=FKey[4*row+2];
  249.     FW[row,3]:=FKey[4*row+3];
  250.   end;
  251.   for row:=FNk to FNb*(FNr+1)-1 do
  252.   begin
  253.     for i:=0 to 3 do temp[i]:=FW[row-1,i];
  254.     If (row mod Fnk)=0 then
  255.     begin
  256.       RotWord(temp[0],temp[1],temp[2],temp[3]);
  257.       SubWord(temp[0],temp[1],temp[2],temp[3]);
  258.       for i:=0 to 3 do temp[i]:=temp[i] xor FRcon[row div Fnk,i];
  259.     end
  260.     else if (FNk>6) and ((row mod Fnk)=4) then
  261.       SubWord(temp[0],temp[1],temp[2],temp[3]);
  262.     for i:=0 to 3 do
  263.       FW[row,i]:=FW[row-FNk,i] xor temp[i];
  264.   end;
  265. end;

  266. procedure TAes.SubBytes;
  267. var
  268.   r,c:integer;
  269. begin
  270.   for r:=0 to 3 do
  271.   for c:=0 to 3 do
  272.   FState[r,c]:=FSBox[FState[r,c] div 16,FState[r,c] and $0F];
  273. end;

  274. procedure TAes.InvSubBytes;
  275. var
  276.   r,c:integer;
  277. begin
  278.   for r:=0 to 3 do
  279.   for c:=0 to 3 do
  280.   FState[r,c]:=FIsBox[FState[r,c] div 16,FState[r,c] and $0F];
  281. end;

  282. procedure TAes.ShiftRows;
  283. var
  284.   temp:array[0..3,0..3] of byte;
  285.   r,c:integer;
  286. begin
  287.   for r:=0 to 3 do
  288.   for c:=0 to 3 do
  289.   temp[r,c]:=FState[r,c];
  290.   for r:=1 to 3 do
  291.   for c:=0 to 3 do
  292.   FState[r,c]:=temp[r,(c+r) mod FNb];
  293. end;

  294. procedure TAes.InvShiftRows;
  295. var
  296.   temp:array[0..3,0..3] of byte;
  297.   r,c:integer;
  298. begin
  299.   for r:=0 to 3 do
  300.   for c:=0 to 3 do
  301.   temp[r,c]:=FState[r,c];
  302.   for r:=1 to 3 do
  303.   for c:=0 to 3 do
  304.   FState[r,(c+r) mod FNb]:=temp[r,c];
  305. end;

  306. procedure TAes.MixColumns;
  307. var
  308.   temp:array[0..3,0..3] of byte;
  309.   r,c:integer;
  310. begin
  311.   for r:=0 to 3 do
  312.   for c:=0 to 3 do
  313.   temp[r,c]:=FState[r,c];
  314.   for c:=0 to 3 do
  315.   begin
  316.     FState[0,c]:=gfmultby02(temp[0,c]) xor gfmultby03(temp[1,c])
  317.       xor gfmultby01(temp[2,c]) xor gfmultby01(temp[3,c]);
  318.     FState[1,c]:=gfmultby01(temp[0,c]) xor gfmultby02(temp[1,c])
  319.       xor gfmultby03(temp[2,c]) xor gfmultby01(temp[3,c]);
  320.     FState[2,c]:=gfmultby01(temp[0,c]) xor gfmultby01(temp[1,c])
  321.       xor gfmultby02(temp[2,c]) xor gfmultby03(temp[3,c]);
  322.     FState[3,c]:=gfmultby03(temp[0,c]) xor gfmultby01(temp[1,c])
  323.       xor gfmultby01(temp[2,c]) xor gfmultby02(temp[3,c]);
  324.   end;
  325. end;

  326. procedure TAes.InvMixColumns;
  327. var
  328.   temp:array[0..3,0..3] of byte;
  329.   r,c:integer;
  330. begin
  331.   for r:=0 to 3 do
  332.   for c:=0 to 3 do
  333.   temp[r,c]:=FState[r,c];
  334.   for c:=0 to 3 do
  335.   begin
  336.     FState[0,c]:=gfmultby0e(temp[0,c]) xor gfmultby0b(temp[1,c])
  337.       xor gfmultby0d(temp[2,c]) xor gfmultby09(temp[3,c]);
  338.     FState[1,c]:=gfmultby09(temp[0,c]) xor gfmultby0e(temp[1,c])
  339.       xor gfmultby0b(temp[2,c]) xor gfmultby0d(temp[3,c]);
  340.     FState[2,c]:=gfmultby0d(temp[0,c]) xor gfmultby09(temp[1,c])
  341.       xor gfmultby0e(temp[2,c]) xor gfmultby0b(temp[3,c]);
  342.     FState[3,c]:=gfmultby0b(temp[0,c]) xor gfmultby0d(temp[1,c])
  343.       xor gfmultby09(temp[2,c]) xor gfmultby0e(temp[3,c]);
  344.   end;
  345. end;

  346. function TAes.gfmultby01(b:byte):byte;
  347. begin
  348.   result:=b;
  349. end;

  350. function TAes.gfmultby02(b:byte):byte;
  351. begin
  352.   if b<$80 then
  353.     result:=b*2
  354.   else
  355.     result:=b*2 xor $1B;
  356. end;

  357. function TAes.gfmultby03(b:byte):byte;
  358. begin
  359.   result:=gfmultby02(b) xor b;
  360. end;

  361. function TAes.gfmultby09(b:byte):byte;
  362. begin
  363.   result:=gfmultby02(gfmultby02(gfmultby02(b))) xor b;
  364. end;

  365. function TAes.gfmultby0b(b:byte):byte;
  366. begin
  367.   result:=gfmultby09(b) xor gfmultby02(b);
  368. end;

  369. function TAes.gfmultby0d(b:byte):byte;
  370. begin
  371.   result:=gfmultby09(b) xor gfmultby02(gfmultby02(b));
  372. end;

  373. function TAes.gfmultby0e(b:byte):byte;
  374. begin
  375.   result:=gfmultby02(gfmultby02(gfmultby02(b))) xor gfmultby02(gfmultby02(b))
  376.     xor gfmultby02(b);
  377. end;

  378. procedure TAes.SubWord(var B1,B2,B3,B4:byte);
  379. begin
  380.   B4:=FSbox[B4 div 16,B4 and $0F];
  381.   B3:=FSbox[B3 div 16,B3 and $0F];
  382.   B2:=FSbox[B2 div 16,B2 and $0F];
  383.   B1:=FSbox[B1 div 16,B1 and $0F];
  384. end;

  385. procedure TAes.RotWord(var B1,B2,B3,B4:byte);
  386. var
  387.   B:byte;
  388. begin
  389.   B:=B1;
  390.   B1:=B2;
  391.   B2:=B3;
  392.   B3:=B4;
  393.   B4:=B;
  394. end;

  395. procedure TAes.FCipher(input:TIOArray;var output:TIOArray);
  396. var
  397.   i,around:integer;
  398. begin
  399.   for i:=0 to 4*FNb-1 do FState[i mod 4, i div 4]:=input[i];
  400.   AddRoundKey(0);
  401.   For around:=1 to FNr-1 do
  402.   begin
  403.     SubBytes;
  404.     ShiftRows;
  405.     MixColumns;
  406.     AddRoundKey(around);
  407.   end;
  408.   SubBytes;
  409.   ShiftRows;
  410.   AddRoundKey(FNr);
  411.   for i:=0 to FNb*4-1 do output[i]:=FState[i mod 4,i div 4];
  412. end;

  413. procedure TAes.FInvCipher(input:TIOArray;var output:TIOArray);
  414. var
  415.   i,around:integer;
  416. begin
  417.   for i:=0 to 4*FNb-1 do FState[i mod 4,i div 4]:=input[i];
  418.   AddRoundKey(FNr);
  419.   for around:=FNr-1 downto 1 do
  420.   begin
  421.     InvShiftRows;
  422.     InvSubBytes;
  423.     AddRoundKey(around);
  424.     InvMixColumns;
  425.   end;
  426.   InvShiftRows;
  427.   InvSubBytes;
  428.   AddRoundKey(0);
  429.   for i:=0 to FNb*4-1 do output[i]:=FState[i mod 4,i div 4];
  430. end;

  431. end.
复制代码
【VB】QQ群:1422505加的请打上VB好友
【易语言】QQ群:9531809  或 177048
【FOXPRO】QQ群:6580324  或 33659603
【C/C++/VC】QQ群:3777552
【NiceBasic】QQ群:3703755

30

主题

693

回帖

0

精华

钻石会员

积分
2815
发表于 2015-4-26 10:08:46 | 显示全部楼层
这个加密方法貌似很难破解
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表