sm4.php 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. <?php
  2. require __DIR__ . '/../vendor/autoload.php';
  3. function eq($a, $b)
  4. {
  5. if ($a !== $b) {
  6. print_r([$a, '!==', $b]);
  7. throw new \Exception('error');
  8. }
  9. print_r([$a, $b, 'true']);
  10. }
  11. $data = str_repeat('阿斯顿发到付eeee', 160);
  12. $str_len = strlen($data);
  13. // md5 签名
  14. $sign = md5($data);
  15. // 加密key必须为16位
  16. $key = hex2bin(md5(1));
  17. $iv = hex2bin(md5(2));
  18. $sm4 = new \OneSm\Sm4($key);
  19. echo "\n --- ecb --- \n";
  20. // 加密ecb
  21. $d = $sm4->enDataEcb($data);
  22. // 加密后的长度和原数据长度一致
  23. eq(strlen($d), $str_len);
  24. // 解密ecb
  25. $d = $sm4->deDataEcb($d);
  26. // 解密后和原数据相等
  27. eq(md5($d), $sign);
  28. echo "\n --- cbc --- \n";
  29. // 加密cbc
  30. $d = $sm4->enDataCbc($data, $iv);
  31. // 加密后的长度和原数据长度一致
  32. eq(strlen($d), $str_len);
  33. // 解密cbc
  34. $d = $sm4->deDataCbc($d, $iv);
  35. // 解密后和原数据相等
  36. eq(md5($d), $sign);
  37. echo "\n --- ofb --- \n";
  38. // 加密ofb
  39. $d = $sm4->enDataOfb($data, $iv);
  40. // 加密后的长度和原数据长度一致
  41. eq(strlen($d), $str_len);
  42. // 解密ofb
  43. $d = $sm4->deDataOfb($d, $iv);
  44. // 解密后和原数据相等
  45. eq(md5($d), $sign);
  46. echo "\n --- cfb --- \n";
  47. // 加密cfb
  48. $d = $sm4->enDatacfb($data, $iv);
  49. // 加密后的长度和原数据长度一致
  50. eq(strlen($d), $str_len);
  51. // 解密cfb
  52. $d = $sm4->deDatacfb($d, $iv);
  53. // 解密后和原数据相等
  54. eq(md5($d), $sign);
  55. echo "\n --- ctr --- \n";
  56. // 加密ctr
  57. $d = $sm4->enDataCtr($data, $iv);
  58. // 加密后的长度和原数据长度一致
  59. eq(strlen($d), $str_len);
  60. // 解密ctr
  61. $d = $sm4->deDataCtr($d, $iv);
  62. // 解密后和原数据相等
  63. eq(md5($d), $sign);
  64. //ecb/cbc/cfb/ofb/ctr