XXTEA for Perl

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

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

Perl代码
 
  1. #/**********************************************************\  
  2. #|                                                          |  
  3. #| The implementation of PHPRPC Protocol 3.0                |  
  4. #|                                                          |  
  5. #| xxtea.pm                                                 |  
  6. #|                                                          |  
  7. #| Release 3.0.0 beta                                       |  
  8. #| Copyright (c) 2005-2007 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. #| Author:   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 module.  
  25. #  
  26. # Copyright (C) 2006-2007 Ma Bingyao <andot@ujn.edu.cn>  
  27. # Version:      1.00  
  28. # LastModified: Nov 7, 2007  
  29. # This library is free.  You can redistribute it and/or modify it.  
  30. #  
  31.   
  32. package Crypt::XXTEA;  
  33.   
  34. use bytes;  
  35. use integer;  
  36. use strict;  
  37.   
  38. use Exporter;  
  39. use vars qw($VERSION @ISA @EXPORT);  
  40.   
  41. $VERSION     = 1.00;  
  42. @ISA         = qw(Exporter);  
  43. @EXPORT      = qw(xxtea_encrypt xxtea_decrypt);  
  44.   
  45. *encrypt = \&xxtea_encrypt;  
  46. *decrypt = \&xxtea_decrypt;  
  47.   
  48. sub _long2str {  
  49.     my ($v$w) = @_;  
  50.     my $len = @{$v};  
  51.     my $n = ($len - 1) << 2;  
  52.     if ($w) {  
  53.         my $m = $v->[$len - 1];  
  54.         if (($m < $n - 3) || ($m > $n)) {  
  55.             return 0;  
  56.         }  
  57.         $n = $m;  
  58.     }  
  59.     my @s = ();  
  60.     for (my $i = 0; $i < $len$i++) {  
  61.         $s[$i] = pack("V"$v->[$i]);  
  62.     }  
  63.     if ($w) {  
  64.         return substr(join(''@s), 0, $n);  
  65.     }  
  66.     else {  
  67.         return join(''@s);  
  68.     }  
  69. }  
  70.   
  71. sub _str2long {  
  72.     my ($s$w) = @_;  
  73.     my @v = unpack("V*"$s"\0"x((4 - length($s) % 4) & 3));  
  74.     if ($w) {  
  75.         $v[@v] = length($s);  
  76.     }  
  77.     return @v;  
  78. }  
  79.   
  80. sub xxtea_encrypt {  
  81.     my ($s$k) = @_;  
  82.     if ($s eq "") {  
  83.         return "";  
  84.     }  
  85.     my @v = _str2long($s, 1);  
  86.     my @k = _str2long($k, 0);  
  87.     if (@k < 4) {  
  88.         for (my $i = @k$i < 4; $i++) {  
  89.             $k[$i] = 0;  
  90.         }  
  91.     }  
  92.     my $n = $#v;  
  93.     my $z = $v[$n];  
  94.     my $y = $v[0];  
  95.     my $delta = 0x9E3779B9;  
  96.     my $q = 6 + 52 / ($n + 1);  
  97.     my $sum = 0;  
  98.     my $e;  
  99.     my $p;  
  100.     my $mx;  
  101.     while (0 < $q--) {  
  102.         $sum = ($sum + $delta) & 0xffffffff;  
  103.         $e = $sum >> 2 & 3;  
  104.         for ($p = 0; $p < $n$p++) {  
  105.             $y = $v[$p + 1];  
  106.             $mx = ((($z >> 5 & 0x07ffffff) ^ $y << 2) + (($y >> 3 & 0x1fffffff) ^ $z << 4)) ^ (($sum ^ $y) + ($k[$p & 3 ^ $e] ^ $z)) & 0xffffffff;  
  107.             $z = $v[$p] = ($v[$p] + $mx) & 0xffffffff;  
  108.         }  
  109.         $y = $v[0];  
  110.         $mx = ((($z >> 5 & 0x07ffffff) ^ $y << 2) + (($y >> 3 & 0x1fffffff) ^ $z << 4)) ^ (($sum ^ $y) + ($k[$p & 3 ^ $e] ^ $z)) & 0xffffffff;  
  111.         $z = $v[$n] = ($v[$n] + $mx) & 0xffffffff;  
  112.     }  
  113.     return _long2str(\@v, 0);  
  114. }  
  115.   
  116. sub xxtea_decrypt {  
  117.     my ($s$k) = @_;  
  118.     if ($s eq "") {  
  119.         return "";  
  120.     }  
  121.     my @v = _str2long($s, 0);  
  122.     my @k = _str2long($k, 0);  
  123.     if (@k < 4) {  
  124.         for (my $i = @k$i < 4; $i++) {  
  125.                 $k[$i] = 0;  
  126.         }  
  127.     }  
  128.     my $n = $#v;  
  129.     my $z = $v[$n];  
  130.     my $y = $v[0];  
  131.     my $delta = 0x9E3779B9;  
  132.     my $q = 6 + 52 / ($n + 1);  
  133.     my $sum = ($q * $delta) & 0xffffffff;  
  134.     my $e;  
  135.     my $p;  
  136.     my $mx;  
  137.     while ($sum != 0) {  
  138.         $e = $sum >> 2 & 3;  
  139.         for ($p = $n$p > 0; $p--) {  
  140.             $z = $v[$p - 1];  
  141.             $mx = ((($z >> 5 & 0x07ffffff) ^ $y << 2) + (($y >> 3 & 0x1fffffff) ^ $z << 4)) ^ (($sum ^ $y) + ($k[$p & 3 ^ $e] ^ $z)) & 0xffffffff;  
  142.             $y = $v[$p] = ($v[$p] - $mx) & 0xffffffff;  
  143.         }  
  144.         $z = $v[$n];  
  145.         $mx = ((($z >> 5 & 0x07ffffff) ^ $y << 2) + (($y >> 3 & 0x1fffffff) ^ $z << 4)) ^ (($sum ^ $y) + ($k[$p & 3 ^ $e] ^ $z)) & 0xffffffff;  
  146.         $y = $v[0] = ($v[0] - $mx) & 0xffffffff;  
  147.         $sum = ($sum - $delta) & 0xffffffff;  
  148.     }  
  149.     return _long2str(\@v, 1);  
  150. }  
  151.   
  152. 1;  
  153.   
  154. __END__  
  155.   
  156. =head1 NAME  
  157.   
  158. Crypt::XXTEA - XXTEA encryption arithmetic module.  
  159.   
  160. =head1 SYNOPSIS  
  161.   
  162.     use Crypt::XXTEA;  
  163.   
  164. =head1 DESCRIPTION  
  165.   
  166. XXTEA is a secure and fast encryption algorithm. It's suitable for web development. This module allows you to encrypt or decrypt a string using the algorithm.   
  167.   
  168. =head1 FUNCTIONS  
  169.   
  170. =over 4  
  171.   
  172. =item xxtea_encrypt  
  173.   
  174.     my $ciphertext = xxtea_encrypt($plaintext$key);  
  175.   
  176. This function encrypts $plaintext using $key and returns the $ciphertext.  
  177.   
  178. =item encrypt  
  179.   
  180.     my $ciphertext = Crypt::XXTEA::encrypt($plaintext$key);  
  181.      
  182. This function is the same as xxtea_encrypt.  
  183.   
  184. =item xxtea_decrypt  
  185.   
  186.     my $plaintext = xxtea_decrypt($ciphertext$key);  
  187.   
  188. This function decrypts $ciphertext using $key and returns the $plaintext.  
  189.   
  190. =item decrypt  
  191.   
  192.     my $plaintext = Crypt::XXTEA::decrypt($ciphertext$key);  
  193.   
  194. This function is the same as xxtea_decrypt.  
  195.   
  196. =back  
  197.   
  198. =head1 EXAMPLE  
  199.   
  200.     use Crypt::XXTEA;  
  201.     my $ciphertext = xxtea_encrypt("Hello XXTEA.""1234567890abcdef");  
  202.     my $plaintext = xxtea_decrypt($ciphertext"1234567890abcdef");  
  203.     print $plaintext;  
  204.   
  205.     $ciphertext = Crypt::XXTEA::encrypt("Hi XXTEA.""1234567890abcdef");  
  206.     $plaintext = Crypt::XXTEA::decrypt($ciphertext"1234567890abcdef");  
  207.     print $plaintext;  
  208.   
  209. =head1 NOTES  
  210.   
  211. If $plaintext is equal to "", it returns "".  
  212.   
  213. It returns 0 when fails to decrypt.  
  214.   
  215. Only the first 16 bytes of $key is used. if $key is shorter than 16 bytes, it will be padding \0.  
  216.   
  217. The XXTEA algorithm is stronger and faster than Crypt::DES, Crypt::Blowfish & Crypt::IDEA.  
  218.   
  219. =head1 SEE ALSO  
  220.   
  221. Crypt::DES  
  222. Crypt::Blowfish  
  223. Crypt::IDEA  
  224.   
  225. =head1 COPYRIGHT  
  226.   
  227. The implementation of the XXTEA algorithm was developed by,  
  228. and is copyright of, Ma Bingyao (andot@ujn.edu.cn).  
  229.   
  230. =cut  

标签: Cryptology, Perl

« 上一篇 | 下一篇 »

只显示10条记录相关文章

发表评论

评论 (必须):