test.cbc.php 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  1. <?
  2. include_once($_SERVER['DOCUMENT_ROOT']."/common/lib/KISA_SEED_CBC.php");
  3. function hexToStr($hex){
  4. $string='';
  5. for ($i=0; $i < strlen($hex)-1; $i+=2){
  6. $string .= chr(hexdec($hex[$i].$hex[$i+1]));
  7. }
  8. return $string;
  9. }
  10. // echo hexToStr('39,f8,4d,2a,b0,0c,90,5e,d4,ec,ef,c7,2a,75,80,eb');
  11. // exit;
  12. echo implode(unpack("C*", "32,31,EB,91,90,34,39,31,36"));
  13. exit;
  14. $g_bszUser_key = null;
  15. if(isset($_POST['KEY']))
  16. $g_bszUser_key = $_POST['KEY'];
  17. if($g_bszUser_key == null)
  18. {
  19. $g_bszUser_key = "ab,c1,23,ab,c1,23,ab,c1,23,aa,aa,aa,aa,aa,aa,aa";
  20. // $g_bszUser_key = "abc123abc123abc123aaaaaaaaaaaaaa";
  21. }
  22. $g_bszIV = null;
  23. if(isset($_POST['IV']))
  24. $g_bszIV = $_POST['IV'];
  25. if($g_bszIV == null)
  26. {
  27. $g_bszIV = "26,8d,66,a7,35,a8,1a,81,6f,ba,d9,fa,36,16,25,01";
  28. }
  29. function encrypt($bszIV, $bszUser_key, $str) {
  30. $planBytes = explode(",",$str);
  31. $keyBytes = explode(",",$bszUser_key);
  32. $IVBytes = explode(",",$bszIV);
  33. for($i = 0; $i < 16; $i++)
  34. {
  35. $keyBytes[$i] = hexdec($keyBytes[$i]);
  36. $IVBytes[$i] = hexdec($IVBytes[$i]);
  37. }
  38. for ($i = 0; $i < count($planBytes); $i++) {
  39. $planBytes[$i] = hexdec($planBytes[$i]);
  40. }
  41. if (count($planBytes) == 0) {
  42. return $str;
  43. }
  44. $ret = null;
  45. $bszChiperText = null;
  46. $pdwRoundKey = array_pad(array(),32,0);
  47. //방법 1
  48. $bszChiperText = KISA_SEED_CBC::SEED_CBC_Encrypt($keyBytes, $IVBytes, $planBytes, 0, count($planBytes));
  49. $r = count($bszChiperText);
  50. for($i=0;$i< $r;$i++) {
  51. $ret .= sprintf("%02X", $bszChiperText[$i]).",";
  52. }
  53. return substr($ret,0,strlen($ret)-1);
  54. /*
  55. // 방법 2
  56. $info = new KISA_SEED_INFO();
  57. $message_length = count($planBytes);
  58. KISA_SEED_CBC::SEED_CBC_init( $info, KISA_ENC_DEC::KISA_ENCRYPT, $keyBytes, $IVBytes );
  59. $process_blockLeng = 32;
  60. $outbuf = array_pad(array(), $process_blockLeng/4, 0);
  61. for($i = 0; $i < $message_length-$process_blockLeng; )
  62. {
  63. Common::arraycopy_system($planBytes, $i, $pbszPlainText, 0, $process_blockLeng);
  64. $data = KISA_SEED_CBC::chartoint32_for_SEED_CBC($pbszPlainText, $process_blockLeng);
  65. KISA_SEED_CBC::SEED_CBC_Process( $info, $data, $process_blockLeng, $outbuf, $nRetOutLeng );
  66. $cdata = KISA_SEED_CBC::int32tochar_for_SEED_CBC($outbuf, $nRetOutLeng);
  67. Common::arraycopy_system($cdata, 0, $pbszCipherText, $i, $nRetOutLeng );
  68. $i+= $nRetOutLeng;
  69. }
  70. $remainleng = $message_length%$process_blockLeng;
  71. if($remainleng==0)
  72. {
  73. $remainleng = $process_blockLeng;
  74. }
  75. Common::arraycopy_system($planBytes, $i, $pbszPlainText, 0, $remainleng);
  76. $data = KISA_SEED_CBC::chartoint32_for_SEED_CBC($pbszPlainText, $remainleng);
  77. KISA_SEED_CBC::SEED_CBC_Process( $info, $data, $remainleng, $outbuf, $nRetOutLeng );
  78. $cdata = KISA_SEED_CBC::int32tochar_for_SEED_CBC($outbuf, $nRetOutLeng);
  79. Common::arraycopy_system($cdata, 0, $pbszCipherText, $i, $nRetOutLeng );
  80. $i+= $nRetOutLeng;
  81. KISA_SEED_CBC::SEED_CBC_Close( $info, $outbuf, 0, $nPaddingLeng );
  82. $cdata = KISA_SEED_CBC::int32tochar_for_SEED_CBC($outbuf, $nPaddingLeng);
  83. Common::arraycopy_system($cdata, 0, $pbszCipherText, $i, $nPaddingLeng );
  84. $data = null;
  85. $cdata = null;
  86. $outbuf = null;
  87. for($i=0;$i< sizeof($pbszCipherText);$i++) {
  88. $ret .= sprintf("%02X", $pbszCipherText[$i]).",";
  89. }
  90. return substr($ret,0,strlen($ret)-1);
  91. */
  92. }
  93. function decrypt($bszIV, $bszUser_key, $str) {
  94. $planBytes = explode(",",$str);
  95. $keyBytes = explode(",",$bszUser_key);
  96. $IVBytes = explode(",",$bszIV);
  97. for($i = 0; $i < 16; $i++)
  98. {
  99. $keyBytes[$i] = hexdec($keyBytes[$i]);
  100. $IVBytes[$i] = hexdec($IVBytes[$i]);
  101. }
  102. for ($i = 0; $i < count($planBytes); $i++) {
  103. $planBytes[$i] = hexdec($planBytes[$i]);
  104. }
  105. if (count($planBytes) == 0) {
  106. return $str;
  107. }
  108. $pdwRoundKey = array_pad(array(),32,0);
  109. $bszPlainText = null;
  110. // 방법 1
  111. $bszPlainText = KISA_SEED_CBC::SEED_CBC_Decrypt($keyBytes, $IVBytes, $planBytes, 0, count($planBytes));
  112. for($i=0;$i< sizeof($bszPlainText);$i++) {
  113. $planBytresMessage .= sprintf("%02X", $bszPlainText[$i]).",";
  114. }
  115. return substr($planBytresMessage,0,strlen($planBytresMessage)-1);
  116. /*
  117. // 방법 2
  118. $info = new KISA_SEED_INFO();
  119. $nCipherTextLen = count($pbszCipherText);
  120. $EncryptedMessage_length = count($planBytes);
  121. if($EncryptedMessage_length%KISA_SEED_CBC::BLOCK_SIZE_SEED)
  122. {
  123. return "";
  124. }
  125. KISA_SEED_CBC::SEED_CBC_init( $info, KISA_ENC_DEC::KISA_DECRYPT, $keyBytes, $IVBytes );
  126. $process_blockLeng = 32;
  127. $outbuf = array_pad(array(), $process_blockLeng/4, 0);
  128. for($i = 0; $i < $EncryptedMessage_length-$process_blockLeng; )
  129. {
  130. Common::arraycopy_system($planBytes, $i, $pbszCipherText, 0, $process_blockLeng);
  131. $data = KISA_SEED_CBC::chartoint32_for_SEED_CBC($pbszCipherText,$process_blockLeng);
  132. KISA_SEED_CBC::SEED_CBC_Process( $info, $data, $process_blockLeng, $outbuf, $nRetOutLeng );
  133. $cdata = KISA_SEED_CBC::int32tochar_for_SEED_CBC( $outbuf, $nRetOutLeng );
  134. Common::arraycopy_system($cdata, 0, $pbszPlainText, $i, $nRetOutLeng );
  135. $i+= $nRetOutLeng;
  136. }
  137. $remainleng = $EncryptedMessage_length%$process_blockLeng;
  138. if($remainleng==0)
  139. {
  140. $remainleng = $process_blockLeng;
  141. }
  142. Common::arraycopy_system($planBytes, $i, $pbszCipherText, 0, $remainleng);
  143. $data = KISA_SEED_CBC::chartoint32_for_SEED_CBC($pbszCipherText,$remainleng);
  144. KISA_SEED_CBC::SEED_CBC_Process( $info, $data, $remainleng, $outbuf, $nRetOutLeng );
  145. if(KISA_SEED_CBC::SEED_CBC_Close( $info, $outbuf, $nRetOutLeng, $nPaddingLeng))
  146. {
  147. $cdata = KISA_SEED_CBC::int32tochar_for_SEED_CBC( $outbuf, $remainleng-$nPaddingLeng );
  148. Common::arraycopy_system($cdata, 0, $pbszPlainText, $i, $remainleng-$nPaddingLeng );
  149. $message_length = $i+ $remainleng -$nPaddingLeng;
  150. $result = array_pad(array(), $message_length, 0);
  151. Common::arraycopy_system($pbszPlainText, 0, $result, 0, $message_length);
  152. $data = null;
  153. $cdata = null;
  154. $outbuf = null;
  155. for($i=0;$i< sizeof($result);$i++) {
  156. $planBytresMessage .= sprintf("%02X", $result[$i]).",";
  157. }
  158. return substr($planBytresMessage,0,strlen($planBytresMessage)-1);
  159. }
  160. return "";
  161. */
  162. }
  163. $enc = null;
  164. $dec = null;
  165. if(isset($_POST['ENC']))
  166. $enc = $_POST['ENC'];
  167. if(isset($_POST['DEC']))
  168. $dec = $_POST['DEC'];
  169. if($enc==null) {
  170. $enc2 = "";
  171. } else {
  172. //암호화 시작
  173. $g_bszPlainText = $enc;
  174. $enc2 = encrypt($g_bszIV, $g_bszUser_key, $g_bszPlainText);
  175. }
  176. if($dec==null) {
  177. $dec2 = "";
  178. } else {
  179. //복호화 시작
  180. $g_bszChiperText = $dec;
  181. $dec2 = decrypt($g_bszIV, $g_bszUser_key, $g_bszChiperText);
  182. }
  183. ?>
  184. <html>
  185. <head>
  186. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  187. <title>국산암호 [SEED - CBC] 테스트 페이지</title>
  188. </head>
  189. <body>
  190. <center>
  191. <h1>국산 암호 [SEED-CBC] 테스트 페이지</h1>
  192. <form name="myform" method="post" action="./test.cbc.php">
  193. <input type="hidden" name="method" id="method" />
  194. <table border="0">
  195. <tr>
  196. <td style="text-align:center;">
  197. <form method="post" action="./test.cbc.php">
  198. <table border="0">
  199. <tr><td></td><td>&lt;암호화 예제&gt;</td></tr>
  200. <tr>
  201. <td>키(KEY) : </td>
  202. <td><textarea name="KEY" style="width:400px;height:100px;"><?=$g_bszUser_key?></textarea></td>
  203. </tr>
  204. <tr>
  205. <td>초기값(IV) : </td>
  206. <td><textarea name="IV" style="width:400px;height:100px;"><?=$g_bszIV?></textarea></td>
  207. </tr>
  208. <tr>
  209. <td>평문 : </td>
  210. <td><textarea name="ENC" style="width:400px;height:100px;"><?=$enc?></textarea></td>
  211. </tr>
  212. <tr>
  213. <td></td>
  214. <td><input type="submit" name="gogo" value="▼ 암호화"> </td>
  215. </tr>
  216. <tr>
  217. <td>암호문 : </td>
  218. <td><textarea name="ENC2" style="width:400px;height:100px;"><?=$enc2?></textarea></td>
  219. </tr>
  220. </table>
  221. </form>
  222. </td>
  223. <td style="width:1px;background-color:#aaaaff;">
  224. </td>
  225. <td style="text-align:center;">
  226. <form method="post" action="./test.cbc.php">
  227. <table border="0">
  228. <tr><td></td><td>&lt;복호화 예제&gt;</td></tr>
  229. <tr>
  230. <td>키(KEY) : </td>
  231. <td><textarea name="KEY" style="width:400px;height:100px;"><?=$g_bszUser_key?></textarea></td>
  232. </tr>
  233. <tr>
  234. <td>초기값(IV) : </td>
  235. <td><textarea name="IV" style="width:400px;height:100px;"><?=$g_bszIV?></textarea></td>
  236. </tr>
  237. <tr>
  238. <td>암호문 : </td>
  239. <td><textarea name="DEC" style="width:400px;height:100px;"><?=$dec?></textarea></td>
  240. </tr>
  241. <tr>
  242. <td></td>
  243. <td><input type="submit" name="gogo" value="▼ 복호화"></td>
  244. </tr>
  245. <tr>
  246. <td>평문 : </td>
  247. <td><textarea name="DEC2" style="width:400px;height:100px;"><?=$dec2?></textarea></td>
  248. </tr>
  249. </table>
  250. </form>
  251. </td>
  252. </tr>
  253. </table>
  254. <div style="margin-top:20px;margin-bottom:20px;"><font color="#ff0000">※ 평문 및 암호문은 Hex 값의 0x를 제외하고 콤마로 구분하여 띄어쓰기 없이 입력합니다.(ex : 00,01,0A,0B)</font></div>
  255. <div style="border: 1px solid #aaaaff; background-color:#ddddff;">
  256. <table border="0">
  257. <tr>
  258. <td>&lt;키(KEY)&gt; : </td>
  259. <td>88,E3,4F,8F,08,17,79,F1,E9,F3,94,37,0A,D4,05,89</td>
  260. </tr>
  261. <tr>
  262. <td>&lt;초기값(IV)&gt; : </td>
  263. <td>26,8D,66,A7,35,A8,1A,81,6F,BA,D9,FA,36,16,25,01</td>
  264. </tr>
  265. <tr>
  266. <td>&lt;평문&gt; : </td>
  267. <td>00,01,02,03,04,05,06,07,08,09,0A,0B,0C,0D,0E,0F</td>
  268. </tr>
  269. <tr>
  270. <td>&lt;암호문&gt; : </td>
  271. <td>75,DD,A4,B0,65,FF,86,42,7D,44,8C,54,03,D3,5A,07,D3,5A,AB,86,7C,8B,F2,55,7D,82,38,8E,A7,C0,D0,F1</td>
  272. </tr>
  273. </table>
  274. </div>
  275. </form>
  276. </center>
  277. </body>
  278. </html>