chenjilan123 2020-10-31 00:06 采纳率: 0%
浏览 75

AES-128(CBC模式)中的IV默认如何保存?

最近在开发一个Http服务器,Http报文里的一段数据需要加密。

加密方式是这样的:厂商云平台或者本地系统采用 AES-128(CBC 模式)加密方式对发送内容中的
data 字段内容进行加密,并进行 Base64 编码。

看了一些关于加密算法的介绍并百度和谷歌一番后,发现AES-128加密需要生成随机的IV(Inilization Vector)。

问题是,我该如何保存这个IV呢?

①协议里并没有规定用其他参数传递IV。

②查了许多算法,发现有的是将IV保存到密文的前16位,有点则采用固定IV。在openssl中,会以"Salted__'开头来保存密文,IV保存在哪,这是一个标准吗?

注:在网上查了很多关于AES128(CBC模式)的算法和在线工具,实现各不相同,甚至连相同参数加密产生的结果都不一样,并且几乎没有一致的。那是否有一个标准呢?这个标准是什么?由于我的实现必须和其他协议的开发者保持一致。因此我不能自己扩展加密解密的算法。

是否一个标准实现了以下两个方法:

string Encrypt(string plainText, string encryptKey)

string Decrypt(string cipher, string encryptKey) 
  • 写回答

1条回答 默认 最新

  • 码农阿豪@新空间代码工作室 Java领域优质创作者 2024-07-24 22:46
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    答案如下:
    1. 关于保存 IV 的方式: 在使用 AES-128(CBC 模式)加密时,IV 是必须的,而且 IV 不能被公开,应该和密文一起保存在安全的地方。有几种常见的方式来保存 IV:
    2. 将 IV 直接附加在密文的前面,然后在解密时将 IV 从密文中截取出来。
    3. 将 IV 单独存储在一个安全的地方,比如服务器端的数据库或者配置文件中。
    4. 标准的实现方式: 在使用 AES-128(CBC 模式)加密时,确实存在一些标准的实现方式,但是不同的库或工具可能会有一定的差异。在一些库中,会在密文中加入"Salted__"作为标识,并紧跟着 IV。这种方式在 OpenSSL 中是常见的。 一个标准的实现应该包括以下几个步骤:
    5. 生成随机的 IV。
    6. 使用 AES-128(CBC 模式)和密钥对数据进行加密。
    7. 将 IV 和密文合并存储或传输。
    8. 在解密时,从密文中提取 IV,然后使用 IV 和密钥解密密文。 以下是一个用 Python 和 PyCrypto 库实现的示例代码:
    from Crypto.Cipher import AES
    import base64
    import os
    def encrypt(plainText, encryptKey):
        IV = os.urandom(16)
        encryptor = AES.new(encryptKey, AES.MODE_CBC, IV)
        paddedText = plainText + (16 - len(plainText) % 16) * chr(16 - len(plainText) % 16)
        cipher = encryptor.encrypt(paddedText)
        return base64.b64encode(IV + cipher)
    def decrypt(cipher, encryptKey):
        data = base64.b64decode(cipher)
        IV = data[:16]
        ciphertext = data[16:]
        decryptor = AES.new(encryptKey, AES.MODE_CBC, IV)
        paddedText = decryptor.decrypt(ciphertext)
        return paddedText[:-ord(paddedText[-1])]
    # 使用示例
    plainText = "Hello, World!"
    encryptKey = b"1234567890123456"  # 密钥长度为16位
    cipher = encrypt(plainText, encryptKey)
    print("加密后的文本:", cipher)
    decryptedText = decrypt(cipher, encryptKey)
    print("解密后的文本:", decryptedText)
    

    在实际应用中,可以根据具体的需求和环境选择合适的方式保存 IV,确保数据安全性。同时,使用标准的加密方式可以保证和其他协议的兼容性。

    评论

报告相同问题?

悬赏问题

  • ¥20 iOS绕地区网络检测
  • ¥15 python验证码滑块图像识别
  • ¥15 根据背景及设计要求撰写设计报告
  • ¥20 能提供一下思路或者代码吗
  • ¥15 用twincat控制!
  • ¥15 请问一下这个运行结果是怎么来的
  • ¥15 单通道放大电路的工作原理
  • ¥30 YOLO检测微调结果p为1
  • ¥15 DS18B20内部ADC模数转换器
  • ¥15 做个有关计算的小程序