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')  

 

标签: Python, Cryptology

« 上一篇 | 下一篇 »

只显示10条记录相关文章

发表评论

评论 (必须):