【问题标题】:Crypto-Js different output from mcrypt Upon chage of data to encryptCrypto-Js 与 mcrypt 的不同输出在更改要加密的数据时
【发布时间】:2014-08-15 03:21:30
【问题描述】:

我的问题现在与Crypto-Js different output from mcrypt 相关,这就是为什么我使用相同的问题但添加了几行以更好地解释它的原因。

基于我之前由吉姆爵士解决的问题(也非常感谢您的提示)。它部分正确,因为它确实显示了相同的结果,但只有当我使用“Blader”这个词并且如果我使用另一个词,如“CROW”,那么两个脚本之间的输出是不同的。

这是 jim 爵士给出的代码,就像一个魅力 (我在这里使用了 Blader)

$encrypted = "Blader\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a";
$iv = base64_decode('AAAAAAAAAAAAAAAAAAAAAA==');
$key = base64_decode('ITU2NjNhI0tOc2FmZExOTQ==');
$plaintext = mcrypt_encrypt( MCRYPT_RIJNDAEL_128, $key, $encrypted, MCRYPT_MODE_CBC,  $iv );
echo base64_encode($plaintext);

示例是当我使用 CROW 作为要加密的数据时

cryptoJS 中的输出

dxt3uyk27U3wRRrzaFGiwQ==

mcrypt 中的输出

x9/oeyLZkLkXM7B1Zo+ezg==

为了解决这个问题,我删除了cryptoJS 中的padding: CryptoJS.pad.Pkcs7,但我的问题是如果我不想删除cryptoJS 中的填充怎么办?

所有答案将不胜感激。

【问题讨论】:

    标签: javascript php encryption


    【解决方案1】:

    您需要了解PKCS#7 padding 的工作原理。它使明文达到 16 个字节的倍数。如果已经是 16 的倍数,则额外增加 16 个字节。

    对于 UTF-8 格式的“CROW”(四个字节),您需要再添加 12 个字节。每个字节现在是 12,即 12 的 12 个字节,而不是 Blader 的 10 个字节的 10。例如,试试这个:

    $encrypted = "CROW\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c";
    

    要使用 PKCS#7 填充,您可以尝试以下操作:

    $encrypted = "CROW";
    
    // Add PKCS#7 padding
    $pad = 16 - (strlen($encrypted) % 16);
    $encrypted = $encrypted . str_repeat(chr($pad), $pad);
    

    (我会将变量命名为 $encrypted 以外的名称,因为它实际上从未保存过加密数据。)

    【讨论】:

    • 希望我能感谢你一百多次。我的两个问题在不到一个小时内就得到了你的回答。希望有一天我能像你一样,先生。非常感谢先生的帮助。没有你的帮助,我真的做不到。
    • @user3771496 当您知道在哪里查找时,这很容易。此外,在您的问题中包含实际数据值和代码确实很有帮助。干杯。
    猜你喜欢
    • 2014-08-14
    • 2014-09-12
    • 1970-01-01
    • 2014-02-06
    • 2014-08-17
    • 2012-12-09
    • 1970-01-01
    • 2012-04-11
    • 1970-01-01
    相关资源
    最近更新 更多