使CryptoJS和pycrypto兼容

Making CryptoJS and pycrypto compatible

本文关键字:兼容 pycrypto CryptoJS      更新时间:2024-02-27

我正试图弄清楚如何将CryptoJS库用于AES,但文档有些匮乏。

我遵循了他们的例子,但我似乎无法解码我在PyCrypto 中编码的东西

我的格式如下:

key = '0f3f0fe38eb5f216cb4ef0649f81d761'
ciphertext = 'Y+gwBI6R37Ko1lQmwZ57gg==FqUSqQ=='

密文有两个组成部分

iv: Y+gwBI6R37Ko1lQmwZ57gg==
encoded message: FqUSqQ==

我试着运行下面的代码,但没有成功。它在控制台中记录"。它应该解决"测试"

var decrypted =CryptoJS.AES.decrypt(ciphertext, key);
console.log( decrypted.toString(CryptoJS.enc.Utf8) );

任何指针都会很棒。感谢

我也遇到了这个问题,不幸的是,让pycryptocrypto-js对话非常困难。以下是对我有效的组合:

  1. 在Python中加密时使用MODE_CFBsegment_size=128
  2. 您必须根据RFC 2315用Pkcs7填充字符串[第21页]
  3. 在JS中收到base64版本的密文后,您需要将其封装CryptoJS.lib.CipherParams.create({ ... })

看看适用于我的代码(Python 2.7.x):
https://gist.github.com/marcoslin/8026990

我对CryptoJS没有直接的经验,但对各种其他加密库有多年的经验。几乎可以肯定的是,CryptoJS.AES.decrypt期望的密文格式与您使用的密文格式不同。您的密文由两个独立的Base64编码实体组成:

Base64(IV)+Base64(Enc(Message))

如果CryptoJS.AES.decrypt期望IV被指定为密文的一部分(它可能没有),并且期望Base64编码的密文输入(它可能根本没有),那么我会尝试传递:

Base64((二进制IV)+(二进制Enc(消息))

看看CryptoJS文档,我和你一样感到沮丧。但有一个"手动指定IV"的加密示例可能会提供线索。

<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/aes.js"></script>
<script>
    var key = CryptoJS.enc.Hex.parse('000102030405060708090a0b0c0d0e0f');
    var iv  = CryptoJS.enc.Hex.parse('101112131415161718191a1b1c1d1e1f');
    var encrypted = CryptoJS.AES.encrypt("Message", key, { iv: iv });
</script>

对不起,我帮不了你什么-