如何在PHP中解密Bouncy Castle(AES / CBC)数据?

时间:2013-09-11 21:17:19

标签: java php encryption cryptography bouncycastle

我们有一些使用Java Bouncy Castle的“PBEWITHSHA256AND128BITAES-CBC-BC”算法加密的文件。

在PHP中使用PHP解密这些文件的最佳库是什么?

1 个答案:

答案 0 :(得分:3)

AES解密可以通过以下方式完成:

function decrypt($encrypted, $key, $iv) {
    $decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $encrypted, MCRYPT_MODE_CBC, $iv);
    $padSize = ord(substr($decrypted, -1));
    return substr($decrypted, 0, $padSize*-1);
}

$key$iv$encrypted应为二进制字符串。

substr和pad size检测是必要的,因为128BITAES-CBC-BC使用PK的mcrypt函数不支持的PKCS5填充(PHP总是用零填充)。

更难的部分是计算加密密钥。 Bouncy Castle的PBEWITHSHA256使用PKCS12和SHA256来获得密钥。这里的问题是我不知道(并且无法找到)PHP中这个算法的任何实现,老实说,我认为你不会找到它。如果所有数据都使用单个密钥加密,我建议调试Bouncy Castle库并在加密/解密过程开始时提取关键字节。如果在generateWorkingKey(byte[], boolean)类的org.bouncycastle.crypto.engines.AESFastEngine方法中设置断点,则应该能够捕获密钥。