【问题标题】:PHP / Javascript AES 128 CFB Encryption / Decryption CryptoJS OpenSSLPHP / Javascript AES 128 CFB 加密 / 解密 CryptoJS OpenSSL
【发布时间】:2021-12-20 22:17:23
【问题描述】:

在 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));

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

【问题讨论】:

    标签: javascript php encryption


    【解决方案1】:

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

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

    在没有填充的模式下,比如CFB,密文和明文的长度一样,所以最后的WordArray一般不完全是密文的一部分。
    例如,消息 Decrypted Message 的长度为 17 个字节,即由 5 个WordArrays 组成,其中最后一个只有 一个 有效字节。
    因此,必须为encrypted 指定有效字节数:base64data.sigBytes - 16(必须减去 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)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-01
      • 2017-05-04
      • 2017-04-12
      • 1970-01-01
      • 2019-08-17
      • 2020-04-15
      • 1970-01-01
      相关资源
      最近更新 更多