【发布时间】:2012-01-04 05:38:48
【问题描述】:
我在使用 AES-128/ecb/PKCS5Padding+base64 加密数据时遇到问题。我正在使用以下代码来加密我的数据:
String input = "{\"action\":\"getQuestion\"}";
String key = "4288f0b8060ca1b682bf795f2617cfdc";
byte[] data = input.getBytes();
byte[] encrypted = null;
byte[] keyBytes = new BigInteger(key, 16).toByteArray();
SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, keySpec);
encrypted = cipher.doFinal(data);
System.out.println(Base64.encodeBytes(encrypted));
加密后我收到6GuKXA6FFR+yMmO8ksAEOLL5e574a5tLob7tt5IG+jk=,但我无法在服务器上使用 PHP 函数解密。
当我使用 PHP 函数加密这些数据时:
function encrypt($encrypt, $key=null)
{
$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB), MCRYPT_RAND);
$encrypted = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $encrypt, MCRYPT_MODE_ECB, $iv));
return $encrypted;
}
我收到6Wc3LPWvfJ7T86iG0igmdQaeZ8xs9qY419mAVWfNH+M=,我可以使用以下 PHP 函数成功解密:
function decrypt($decrypt, $key=null)
{
$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB), MCRYPT_RAND);
$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, base64_decode($decrypt), MCRYPT_MODE_ECB, $iv);
return $decrypted;
}
base64加解密没有问题;我只在使用 AES-128 加密时遇到此问题。
【问题讨论】:
-
您可能没有在两边使用相同的密钥。发布所有填充
$key的 PHP 代码,包括当前发布代码中的常量声明。 -
一些事情:1)删除IV,我不知道它会对PHP函数做什么,但如果它做了什么,它会搞砸加密/解密2)永远不要使用String.getBytes() 没有指定要使用的编码 3) BigInteger.toByteArray() 可能返回 1 到 17 个字节,具体取决于密钥值 4) ECB 绝对是错误的加密类型。在尝试其他任何事情之前修复这些问题。我认为您可以在与 PHP 通信并使用代码
-
@Paulo:最后一个“使用 ECB 模式”可能是一个错字,我想你会想在这里建议 CBC 模式(或任何其他提供完整性保护/身份验证的安全方案)。
-
@owlstead:啊,谢谢你的来信。这里有可怕的错字。
-
这对您当前的问题没有帮助,但是:永远不要使用 ECB 模式,直到您了解它不安全的原因。使用 CBC 模式(与消息一起传输的随机 IV),结合一些身份验证(例如 HMAC)。
标签: java php encryption aes