chenjilan123 2020-10-30 16: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 14: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,确保数据安全性。同时,使用标准的加密方式可以保证和其他协议的兼容性。

    展开全部

    评论
    编辑
    预览

    报告相同问题?

    悬赏问题

    • ¥60 优博讯DT50高通安卓11系统刷完机自动进去fastboot模式
    • ¥15 minist数字识别
    • ¥15 在安装gym库的pygame时遇到问题,不知道如何解决
    • ¥20 uniapp中的webview 使用的是本地的vue页面,在模拟器上显示无法打开
    • ¥15 网上下载的3DMAX模型,不显示贴图怎么办
    • ¥15 关于#stm32#的问题:寻找一块开发版,作为智能化割草机的控制模块和树莓派主板相连,要求:最低可控制 3 个电机(两个驱动电机,1 个割草电机),其次可以与树莓派主板相连电机照片如下:
    • ¥15 Mac(标签-IDE|关键词-File) idea
    • ¥15 潜在扩散模型的Unet特征提取
    • ¥15 iscsi服务无法访问,如何解决?
    • ¥15 感应式传感器制作的感应式讯响器
    手机看
    程序员都在用的中文IT技术交流社区

    程序员都在用的中文IT技术交流社区

    专业的中文 IT 技术社区,与千万技术人共成长

    专业的中文 IT 技术社区,与千万技术人共成长

    关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

    关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

    客服 返回
    顶部