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  

 

标签: Ruby, Cryptology

« 上一篇 | 下一篇 »

只显示10条记录相关文章

发表评论

评论 (必须):