python代码加密解密_在python中加密 – 在Javascript中解密

您的Python代码和CryptoJS代码存在许多问题:

>您使用随机IV加密Python中的一些明文.如果要检索该明文,则需要在解密期间使用相同的IV.没有IV,明文就无法恢复.通常,IV只是前置于密文,因为它不必是秘密的.因此,您需要在解密期间读取IV,而不是生成新的IV.

>您在CryptoJS中使用CBC模式(默认)而不是CFB模式.模式必须相同.另一个棘手的部分是CFB模式使用段大小进行参数化. PyCrypto默认使用8位段(CFB8),但CryptoJS仅针对128位(CFB128)的固定段实现.由于PyCrypto版本是可变的,您需要更改它.

> CryptoJS decrypt()函数将密文作为OpenSSL格式的字符串或CipherParams对象.由于您没有OpenSSL格式的字符串,因此必须将密文转换为对象.

> CryptoJS的密钥应该是WordArray而不是字符串.

>使用相同的填充.如果使用CFB8,PyCrypto不会填充明文,但在使用CFB128时需要填充. CryptoJS默认使用PKCS#7填充,因此您只需要在python中实现该填充.

Python代码(适用于版本2):

def pad(data):

length = 16 - (len(data) % 16)

return data + chr(length)*length

def unpad(data):

return data[:-ord(data[-1])]

def encrypt(message, passphrase):

IV = Random.new().read(BLOCK_SIZE)

aes = AES.new(passphrase, AES.MODE_CFB, IV, segment_size=128)

return base64.b64encode(IV + aes.encrypt(pad(message)))

def decrypt(encrypted, passphrase):

encrypted = base64.b64decode(encrypted)

IV = encrypted[:BLOCK_SIZE]

aes = AES.new(passphrase, AES.MODE_CFB, IV, segment_size=128)

return unpad(aes.decrypt(encrypted[BLOCK_SIZE:]))

JavaScript代码:

var base64ciphertextFromPython = "...";

var ciphertext = CryptoJS.enc.Base64.parse(base64ciphertextFromPython);

// split iv and ciphertext

var iv = ciphertext.clone();

iv.sigBytes = 16;

iv.clamp();

ciphertext.words.splice(0, 4); // delete 4 words = 16 bytes

ciphertext.sigBytes -= 16;

var key = CryptoJS.enc.Utf8.parse("1234567890123456");

// decryption

var decrypted = CryptoJS.AES.decrypt({ciphertext: ciphertext}, key, {

iv: iv,

mode: CryptoJS.mode.CFB

});

console.log ( decrypted.toString(CryptoJS.enc.Utf8));

其他考虑:

您似乎想要使用密码作为密钥.密码短语通常是人类可读的,但密钥则不是.您可以使用包含PBKDF2,bcrypt或scrypt等功能的密码来派生密钥.

上面的代码并不完全安全,因为它缺乏身份验证.未经验证的密文可能会导致可行的攻击和未被注意的数据操作.通常,加密然后MAC方案与良好的MAC功能一起使用,例如HMAC-SHA256.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值