XXTEA for Delphi

XXTEA for Delphi 网上原来有人提供了实现,但是那个是加密是针对动态无符号32位整数数组的,不能用来加密解密字符串。

这里提供的 XXTEA for Delphi 算法是用来加密解密 AnsiString 类型数据的,密钥也是 AnsiString 类型的数据,使用更加方便,而且跟本站所提供的 PHP、JavaScript、ActionScript、C#、Java、Perl 的实现相兼容,在一种语言中加密的数据,可以在另一种语言中解密(这也是 PHPRPC 可以加密通讯的前提)。

XXTEA.pas 

 

Delphi/Pascal代码
 
  1. {  
  2. /**********************************************************\  
  3. |                                                          |  
  4. | The implementation of PHPRPC Protocol 3.0                |  
  5. |                                                          |  
  6. | XXTEA.pas                                                |  
  7. |                                                          |  
  8. | Release 3.0.0                                            |  
  9. | Copyright (c) 2005-2008 by Team-PHPRPC                   |  
  10. |                                                          |  
  11. | WebSite:  http://www.phprpc.org/                         |  
  12. |           http://www.phprpc.net/                         |  
  13. |           http://www.phprpc.com/                         |  
  14. |           http://sourceforge.net/projects/php-rpc/       |  
  15. |                                                          |  
  16. | Authors:  Ma Bingyao <andot@ujn.edu.cn>                  |  
  17. |                                                          |  
  18. | This file may be distributed and/or modified under the   |  
  19. | terms of the GNU Lesser General Public License (LGPL)    |  
  20. | version 3.0 as published by the Free Software Foundation |  
  21. | and appearing in the included file LICENSE.              |  
  22. |                                                          |  
  23. \**********************************************************/  
  24.  
  25. /* XXTEA encryption arithmetic library.  
  26.  *  
  27.  * Copyright (C) 2005-2008 Ma Bingyao <andot@ujn.edu.cn>  
  28.  * Version: 3.0.0  
  29.  * LastModified: Jan 17, 2008  
  30.  * This library is free.  You can redistribute it and/or modify it.  
  31.  */  
  32. }  
  33.   
  34. unit XXTEA;   
  35.   
  36. interface  
  37.   
  38. function Encrypt(const data:AnsiString; const key:AnsiString):AnsiString;   
  39. function Decrypt(const data:AnsiString; const key:AnsiString):AnsiString;   
  40.   
  41. implementation  
  42.   
  43. type  
  44.   TLongWordDynArray = array of LongWord;   
  45.   
  46. const  
  47.   delta:Longword = $9e3779b9;   
  48.   
  49. function StrToArray(const data:AnsiString; includeLength:Boolean):TLongWordDynArray;   
  50. var  
  51.   n, i:LongWord;   
  52. begin  
  53.   n := Length(data);   
  54.   if ((n and 3) = 0then n := n shr 2 else n := (n shr 2) + 1;   
  55.   if (includeLength) then begin  
  56.     setLength(result, n + 1);   
  57.     result[n] := Length(data);   
  58.   end else begin  
  59.     setLength(result, n);   
  60.   end;   
  61.   n := Length(data);   
  62.   for i := 0 to n - 1 do begin  
  63.     result[i shr 2] := result[i shr 2or (($000000ff and ord(data[i + 1])) shl ((i and 3shl 3));   
  64.   end;   
  65. end;   
  66.   
  67. function ArrayToStr(const data:TLongWordDynArray; includeLength:Boolean):AnsiString;   
  68. var  
  69.   n, m, i:LongWord;   
  70. begin  
  71.   n := Length(data) shl 2;   
  72.   if (includeLength) then begin  
  73.     m := data[Length(data) - 1];   
  74.     if (m > n) then begin  
  75.       result := '';   
  76.       exit;   
  77.     end else begin  
  78.       n := m;   
  79.     end;   
  80.   end;   
  81.   SetLength(result, n);   
  82.   for i := 0 to n - 1 do begin  
  83.     result[i + 1] := chr((data[i shr 2shr ((i and 3shl 3)) and $ff);   
  84.   end;   
  85. end;   
  86.   
  87. function XXTeaEncrypt(const v:TLongWordDynArray; var k:TLongWordDynArray):TLongWordDynArray;   
  88. var  
  89.   n, z, y, sum, e, p, q:LongWord;   
  90.   function MX:LongWord;   
  91.   begin  
  92.     result := (((z shr 5xor (y shl 2)) + ((y shr 3xor (z shl 4))) xor ((sum xor y) + (k[p and 3 xor e] xor z));   
  93.   end;   
  94. begin  
  95.   n := Length(v) - 1;   
  96.   if (n < 1then begin  
  97.     result := v;   
  98.     exit;   
  99.   end;   
  100.   if Length(k) < 4 then setLength(k, 4);   
  101.   z := v[n];   
  102.   y := v[0];   
  103.   sum := 0;   
  104.   q := 6 + 52 div (n + 1);   
  105.   repeat  
  106.     inc(sum, delta);   
  107.     e := (sum shr 2and 3;   
  108.     for p := 0 to n - 1 do begin  
  109.       y := v[p + 1];   
  110.       inc(v[p], mx());   
  111.       z := v[p];   
  112.     end;   
  113.     p := n;   
  114.     y := v[0];   
  115.     inc(v[p], mx());   
  116.     z := v[p];   
  117.     dec(q);   
  118.   until q = 0;   
  119.   result := v;   
  120. end;   
  121.   
  122. function XXTeaDecrypt(const v:TLongWordDynArray; var k:TLongWordDynArray):TLongWordDynArray;   
  123. var  
  124.   n, z, y, sum, e, p, q:LongWord;   
  125.   function MX:LongWord;   
  126.   begin  
  127.     result := (((z shr 5xor (y shl 2)) + ((y shr 3xor (z shl 4))) xor ((sum xor y) + (k[p and 3 xor e] xor z));   
  128.   end;   
  129. begin  
  130.   n := Length(v) - 1;   
  131.   if (n < 1then begin  
  132.     result := v;   
  133.     exit;   
  134.   end;   
  135.   if Length(k) < 4 then setLength(k, 4);   
  136.   z := v[n];   
  137.   y := v[0];   
  138.   q := 6 + 52 div (n + 1);   
  139.   sum := q * delta;   
  140.   while (sum <> 0do begin  
  141.     e := (sum shr 2and 3;   
  142.     for p := n downto 1 do begin  
  143.       z := v[p - 1];   
  144.       dec(v[p], mx());   
  145.       y := v[p];   
  146.     end;   
  147.     p := 0;   
  148.     z := v[n];   
  149.     dec(v[0], mx());   
  150.     y := v[0];   
  151.     dec(sum, delta);   
  152.   end;   
  153.   result := v;   
  154. end;   
  155.   
  156. function Encrypt(const data:AnsiString; const key:AnsiString):AnsiString;   
  157. var  
  158.   v, k:TLongWordDynArray;   
  159. begin  
  160.   if (Length(data) = 0then exit;   
  161.   v := StrToArray(data, true);   
  162.   k := StrToArray(key, false);   
  163.   result := ArrayToStr(XXTeaEncrypt(v, k), false);   
  164. end;   
  165.   
  166. function Decrypt(const data:AnsiString; const key:AnsiString):AnsiString;   
  167. var  
  168.   v, k:TLongWordDynArray;   
  169. begin  
  170.   if (Length(data) = 0then exit;   
  171.   v := StrToArray(data, false);   
  172.   k := StrToArray(key, false);   
  173.   result := ArrayToStr(XXTeaDecrypt(v, k), true);   
  174. end;   
  175.   
  176. end.  

 

标签: Cryptology, Pascal/Delphi

« 上一篇 | 下一篇 »

只显示10条记录相关文章

发表评论

评论 (必须):