繁体   English   中英

PHP/Javascript AES 128 CFB 加密/解密 CryptoJS OpenSSL

[英]PHP / Javascript AES 128 CFB Encryption / Decryption CryptoJS OpenSSL

PHP 中的工作解密

function decrypt($encryptedText){
    $key = "1234567890123456";
    $decrypted = openssl_decrypt(substr(base64_decode($encryptedText), 16), "AES-128-CFB", $key, OPENSSL_RAW_DATA, substr(base64_decode($encryptedText), 0, 16));
    return $decrypted;
}
$encryptedText = "1EwMDT20BELrEixvrSGswDC4GZIn5BWGor6MP6ERi9Ux";
echo decrypt($encryptedText);

将输出“解密消息”

我正在尝试在 Javascript 中复制它

var key = '1234567890123456';
var base64data = CryptoJS.enc.Base64.parse("1EwMDT20BELrEixvrSGswDC4GZIn5BWGor6MP6ERi9Ux");
var encrypted = new CryptoJS.lib.WordArray.init(base64data.words.slice(4));
var iv = new CryptoJS.lib.WordArray.init(base64data.words.slice(0, 4));
var cipher = CryptoJS.lib.CipherParams.create({ ciphertext: encrypted });
var decrypted = CryptoJS.AES.decrypt(cipher, CryptoJS.enc.Utf8.parse(key), {iv: iv, mode: CryptoJS.mode.CFB});
console.log("Decrypted: "+decrypted.toString(CryptoJS.enc.Utf8));

我得到一个空洞的回应,任何关于我出错的地方的帮助将不胜感激。 谢谢

CFB是一种流密码模式,即不使用填充。

在填充模式下,密文的长度总是对应于块大小的整数倍,即 AES 为 16 字节。 这意味着密文总是由完整的WordArray组成(一个WordArray大小为 4 个字节)。

在没有padding的模式下,比如CFB,密文和明文的长度一样,所以最后一个WordArray一般不完全是密文的一部分。
例如, Decrypted Message 消息的长度为17 个字节,即由5 个WordArray组成,其中最后一个只有一个有效字节。
因此,必须指定有效字节数: base64data.sigBytes - 16进行encrypted (减去 16 是必要的,因为base64data还包含 IV)。

此外,必须明确禁用填充。

通过这两个更改,解密成功:

 var key = '1234567890123456'; var base64data = CryptoJS.enc.Base64.parse("1EwMDT20BELrEixvrSGswDC4GZIn5BWGor6MP6ERi9Ux"); var encrypted = new CryptoJS.lib.WordArray.init(base64data.words.slice(4), base64data.sigBytes - 16); // consider significant bytes var iv = new CryptoJS.lib.WordArray.init(base64data.words.slice(0, 4)); var cipher = CryptoJS.lib.CipherParams.create({ ciphertext: encrypted }); var decrypted = CryptoJS.AES.decrypt(cipher, CryptoJS.enc.Utf8.parse(key), {iv: iv, mode: CryptoJS.mode.CFB, padding: CryptoJS.pad.NoPadding}); // disable padding document.getElementById("pt").innerHTML = "Decrypted: " + decrypted.toString(CryptoJS.enc.Utf8);
 <script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/crypto-js.min.js"></script> <p style="font-family:'Courier New', monospace;" id="pt"></p>

顺便说一下,CFB 有不同的变体。 这里,两个代码都使用完整块 CFB (CFB128)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM