我需要使用 Javascript ( pidCrypt AES CBC ) 加密一个短字符串,然后使用 PHP ( phpseclib Crypt_AES CBC ) 对其进行解密。
各种库之间有很多不兼容的地方(尝试了很多,有些由于缺乏文档我什至无法开始使用),以至于我试图理解和克服它们(当前的“标准”只是不'不包括调试,乱码或简单的 afalse
将返回不正确的使用)。
pidCrypt AES CBC 表示它使用的是 OpenSSL 兼容编码。
到目前为止,我不明白为什么 pidCrypt 的输出不会在 phpseclib 中被解密:
pidCrypt
var aes=new pidCrypt.AES.CBC();
aes.encryptText("abcdefg", "secret", {nBits: 128});
console.log(aes.pidcrypt.getParams());
/**
A0_PAD: true
UTF8: true
blockSize: 16
clear: true
dataIn: "abcdefg"
dataOut: "U2FsdGVkX19p8dJctoZSgamat+UBHMWM/Zx64fBDYJY="
decryptIn: ""
decryptOut: ""
encryptIn: Array[16]
encryptOut: "©·åÅýzáðC`"
iv: "e314f8ebbcc5a1e0ae6c27033dd6725f"
key: "49f9bd99b7952b68b3bfa47404455fa7"
nBits: 128
salt: "69f1d25cb6865281"
*/
phpseclib
function hex2raw($strHexString)
{
$strRawBytes="";
$arrChunks=str_split($strHexString, 2);
for($i=0; $i<count($arrChunks); $i++)
$strRawBytes.=chr(hexdec($arrChunks[$i]));
return $strRawBytes;
}
require_once("Crypt/AES.php");
$aes=new Crypt_AES(CRYPT_AES_MODE_CBC);
$aes->setPassword("secret");
$aes->setIV(hex2raw("e314f8ebbcc5a1e0ae6c27033dd6725f"));
var_export($aes->decrypt(base64_decode("U2FsdGVkX19p8dJctoZSgamat+UBHMWM/Zx64fBDYJY=")));
/**
false
*/
我还尝试了 phpseclib AES CBC 模式“密钥派生:无”示例(setKey 和 setIV 而不是 setPassword),结果相同。
如何让 phpseclib 解码上述 pidCrypt AES CBC 输出?
或者
是否有 phpseclib 的替代品可以解密上述 pidCrypt 输出(具有代码 API;不允许使用 OpenSSL 使用示例)?
拜托,没有关于 Javascript 安全和网络安全的讲座。这并不是为了防止互联网/网络嗅探。