浏览模式: 标准 | 列表
10月
01

XXTEA for Python

Python代码
  1. ############################################################  
  2. #                                                          #  
  3. # The implementation of PHPRPC Protocol 3.0                #  
  4. #                                                          #  
  5. # xxtea.py                                                 #  
  6. #                                                          #  
  7. # Release 3.0.0                                            #  
  8. # Copyright (c) 2005-2008 by Team-PHPRPC                   #  
  9. #                                                          #  
  10. # WebSite:  http://www.phprpc.org/                         #  
  11. #           http://www.phprpc.net/                         #  
  12. #           http://www.phprpc.com/                         #  
  13. #           http://sourceforge.net/projects/php-rpc/       #  
  14. #                                                          #  
  15. # Authors:  Ma Bingyao <andot@ujn.edu.cn>                  #  
  16. #                                                          #  
  17. # This file may be distributed and/or modified under the   #  
  18. # terms of the GNU Lesser General Public License (LGPL)    #  
  19. # version 3.0 as published by the Free Software Foundation #  
  20. # and appearing in the included file LICENSE.              #  
  21. #                                                          #  
  22. ############################################################  
  23. #  
  24. # XXTEA encryption arithmetic library.  
  25. #  
  26. # Copyright (C) 2005-2008 Ma Bingyao <andot@ujn.edu.cn>  
  27. # Version: 1.0  
  28. # LastModified: Oct 5, 2008  
  29. # This library is free.  You can redistribute it and/or modify it.  
  30.   
  31. import struct  
  32.   
  33. _DELTA = 0x9E3779B9  
  34.   
  35. def _long2str(v, w):  
  36.     n = (len(v) - 1) << 2  
  37.     if w:  
  38.         m = v[-1]  
  39.         if (m < n - 3or (m > n): return ''  
  40.         n = m  
  41.     s = struct.pack('<%iL' % len(v), *v)  
  42.     return s[0:n] if w else s  
  43.   
  44. def _str2long(s, w):  
  45.     n = len(s)  
  46.     m = (4 - (n & 3) & 3) + n  
  47.     s = s.ljust(m, "\0")  
  48.     v = list(struct.unpack('<%iL' % (m >> 2), s))  
  49.     if w: v.append(n)  
  50.     return v  
  51.   
  52. def encrypt(str, key):  
  53.     if str == ''return str  
  54.     v = _str2long(str, True)  
  55.     k = _str2long(key.ljust(16"\0"), False)  
  56.     n = len(v) - 1  
  57.     z = v[n]  
  58.     y = v[0]  
  59.     sum = 0  
  60.     q = 6 + 52 // (n + 1)  
  61.     while q > 0:  
  62.         sum = (sum + _DELTA) & 0xffffffff  
  63.         e = sum >> 2 & 3  
  64.         for p in xrange(n):  
  65.             y = v[p + 1]  
  66.             v[p] = (v[p] + ((z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z))) & 0xffffffff  
  67.             z = v[p]  
  68.         y = v[0]  
  69.         v[n] = (v[n] + ((z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (k[n & 3 ^ e] ^ z))) & 0xffffffff  
  70.         z = v[n]  
  71.         q -= 1  
  72.     return _long2str(v, False)  
  73.   
  74. def decrypt(str, key):  
  75.     if str == ''return str  
  76.     v = _str2long(str, False)  
  77.     k = _str2long(key.ljust(16"\0"), False)  
  78.     n = len(v) - 1  
  79.     z = v[n]  
  80.     y = v[0]  
  81.     q = 6 + 52 // (n + 1)  
  82.     sum = (q * _DELTA) & 0xffffffff  
  83.     while (sum != 0):  
  84.         e = sum >> 2 & 3  
  85.         for p in xrange(n, 0, -1):  
  86.             z = v[p - 1]  
  87.             v[p] = (v[p] - ((z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z))) & 0xffffffff  
  88.             y = v[p]  
  89.         z = v[n]  
  90.         v[0] = (v[0] - ((z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (k[0 & 3 ^ e] ^ z))) & 0xffffffff  
  91.         y = v[0]  
  92.         sum = (sum - _DELTA) & 0xffffffff  
  93.     return _long2str(v, True)  
  94.   
  95. if __name__ == "__main__":  
  96.     print decrypt(encrypt('Hello XXTEA!''16bytelongstring'), '16bytelongstring')  

 

» 阅读全文

8月
20

XXTEA for Ruby

Ruby代码
  1. ############################################################  
  2. #                                                          #  
  3. # The implementation of PHPRPC Protocol 3.0                #  
  4. #                                                          #  
  5. # xxtea.rb                                                 #  
  6. #                                                          #  
  7. # Release 3.0.0                                            #  
  8. # Copyright (c) 2005-2008 by Team-PHPRPC                   #  
  9. #                                                          #  
  10. # WebSite:  http://www.phprpc.org/                         #  
  11. #           http://www.phprpc.net/                         #  
  12. #           http://www.phprpc.com/                         #  
  13. #           http://sourceforge.net/projects/php-rpc/       #  
  14. #                                                          #  
  15. # Authors:  Ma Bingyao <andot@ujn.edu.cn>                  #  
  16. #                                                          #  
  17. # This file may be distributed and/or modified under the   #  
  18. # terms of the GNU Lesser General Public License (LGPL)    #  
  19. # version 3.0 as published by the Free Software Foundation #  
  20. # and appearing in the included file LICENSE.              #  
  21. #                                                          #  
  22. ############################################################  
  23. #  
  24. # XXTEA encryption arithmetic library.  
  25. #  
  26. # Copyright (C) 2005-2008 Ma Bingyao <andot@ujn.edu.cn>  
  27. # Version: 1.0  
  28. # LastModified: Sep 30, 2008  
  29. # This library is free.  You can redistribute it and/or modify it.  
  30.   
  31. module Crypt  
  32.   
  33.   class XXTEA  
  34.   
  35.     class << self  
  36.   
  37.       private  
  38.   
  39.       Delta = 0x9E3779B9  
  40.   
  41.       def long2str(v, w)  
  42.         n = (v.size - 1) << 2  
  43.         if w then  
  44.           m = v.last  
  45.           if (m < n - 3) or (m > n) then return '' end  
  46.           n = m  
  47.         end  
  48.         s = v.pack("V*")  
  49.         return w ? s[0, n] : s  
  50.       end  
  51.   
  52.       def str2long(s, w)  
  53.         n = s.length  
  54.         v = s.ljust((4 - (n & 3) & 3) + n, "\0").unpack("V*")  
  55.         if w then v[v.size] = n end  
  56.         return v  
  57.       end  
  58.   
  59.       public  
  60.   
  61.       def encrypt(str, key)  
  62.         if str.empty? then return str end  
  63.         v = str2long(str, true)  
  64.         k = str2long(key.ljust(16, "\0"), false)  
  65.         n = v.size - 1  
  66.         z = v[n]  
  67.         y = v[0]  
  68.         sum = 0  
  69.         (6 + 52 / (n + 1)).downto(1) { |q|  
  70.           sum = (sum + Delta) & 0xffffffff  
  71.           e = sum >> 2 & 3  
  72.           for p in (0...n)  
  73.             y = v[p + 1]  
  74.             z = v[p] = (v[p] +  ((z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z))) & 0xffffffff  
  75.           end  
  76.           y = v[0]  
  77.           z = v[n] = (v[n] +  ((z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (k[n & 3 ^ e] ^ z))) & 0xffffffff  
  78.         }  
  79.         long2str(v, false)  
  80.       end  
  81.   
  82.       def decrypt(str, key)  
  83.         if str.empty? then return str end  
  84.         v = str2long(str, false)  
  85.         k = str2long(key.ljust(16, "\0"), false)  
  86.         n = v.size - 1  
  87.         z = v[n]  
  88.         y = v[0]  
  89.         q = 6 + 52 / (n + 1)  
  90.         sum = (q * Delta) & 0xffffffff  
  91.         while (sum != 0)  
  92.           e = sum >> 2 & 3  
  93.           n.downto(1) { |p|  
  94.             z = v[p - 1]  
  95.             y = v[p] = (v[p] -  ((z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z))) & 0xffffffff  
  96.           }  
  97.           z = v[n]  
  98.           y = v[0] = (v[0] -  ((z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (k[0 & 3 ^ e] ^ z))) & 0xffffffff  
  99.           sum = (sum - Delta) & 0xffffffff  
  100.         end  
  101.         long2str(v, true)  
  102.       end  
  103.   
  104.     end  
  105.   
  106.   end  
  107.   
  108. end  

 

» 阅读全文

12月
05

XXTEA for Delphi

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

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

» 阅读全文

11月
08

XXTEA for Perl

今天开始写 PHPRPC for Perl 了,PHP 序列化反序列化(虽然不算完美,不过可以先凑合用),大数运算,Base64 编码,HTTP 通讯管理的 Perl 包都有现成的,就差一个 XXTEA 算法没有,今天就写了一个,跟本站其它语言(如 PHP、JavaScript、C#、Java、ActionScript 等)实现的 XXTEA 算法兼容,用法也很简单,下面是它的代码,等 PAUSE 的帐号申请下来,就提交到 CPAN 上去,PAUSE 审核一个帐号竟然需要 3 个星期,办事效率快赶上我们的公务员了,呵呵。

感谢小西同学帮我校对注释!

» 阅读全文

10月
26

XXTEA for ActionScript 3.0

XXTEA for ActionScript 2.0 的代码在 PHPRPC Client for ActionScript 2.0 中已经包含了,下面是 for ActionScript 3.0 的代码,与 for ActionScript 2.0 相比,3.0 版本加密、解密的内容和密钥都是 ByteArray 类型的数据,这样做不但速度得到的大幅的提升,并且彻底解决了 ActionScript 2.0 版本中对于包含特殊字符串加密解密不正确的问题。

» 阅读全文