[英]How do I make AES 256-bit, ECB mode, PKCS5 Padding encryption works between Java and PHP?
我有一個Java程序,可以使用帶有256位密鑰的AES/ECB/PKCS5Padding
密碼進行加密,並且我想編寫一個產生相同結果的PHP腳本。
但是,我的腳本未能這樣做。 我有點感覺到他們在加密之前如何處理密鑰是問題,但是我無法確定。
有人可以指出PHP腳本出了什么問題嗎?
謝謝。
以下是示例代碼,您可以在復制和粘貼后直接運行它:
爪哇
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import javax.xml.bind.DatatypeConverter;
import java.security.MessageDigest;
public class JavaCipher {
private SecretKeySpec secretKey;
private JavaCipher(String secret) throws Exception {
MessageDigest sha = MessageDigest.getInstance("SHA-256");
byte[] digest = sha.digest(secret.getBytes("UTF-8"));
secretKey = new SecretKeySpec(digest, "AES");
}
private String encrypt(String sSrc) throws Exception {
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] encrypted = cipher.doFinal(sSrc.getBytes());
return DatatypeConverter.printHexBinary(encrypted).toLowerCase();
}
public static void main(String[] args) throws Exception {
JavaCipher cipher = new JavaCipher("some random key");
// print d013acccb5d191a00898ac87057383ff
System.out.println(cipher.encrypt("abcdefg"));
}
}
的PHP
<?php
class PHPCipher {
private $key;
public function __construct($key)
{
$this->key = substr(hash('sha256', $key), 0, 32);
}
public function encrypt($data)
{
$size = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
$td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_ECB, '');
$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
mcrypt_generic_init($td, $this->key, $iv);
$result = mcrypt_generic($td, $this->pad($data, $size));
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
return bin2hex($result);
}
private function pad($text, $blocksize)
{
$pad = $blocksize - (strlen($text) % $blocksize);
return $text . str_repeat(chr($pad), $pad);
}
}
$cipher = new PHPCipher('some random key');
// print 9a4df66d67a3e8d4a1dda7cda6e94d07
echo $cipher->encrypt('abcdefg');
由於我需要密鑰大小為256位的AES,因此我所要做的就是提供32個字節的密鑰。
而不是將字符串切成32個字符(這會更改密鑰):
$this->key = substr(hash('sha256', $key), 0, 32);
我應該將其打包成二進制字符串
$this->key = pack('H*', hash('sha256', $key));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.