请选择 进入手机版 | 继续访问电脑版

无忧编程_ASP.NET  / C# / PHP 程序员的软件世界

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 845|回复: 0

php中关于AES加密对应Java中的SHA1PRNG方式加密的实例详解

[复制链接]

403

主题

436

帖子

1807

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1807
发表于 2019-3-23 11:44:20 | 显示全部楼层 |阅读模式
php中关于AES加密对应Java中的SHA1PRNG方式加密的实例详解:
做对接的时候,服务商做的AES加密通过SHA1PRNG算法(只要password一样,每次生成的数组都是一样的,所以可以用来做加密解密的key)进行了又一次加密,搞了好几个小时,直接看对应的代码吧,可以参考一下,只有Java的加密源码
[Java] 纯文本查看 复制代码
private static byte[] encrypt(byte[] byteContent, byte[] password) throws Exception
  {
    KeyGenerator kgen = KeyGenerator.getInstance("AES");
    SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
    secureRandom.setSeed(password);
    kgen.init(128, secureRandom);
    SecretKey secretKey = kgen.generateKey();    byte[] enCodeFormat = secretKey.getEncoded();
    SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
    Cipher cipher = Cipher.getInstance("AES");
    cipher.init(1, key);    byte[] result = cipher.doFinal(byteContent);    return result;
  }


以下是PHP对应的AES加密解密代码:
[PHP] 纯文本查看 复制代码
private function _pkcs5Pad($text, $blockSize)
  {
      $pad = $blockSize - (strlen($text) % $blockSize);
      return $text . str_repeat(chr($pad), $pad);
  }
 
  private function _pkcs5Unpad($text)
  {
      $end = substr($text, -1);
      $last = ord($end);
      $len = strlen($text) - $last;
      if(substr($text, $len) == str_repeat($end, $last))
      {
          return substr($text, 0, $len);
      }
      return false;
  }
 
  public function encrypt($encrypt, $key)
  {
      $blockSize = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
      $paddedData = $this->_pkcs5Pad($encrypt, $blockSize);
      $ivSize = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
      $iv = mcrypt_create_iv($ivSize, MCRYPT_RAND);
      $key2 = substr(openssl_digest(openssl_digest($key, 'sha1', true), 'sha1', true), 0, 16);
      $encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key2, $paddedData, MCRYPT_MODE_ECB, $iv);
      return base64_encode($encrypted);
  }
 
  public function decrypt($decrypt, $key)
  {
      $decoded = $this->hex2bin($decrypt);
      $blockSize = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
      $iv = mcrypt_create_iv($blockSize, MCRYPT_RAND);
      $decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $decoded, MCRYPT_MODE_ECB, $iv);
      return $this->_pkcs5Unpad($decrypted);
  }
 
  function hex2bin($str)
  {
      $sbin = "";
      $len = strlen($str);
      for($i = 0; $i < $len; $i += 2)
      {
          $sbin .= pack("H*", substr($str, $i, 2));
      }
 
      return $sbin;
  }

参考资料:http://www.php.cn/php-weizijiaocheng-375672.html
windows .net(C#+MSSQL) linux(php+mysql)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|软件编程 ( 鄂ICP备11006601号鄂公网安备 42011102001337号 |

GMT+8, 2019-4-22 17:15 , Processed in 0.127818 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表