据说 CryptoJS 与 OpenSSL 兼容,运行演示时可以注意到这一点。
现在我想使用 OpenSSL EVP API 实现相同的行为:使用密码对字符串进行加密,并与必须能够解密它的 CryptoJS 交换结果(知道密码)。
我怀疑交换 iv 的标准方式(我认为这是 CryptoJS 和 OpenSSL 兼容性的关键)。
我应该如何将 iv 与加密消息一起发送?
PS:请不要担心客户端加密/解密,因为我对用例很满意。
更新
使用 OpenSSL 命令行工具加密
$ echo "Hello World" | openssl enc -aes-256-cbc -pass pass:"Secret Passphrase" -e -base64
U2FsdGVkX18Z8dTy1NR6/gm+9IxmbuT8iCblIjvV76E=
用 CryptoJS 解密
var de = CryptoJS.AES.decrypt("U2FsdGVkX18Z8dTy1NR6/gm+9IxmbuT8iCblIjvV76E=","Secret Passphrase",{keySize: 256/32});
de.toString(CryptoJS.enc.Utf8); // output: Hello World
在我的用例中,我想使用 EVP API 而不是 openssl 命令行工具进行加密。我错过了如何将密文、iv 和 salt 完全“打包”在一个字符串中,就像在 "U2FsdGVkX18Z8dTy1NR6/gm+9IxmbuT8iCblIjvV76E="
更新 2
我以Saju Pillai 为例作为起点。
更新 3
我的问题是关于密文的“可互换性”。我得到以下部分
- 键: 79A38D896D90DBFE5E151A326602BC3A4A9081F3F9BEAC08EF058B96BA51CF19
- iv : 76614325D3DA73698DDD220431AE298E00000000000000000000000000000000
- 密文: QfCKTtVPlDcTOhC5ylwKFQ==
我希望向客户端发送一个字符串,该字符串必须能够破译字符串并获得解密过程所需的部分(这正是我在 CryptoJS 和 OpenSSL 之间观察到的)