实用密码学
范学雷
前 Oracle 首席软件工程师,Java SE 安全组成员,OpenJDK 评审成员
14948 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 24 讲
开篇词 (1讲)
课前必读 (1讲)
案例分析 (1讲)
实用密码学
15
15
1.0x
00:00/00:00
登录|注册

08 | 该怎么选择初始化向量?

你好,我是范学雷。
上一讲,我们讨论了对称密钥的常见算法,还讲到了序列算法和分组算法。还记得吗?当时,我建议你优先使用序列算法,因为它有着良好的性能和皮实的用法。另外,我还向你推荐了 AES-256 和 AES-128。
但是,由于我们还没有考虑数据分组等因素的影响,所以这个建议的实用性还有待商榷。那么,这一讲,我们就来看看对于分组算法,到底有哪些麻烦?我们又该怎么避免这些麻烦?
其实,这是一个解决起来很复杂的问题。不过,今天我们可以先对问题建立一个初步的认知。
要知道分组算法有哪些麻烦,就要先知道该怎么计算分组算法。

分组算法怎么计算?

我们在上一讲说过,分组算法要对输入数据进行分组,然后按数据分组来进行运算。一个典型的分组算法,一般要由三个部分组成,数据分组、分组运算和链接模式。
我们先来看看数据分组是怎么一回事。
数据分组在加密时,会把明文的输入数据分割成加密函数能够处理的数据块。比如,AES 算法能够处理的数据块大小是 128 位,那么,输入数据就要被分割成一个或者多个 128 位的小数据块。
如果不能整分,就要把最后一个分组补齐成 128 位。这些分组数据的运算结果,组合起来就是密文数据。解密时,执行相反的操作,把补齐数据去掉,再把数据分组组合成完整的明文数据。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入讨论了在选择初始化向量时对算法安全性的重要性。初始化向量与第一个数据块的计算密切相关,若存在相同的初始化向量和相同的第一个明文数据分组,将导致相同的输出,从而暴露数据的保密性。因此,在对称密钥的生命周期中,初始化向量不能重复使用。为避免此问题,开发者可选择使用安全强度足够的随机数或序列数作为初始化向量。然而,这两种选择都存在各自的问题,如随机数获取的效率和同步问题,以及序列数状态的保持和同步问题。因此,选择初始化向量充满了复杂性,需要根据具体的使用场景来制定适当的选择方案。此要求往往容易被忽略。文章通过深入讨论了初始化向量的选择对算法安全性的重要性,为读者提供了对该主题的全面了解。文章还提到了密钥使用次数的限制,这是一个不太引人注意的安全陷阱,也是近年来才受到广泛关注的算法安全问题。密钥使用次数限制需要被重视,并且要有检查密钥使用次数限制的习惯。接下来的讨论将涉及其他限制条件,并列出不同算法的使用限制。最后,文章提出了思考题,鼓励读者在其项目中或关注的开放源代码项目中搜索初始化向量的使用情况,并讨论潜在的安全风险和建议。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《实用密码学》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(12)

  • 最新
  • 精选
  • 彩色的沙漠
    前段时间把项目中对称加密的链接模式由ECB改为了CBC模式。但是向量是固定的前后端约定好的。如果使用不重复的初始化向量又存在发送给后端的保密性问题

    作者回复: 由于初始化向量不需要保密,可以使用明文传输的初始化向量。每一次加密,都附上初始化向量。传输的数据是:初始化向量 + 密文。以前的TLS就是这么做的。 不过,现在CBC也要快退役了,建议换到Chacha20/Poly1305或者AES-GCM。这两个模式我们稍后会讲到的。

    2020-12-11
    5
  • 麋鹿在泛舟
    使用第二种方案即序列数做为初始化向量,文中提到会遇到分布式序列同步问题, 和攻击者知道序列数的风险。 可以详细解释下吗, 我理解: 1. 分布式系统下的全局ID应该都有自己成熟的方案,或者是使用数据库自增 或者 redis生成,应该不存在同步问题了吧 2. 初始化向量本身就是非敏感信息,攻击者知道这些序列值 也不会引入什么风险吧?

    作者回复: #1 就是解决同步问题的办法之一。但是,无论是数据库还是redis,都降低了效率。 #2,这是一个好问题。我写的时候,也想过,这一句是不是会引来讨论。讨论真的就来了。我们后面会讲对加密算法的攻击。重复的初始化向量,一般来说是没有问题的;但是如果没有注意到这些攻击,重复的和已知的初始化向量,会让攻击变得更容易得手。

    2020-12-12
    2
    2
  • Reol
    老师,对于初始化向量IV使用序列数的方法,文中说:使用序列数的一个问题是攻击者能较容易知道每一个IV。 1)除了序列数,就算采取随机数的方法生成IV,也是明文发送IV+密文数据,攻击者也能知道每个IV吧。IV可公开的情况下,被攻击者知道了全部IV又有什么风险呢?这两个方法应该只是为了让密文不重复? 2)如果同一个密钥下,采用相同的IV生成了相同密文。攻击者是只能对比猜测明文,而不能直接破解出明文吗?

    作者回复: 1)是的,这两种方法是为了让密码不重复。一般来说,攻击者知道IV并不应该有密码学上的风险。文中的这句话,我表达的有失误。 2)如果能直接破解出明文,那就意味着加密算法本身是可以逆运算的。一般情况下,我们都假设加密算法本身的强度是足够的。

    2021-08-18
    1
  • 麋鹿在泛舟
    项目中加密使用安全随机数函数生成初始化向量,解密处有点不一样,为了兼容历史版本(历史版本使用了固定初始化向量),走了两套分支,即如果是老版本加密的,则使用固定向量解密,否则则使用和密文一起存储的随机初始化向量解密。

    作者回复: 嗯,有的时候为了兼容性,要牺牲很多。如果只是本地存储,可能问题还不大;如果要走网络传递,可能会有安全问题。这个还是进一步要分析数据流的场景,才能确定是不是真的有问题。

    2020-12-12
    1
  • Geek_d68bf9
    我们项目就是向量固定的,如果动态向量的话,怎么做双向传输加密?

    作者回复: 大概率这个项目的安全性是没有保证的。看看“初始化向量怎么选?”这一小节对你们有没有帮助,或者看看安全协议的设计,比如TLS。

    2022-06-28
  • Geek_828b39
    老师,没有明白密钥还有使用次数限制的问题。

    作者回复: 有没有明白初始化向量不能重复的问题?

    2021-08-30
    2
  • 三叶虫tlb
    我做的项目,初始化向量就是重复的。。。当初不明白这个有什么用、有什么安全隐患。 另外怎样安全把初始化向量发送给对方也是个问题。

    作者回复: 大部分场景下的初始化向量不需要保密。

    2021-04-16
  • Litt1eQ
    感觉使用重复的iv会对安全性产生影响 但是我不太清楚具体影响的程度 一般来说iv会跟着加密之后灯内容一块发送 以我目前所能掌握的知识只能了解到这些 我记得分组密码存在一个ecb模式 这个模式没有iv 希望老师可以普吉一下更多的知识 对于密钥长度的限制是我之前所不了解的 感谢老师

    作者回复: 重复的iv,相同的明文就有相同的密文,文章里有讲的,这是一般的加密不允许的。下一节我们讲ECB模式。

    2020-12-09
    2
  • 天天有吃的
    问题2:密钥使用次数 < 初始化向量次数,可以防止第一个数据分组输出相同的加密后内容,密钥还有什么别的限制呢,按道理密钥没有重复性的要求应该比初始化向量要求更低呀?

    作者回复: 你问题提的都很好!密钥的限制问题,我们后面专门会讲的。

    2020-12-09
  • 天天有吃的
    小白打卡中... 问题1:初始化向量除了不能重复,这里的位数(文中128位)是怎么确定的?怎么保证尽可能的不重复?除了不重复还有没有什么限制?

    作者回复: 位数是由数据块的大小确定的。使用随机数或者序列数,是两个解决重复问题的措施,文中有讲的。其他的限制就要看具体的链接模式了,有的还有,有的就没有了,或者我还不知道有没有。

    2020-12-09
收起评论
显示
设置
留言
12
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部