首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CryptoJS卸载问题

CryptoJS卸载问题
EN

Stack Overflow用户
提问于 2022-11-12 12:23:08
回答 1查看 78关注 0票数 0

我正在使用CryptoJS对从API获取的编码数据进行解密,数据来自节点js加密-js中的字符串格式

这是我尝试过的

代码语言:javascript
复制
import base64
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad,unpad

make = make.json()['data']
key = "SecretPassphrase"
encrypted_make = self.decrypt(make,key)

def decrypt(self,encrypted, passphrase):
    encrypted = base64.b64decode(encrypted)
    IV = encrypted[:16]
    aes = AES.new(passphrase.encode('utf-8'), AES.MODE_CFB, IV, segment_size=128)
    return unpad(aes.decrypt(encrypted[16:]),aes.block_size)

我得到了这个问题,{ValueError}Padding is incorrect.,我能知道我尝试错了什么吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-15 12:31:04

根据聊天中的讨论,我们发现这个问题与填充无关。实际上,它与解密密钥有关。

CryptoJS API将提供的密钥视为传递短语,而不是密钥。因此,它处理它以从它创建一个键。当使用这个密码作为Python端的解密密钥时,它会导致不一致的解码数据,因为解密密钥与从CryptoJS侧给定的密码短语生成的加密密钥不匹配。

根据CryptoJS文档,我们有三点:

  • 默认的AES操作模式是CBC,而不是CFB。
  • 使用MD5算法对pass短语进行散列以生成密钥。
  • 生成的加密消息以8字节IV之前的b"Salted__"开始。

为了将CryptoJS传递短语转换为密钥,下面的代码会有所帮助(摘自Github):

代码语言:javascript
复制
def bytes_to_key(data, salt="12345678"):
    # Simplified version of M2Crypto.m2.bytes_to_key(). Based on:
    # https://github.com/ajmirsky/M2Crypto/blob/master/M2Crypto/EVP.py#L105
    # http://stackoverflow.com/questions/8008253/c-sharp-version-of-openssl-evp-bytestokey-method
    assert len(salt) == 8, len(salt)
    data += salt
    key = md5(data).digest()
    key += md5(key + data).digest()
    return key

然后解密逻辑主要保持不变,如下所示:

代码语言:javascript
复制
def bytes_to_key(data, salt, output=48):
    assert len(salt) == 8, len(salt)
    data += salt
    key = md5(data).digest()
    final_key = key
    while len(final_key) < output:
        key = md5(key + data).digest()
        final_key += key
    return final_key[:output]

def decrypt(encrypted, passphrase):
    assert encrypted[0:8] == b"Salted__"
    salt = encrypted[8:16]
    key_iv = bytes_to_key(passphrase, salt, 32 + 16)
    iv = key_iv[32:]
    key = key_iv[:32]
    aes = AES.new(key, AES.MODE_CBC, iv)
    return unpad(aes.decrypt(encrypted[16:]), 16)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74412900

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档