#_*_coding:骆驼翔子-8_*_ 2024-06-06 22:55 采纳率: 93.3%
浏览 3
已结题

AES-CBC非对称加密遇到问题

AES-CBC非对称加密遇到问题

img

这是使用网页进行AES-CBC非对称解密,可以看到原文是D9047C0E0226218D913A1757DCDD8C7BF18AED768F2FBD814F78C23AB17E5C92
密钥是B77A9Fe7F323B5404902102257503C2F
iv偏移量也是B77A9Fe7F323B5404902102257503C2F
从而解密出的结果是{"videoId":52953}

但是我想通过python来实现这一步骤,于是我写了以下代码

from Crypto.Cipher import AES
import base64

def encrypt(text, key, iv):
    """
    使用AES-CBC加密算法进行加密
    """
    cipher = AES.new(key.encode(), AES.MODE_CBC, iv.encode())
    ciphertext = cipher.encrypt(text.encode())
    return base64.b64encode(ciphertext).decode()

text = "Hello, World!"
key = "B77A9Fe7F323B5404902102257503C2F"
iv = "B77A9Fe7F323B5404902102257503C2F"
ciphertext = encrypt(text, key, iv)
print(ciphertext)

但是出现了错误


ValueError: Incorrect IV length (it must be 16 bytes long)

于是,我留意到了网页的处理结果中,JS处理结果(由 CryptoJS 组件完成)是正常的,而另一个文本框中Java处理结果(由 JDK Cipher 组件完成)显示错误Wrong IV length: must be 16 bytes long,这和我python代码的错误一样
所以,我想让python模仿JS处理结果(由 CryptoJS 组件完成)的过程来解密或加密,或者直接调用js代码来实现这一功能。

  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-06 22:55
    关注

    引自免费微信小程序:皆我百晓生

    根据您的描述,您在尝试使用Python的Crypto.Cipher.AES库执行与JavaScript CryptoJS库类似的AES-CBC加密操作时遇到了问题。错误提示表明IV(初始化向量)必须为16字节长,但在某些情况下它可能不是这样。让我们首先理解问题所在,然后提供一个Python版本的解决方案,使其尽可能接近CryptoJS的行为。

    从提供的信息来看,看起来JS处理结果没有报错,这可能是因为CryptoJS在处理IV时进行了某种填充或者转换,使得它符合了要求。然而,在Python中,我们需要注意IV的确切长度。

    解决方法之一是确保您的IV始终为16字节。对于给定的密钥和IV,它们都是32个字符的十六进制字符串,这意味着它们实际上是256位(32字节),而不是16字节。在JavaScript中,CryptoJS可能自动将这个32字节的IV分成了两个16字节的部分,并且正确地处理了这两个部分。在Python中,我们需要明确地这样做。

    下面是修改后的Python代码,它将32字节的IV分成两半,然后连接起来作为实际的IV使用:

    from Crypto.Cipher import AES
    import base64
    from binascii import unhexlify
    
    def split_and_merge_hex_string(hex_string, chunk_size=16):
        return hex_string[:chunk_size] + hex_string[chunk_size:]
    
    def encrypt(text, key, iv):
        """
        使用AES-CBC加密算法进行加密,同时处理32字节的IV
        """
        # 分割并合并IV
        fixed_iv = split_and_merge_hex_string(iv)
    
        # 将密钥和IV转换为字节
        key_bytes = unhexlify(key)
        iv_bytes = unhexlify(fixed_iv)
    
        cipher = AES.new(key_bytes, AES.MODE_CBC, iv_bytes)
        ciphertext = cipher.encrypt(text.encode())
        return base64.b64encode(ciphertext).decode()
    
    text = "Hello, World!"
    key = "B77A9Fe7F323B5404902102257503C2F"
    iv = "B77A9Fe7F323B5404902102257503C2F"
    ciphertext = encrypt(text, key, iv)
    print(ciphertext)
    

    这段代码首先定义了一个辅助函数 split_and_merge_hex_string 来分割和合并32字节的IV。然后在 encrypt 函数中,我们使用这个函数处理IV,并将其转换为字节。现在,这个Python版本应该更接近于CryptoJS的行为,并能成功执行加密操作。

    注意:这个解决方案仅用于演示如何处理32字节的IV。实际应用中,您可能需要考虑如何安全地生成和管理IV,以及在不同平台之间保持一致性的策略。对于解密操作,您也需要遵循相同的步骤,即使用分割和合并后的IV进行解密。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 7月18日
  • 已采纳回答 7月10日
  • 创建了问题 6月6日

悬赏问题

  • ¥300 寻抓云闪付tn组成网页付款链接
  • ¥15 请问Ubuntu要怎么安装chrome呀?
  • ¥15 视频编码 十六进制问题
  • ¥15 Xsheii7我安装这个文件的时候跳出来另一个文件已锁定文件的无一部分进程无法访问。这个该怎么解决
  • ¥15 unity terrain打包后地形错位,跟建筑不在同一个位置,怎么办
  • ¥15 FileNotFoundError 解决方案
  • ¥15 uniapp实现如下图的图表功能
  • ¥15 u-subsection如何修改相邻两个节点样式
  • ¥30 vs2010开发 WFP(windows filtering platform)
  • ¥15 服务端控制goose报文控制块的发布问题