做对接的时候,服务商做的aes加密通过sha1prng算法(只要password一样,每次生成的数组都是一样的,所以可以用来做加密解密的key)进行了又一次加密,搞了好几个小时,直接看对应的代码吧,可以参考一下,只有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;
}
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;
}
以上就是php中关于aes加密对应java中的sha1prng方式加密的实例详解的详细内容。
