我有这个代码来解密php(mcrypt)令牌。
问题是,解码方法总是使用Rijndael-128而不是-256。当我使用-128在php端编码时,我可以在Android中进行解码。当使用256时它不起作用。 (getHash返回SHA-256哈希键):
String key = "987654321";
SecretKeySpec keyspec = new SecretKeySpec(getHash(key), "AES");
Cipher cipherDecode = Cipher.getInstance("AES/ECB/ZeroBytePadding");
byte[] text = Base64.decode(
"wdRe00YxTFGQ65QmWukPxFLlZRSPqmRY8tHufikBHW0=",
Base64.DEFAULT);
cipherDecode.init(Cipher.DECRYPT_MODE, keyspec);
final byte[] decrypted = cipherDecode.doFinal(text);
String decyptedText = new String(decrypted);
这应该给文本'wdRe00YxTFGQ65QmWukPxFLlZRSPqmRY8tHufikBHW0 =',但它没有。
如何指定或强制使用正确的代码?
答案 0 :(得分:1)
您的问题(可能)是您正在使用MCRYPT_RIJNDAEL_256
。这不等于AES-256。 MCRYPT_RIJNDAEL_256
为Rijndael密码指定256位的块大小。另一方面,AES-256为256位的AES密码指定密钥大小。块大小为128位的Rijndael被NIST接受为AES算法。
可能最好保持MCRYPT_RIJNDAEL_128
,因为MCRYPT_RIJNDAEL_256
没有指定标准化密码。您仍然可以使用分别使用16键,24键或32键的AES-128,AES-192或AES-256。请注意,PHP mcrypt确实允许其他密钥大小(通过添加零值字节),并且不使用任何形式的标准化填充。 "ZeroBytePadding"
与PHP不兼容,因为如果明文是块大小的倍数,它会添加一个零块。然而,PHP在这种情况下不会添加零块。
如果你想保持块大小为256(但为什么要这样做),请查看this answer。
答案 1 :(得分:-1)
您可以使用JNCryptor:
JNCryptor myJNCryptor=new AES256JNCryptor();
byte[] ciphertext=cryptor.encryptData(yourtext.getBytes(), KEY.toCharArray());