Crypton.pm
上传用户:market2
上传日期:2018-11-18
资源大小:18786k
文件大小:9k
源码类别:

外挂编程

开发平台:

Windows_Unix

  1. #  OpenKore - Crypton encryption algorithm implementation.
  2. #
  3. #  Copyright (c) 2005 OpenKore Development Team
  4. #
  5. #  This software is open source, licensed under the GNU General Public
  6. #  License, version 2.
  7. #  Basically, this means that you're allowed to modify and distribute
  8. #  this software. However, if you distribute modified versions, you MUST
  9. #  also distribute the source code.
  10. #  See http://www.gnu.org/licenses/gpl.html for the full license.
  11. #########################################################################
  12. ##
  13. # MODULE DESCRIPTION: Crypton encryption algorithm implementation.
  14. #
  15. # This is a Perl implementation of the Crypton encryption algorithm.
  16. # The original C implementation is copyrighted by Dr Brian Gladman.
  17. # The implementation was ported to Perl by "Harry".
  18. # Algorithm information can be found here:
  19. # http://cnscenter.future.co.kr/main/research/crypton.html
  20. package Utils::Crypton;
  21. use strict;
  22. our (@s_box, @s_tab);
  23. our $table_generated;
  24. sub new {
  25. my ($class, $key, $key_len) = @_;
  26. my %h;
  27. my %self;
  28. if (!$table_generated) {
  29. generate_table();
  30. $table_generated = 1;
  31. }
  32. $self{e_key} = [];
  33. set_key($key, $key_len, $self{e_key});
  34. return bless %self, $class;
  35. }
  36. sub encrypt {
  37. my ($self, $block) = @_;
  38. my (@b0, @b1);
  39. @b1 = unpack("V4", $block);
  40. $b0[0] = $b1[0] ^ $self->{e_key}[0];
  41. $b0[1] = $b1[1] ^ $self->{e_key}[1];
  42. $b0[2] = $b1[2] ^ $self->{e_key}[2];
  43. $b0[3] = $b1[3] ^ $self->{e_key}[3];
  44. f0_rnd($self->{e_key},  4 ,@b0, @b1);
  45. f1_rnd($self->{e_key},  8 ,@b0, @b1);
  46. f0_rnd($self->{e_key}, 12 ,@b0, @b1);
  47. f1_rnd($self->{e_key}, 16 ,@b0, @b1);
  48. f0_rnd($self->{e_key}, 20 ,@b0, @b1);
  49. f1_rnd($self->{e_key}, 24 ,@b0, @b1);
  50. f0_rnd($self->{e_key}, 28 ,@b0, @b1);
  51. f1_rnd($self->{e_key}, 32 ,@b0, @b1);
  52. f0_rnd($self->{e_key}, 36 ,@b0, @b1);
  53. f1_rnd($self->{e_key}, 40 ,@b0, @b1);
  54. f0_rnd($self->{e_key}, 44 ,@b0, @b1);
  55. $b0[0] = gamma_tau(@b1, 0, 1, 0) ^ $self->{e_key}[48]; 
  56. $b0[1] = gamma_tau(@b1, 1, 0, 1) ^ $self->{e_key}[49];
  57. $b0[2] = gamma_tau(@b1, 2, 1, 0) ^ $self->{e_key}[50]; 
  58. $b0[3] = gamma_tau(@b1, 3, 0, 1) ^ $self->{e_key}[51];
  59. return pack("V4", @b0);
  60. }
  61. ################################################################################
  62. sub byte {
  63. my ($data, $byte) = @_;
  64. $data = ($data >>  (8 * $byte)) if ($byte > 0 || $byte < 4);
  65. return $data & 0xff;
  66. }
  67. sub gamma_tau {
  68. my ($r_b, $m, $p, $q) = @_;
  69. return     $s_box[$p][byte($r_b->[0], $m)]
  70. | ($s_box[$q][byte($r_b->[1], $m)] <<  8)
  71. | ($s_box[$p][byte($r_b->[2], $m)] << 16)
  72. | ($s_box[$q][byte($r_b->[3], $m)] << 24);
  73. }
  74. sub rotl {
  75. my ($x, $bit) = @_;
  76. $x = ($x << $bit) | ($x >> (32 - $bit)) if ($bit > 0 && $bit < 32);
  77. return $x;
  78. }
  79. sub pi {
  80. my ($r_b, $pos_b, $n0, $n1, $n2, $n3) = @_;
  81. my @ma = (0x3fcff3fc, 0xfc3fcff3, 0xf3fc3fcf, 0xcff3fc3f);
  82. return    ($$r_b[$pos_b + 0] & $ma[$n0])
  83. ^ ($$r_b[$pos_b + 1] & $ma[$n1])
  84. ^ ($$r_b[$pos_b + 2] & $ma[$n2])
  85. ^ ($$r_b[$pos_b + 3] & $ma[$n3]);
  86. }
  87. sub phi_n {
  88. my ($x, $n0, $n1, $n2, $n3) = @_;
  89. my @mb = (0xcffccffc, 0xf33ff33f, 0xfccffccf, 0x3ff33ff3);
  90. return    (     $x      & $mb[$n0])
  91. ^ (rotl($x,  8) & $mb[$n1])
  92. ^ (rotl($x, 16) & $mb[$n2])
  93. ^ (rotl($x, 24) & $mb[$n3]);
  94. }
  95. sub generate_table {
  96. my ($i, $xl, $xr, $yl, $yr);
  97. my @p_box = (
  98. [ 15,  9,  6,  8,  9,  9,  4, 12,  6,  2,  6, 10,  1,  3,  5, 15 ],
  99. [ 10, 15,  4,  7,  5,  2, 14,  6,  9,  3, 12,  8, 13,  1, 11,  0 ],
  100. [  0,  4,  8,  4,  2, 15,  8, 13,  1,  1, 15,  7,  2, 11, 14, 15 ]
  101. );
  102. for ($i = 0; $i < 256; $i++) {
  103. $xl = ($i >> 4) & 0x0f;
  104. $xr = $i & 0x0f;
  105. $yr = $xr ^ $p_box[1][$xl ^ $p_box[0][$xr]];
  106. $yl = $xl ^ $p_box[0][$xr] ^ $p_box[2][$yr];
  107. $yr |= ($yl << 4);
  108. $s_box[0][ $i] = $yr;
  109. $s_box[1][$yr] =  $i;
  110. $xr = $yr * 0x01010101;
  111. $xl =  $i * 0x01010101;
  112. $s_tab[0][ $i] = $xr & 0x3fcff3fc;
  113. $s_tab[1][$yr] = $xl & 0xfc3fcff3;
  114. $s_tab[2][ $i] = $xr & 0xf3fc3fcf;
  115. $s_tab[3][$yr] = $xl & 0xcff3fc3f;
  116. }
  117. }
  118. sub h0_block {
  119. my ($r_e_key, $n, $r0, $r1, $rc) = @_;
  120. $r_e_key->[4 * $n +  8] =  rotl($r_e_key->[4 * $n + 0], $r0);
  121. $r_e_key->[4 * $n +  9] = $rc ^ $r_e_key->[4 * $n + 1];
  122. $r_e_key->[4 * $n + 10] =  rotl($r_e_key->[4 * $n + 2], $r1);
  123. $r_e_key->[4 * $n + 11] = $rc ^ $r_e_key->[4 * $n + 3];
  124. }
  125. sub h1_block {
  126. my ($r_e_key, $n, $r0, $r1, $rc) = @_;
  127. $r_e_key->[4 * $n +  8] = $rc ^ $r_e_key->[4 * $n + 0];
  128. $r_e_key->[4 * $n +  9] =  rotl($r_e_key->[4 * $n + 1], $r0);
  129. $r_e_key->[4 * $n + 10] = $rc ^ $r_e_key->[4 * $n + 2];
  130. $r_e_key->[4 * $n + 11] =  rotl($r_e_key->[4 * $n + 3], $r1);
  131. }
  132. sub set_key {
  133. my ($in_key, $key_len, $r_e_key) = @_;
  134. my @kp = (0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f);
  135. my @kq = (0x9b05688c, 0x1f83d9ab, 0x5be0cd19, 0xcbbb9d5d);
  136. my ($i, $t0, $t1, @tmp, @key);
  137. @key = unpack("V*", $in_key);
  138. $r_e_key->[2] = 0;
  139. $r_e_key->[3] = 0;
  140. $r_e_key->[6] = 0;
  141. $r_e_key->[7] = 0;
  142. $i = int (($key_len + 63) / 64);
  143. if ($i == 4) {
  144. $r_e_key->[3] = $key[6];
  145. $r_e_key->[7] = $key[7];
  146. $r_e_key->[2] = $key[4];
  147. $r_e_key->[6] = $key[5];
  148. $r_e_key->[0] = $key[0];
  149. $r_e_key->[4] = $key[1];
  150. $r_e_key->[1] = $key[2];
  151. $r_e_key->[5] = $key[3];
  152. } elsif ($i == 3) {
  153. $r_e_key->[2] = $key[4];
  154. $r_e_key->[6] = $key[5];
  155. $r_e_key->[0] = $key[0];
  156. $r_e_key->[4] = $key[1];
  157. $r_e_key->[1] = $key[2];
  158. $r_e_key->[5] = $key[3];
  159. } elsif ($i == 2) {
  160. $r_e_key->[0] = $key[0];
  161. $r_e_key->[4] = $key[1];
  162. $r_e_key->[1] = $key[2];
  163. $r_e_key->[5] = $key[3];
  164. }
  165. $tmp[0] = pi($r_e_key, 0, 0, 1, 2, 3) ^ $kp[0];
  166. $tmp[1] = pi($r_e_key, 0, 1, 2, 3, 0) ^ $kp[1];
  167. $tmp[2] = pi($r_e_key, 0, 2, 3, 0, 1) ^ $kp[2];
  168. $tmp[3] = pi($r_e_key, 0, 3, 0, 1, 2) ^ $kp[3];
  169. $r_e_key->[0] = gamma_tau(@tmp, 0, 0, 1); 
  170. $r_e_key->[1] = gamma_tau(@tmp, 1, 1, 0);
  171. $r_e_key->[2] = gamma_tau(@tmp, 2, 0, 1); 
  172. $r_e_key->[3] = gamma_tau(@tmp, 3, 1, 0);
  173. $tmp[0] = pi($r_e_key, 4, 1, 2, 3, 0) ^ $kq[0]; 
  174. $tmp[1] = pi($r_e_key, 4, 2, 3, 0, 1) ^ $kq[1];
  175. $tmp[2] = pi($r_e_key, 4, 3, 0, 1, 2) ^ $kq[2]; 
  176. $tmp[3] = pi($r_e_key, 4, 0, 1, 2, 3) ^ $kq[3];
  177. $r_e_key->[4] = gamma_tau(@tmp, 0, 1, 0); 
  178. $r_e_key->[5] = gamma_tau(@tmp, 1, 0, 1);
  179. $r_e_key->[6] = gamma_tau(@tmp, 2, 1, 0); 
  180. $r_e_key->[7] = gamma_tau(@tmp, 3, 0, 1);
  181. $t0 = $r_e_key->[0] ^ $r_e_key->[1] ^ $r_e_key->[2] ^ $r_e_key->[3];
  182. $t1 = $r_e_key->[4] ^ $r_e_key->[5] ^ $r_e_key->[6] ^ $r_e_key->[7];
  183. $r_e_key->[0] ^= $t1;
  184. $r_e_key->[1] ^= $t1;
  185. $r_e_key->[2] ^= $t1;
  186. $r_e_key->[3] ^= $t1;
  187. $r_e_key->[4] ^= $t0;
  188. $r_e_key->[5] ^= $t0;
  189. $r_e_key->[6] ^= $t0;
  190. $r_e_key->[7] ^= $t0;
  191. h0_block($r_e_key,  0,  8, 16, 0x01010101);
  192. h1_block($r_e_key,  1, 16, 24, 0x01010101);
  193. h1_block($r_e_key,  2, 24,  8, 0x02020202);
  194. h0_block($r_e_key,  3,  8, 16, 0x02020202);
  195. h0_block($r_e_key,  4, 16, 24, 0x04040404);
  196. h1_block($r_e_key,  5, 24,  8, 0x04040404);
  197. h1_block($r_e_key,  6,  8, 16, 0x08080808);
  198. h0_block($r_e_key,  7, 16, 24, 0x08080808);
  199. h0_block($r_e_key,  8, 24,  8, 0x10101010);
  200. h1_block($r_e_key,  9,  8, 16, 0x10101010);
  201. h1_block($r_e_key, 10, 16, 24, 0x20202020);
  202. $r_e_key->[48] = phi_n($r_e_key->[48], 3, 0, 1, 2);
  203. $r_e_key->[49] = phi_n($r_e_key->[49], 2, 3, 0, 1);
  204. $r_e_key->[50] = phi_n($r_e_key->[50], 1, 2, 3, 0);
  205. $r_e_key->[51] = phi_n($r_e_key->[51], 0, 1, 2, 3);
  206. }
  207. sub f0_rnd {
  208. my ($r_kp, $pos_kp, $r_b0, $r_b1) = @_;
  209. $r_b1->[0] = $s_tab[0][byte($r_b0->[0], 0)]
  210.    ^ $s_tab[1][byte($r_b0->[1], 0)]
  211.    ^ $s_tab[2][byte($r_b0->[2], 0)]
  212.    ^ $s_tab[3][byte($r_b0->[3], 0)]
  213.    ^ $r_kp->[$pos_kp + 0];
  214. $r_b1->[1] = $s_tab[1][byte($r_b0->[0], 1)]
  215.    ^ $s_tab[2][byte($r_b0->[1], 1)]
  216.    ^ $s_tab[3][byte($r_b0->[2], 1)]
  217.    ^ $s_tab[0][byte($r_b0->[3], 1)]
  218.    ^ $r_kp->[$pos_kp + 1];
  219. $r_b1->[2] = $s_tab[2][byte($r_b0->[0], 2)]
  220.    ^ $s_tab[3][byte($r_b0->[1], 2)]
  221.    ^ $s_tab[0][byte($r_b0->[2], 2)]
  222.    ^ $s_tab[1][byte($r_b0->[3], 2)]
  223.    ^ $r_kp->[$pos_kp + 2];
  224. $r_b1->[3] = $s_tab[3][byte($r_b0->[0], 3)]
  225.    ^ $s_tab[0][byte($r_b0->[1], 3)]
  226.    ^ $s_tab[1][byte($r_b0->[2], 3)]
  227.    ^ $s_tab[2][byte($r_b0->[3], 3)]
  228.    ^ $r_kp->[$pos_kp + 3];
  229. }
  230. sub f1_rnd {
  231. my ($r_kp, $pos_kp, $r_b0, $r_b1) = @_;
  232. $r_b0->[0] = $s_tab[1][byte($r_b1->[0], 0)]
  233.    ^ $s_tab[2][byte($r_b1->[1], 0)]
  234.    ^ $s_tab[3][byte($r_b1->[2], 0)]
  235.    ^ $s_tab[0][byte($r_b1->[3], 0)]
  236.    ^ $r_kp->[$pos_kp + 0];
  237. $r_b0->[1] = $s_tab[2][byte($r_b1->[0], 1)]
  238.    ^ $s_tab[3][byte($r_b1->[1], 1)]
  239.    ^ $s_tab[0][byte($r_b1->[2], 1)]
  240.    ^ $s_tab[1][byte($r_b1->[3], 1)]
  241.    ^ $r_kp->[$pos_kp + 1];
  242. $r_b0->[2] = $s_tab[3][byte($r_b1->[0], 2)]
  243.    ^ $s_tab[0][byte($r_b1->[1], 2)]
  244.    ^ $s_tab[1][byte($r_b1->[2], 2)]
  245.    ^ $s_tab[2][byte($r_b1->[3], 2)]
  246.    ^ $r_kp->[$pos_kp + 2];
  247. $r_b0->[3] = $s_tab[0][byte($r_b1->[0], 3)]
  248.    ^ $s_tab[1][byte($r_b1->[1], 3)]
  249.    ^ $s_tab[2][byte($r_b1->[2], 3)]
  250.    ^ $s_tab[3][byte($r_b1->[3], 3)]
  251.    ^ $r_kp->[$pos_kp + 3];
  252. }
  253. 1;