Android Rijndael-256无法正常工作

时间:2013-11-29 16:48:57

标签: android encryption rijndael

我有这个代码来解密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 =',但它没有。

如何指定或强制使用正确的代码?

2 个答案:

答案 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());