Java加密之IV

原文链接:https://www.dubby.cn/detail.html?id=9097

AES是一种分组密码

密码学中,分组(block)密码的工作模式(mode of operation)允许使用同一个分组密码密钥对多于一块的数据进行加密,并保证其安全性。分组密码自身只能加密长度等于密码分组长度的单块数据,若要加密变长数据,则数据必须先被划分为一些单独的密码块。通常而言,最后一块数据也需要使用合适填充方式将数据扩展到匹配密码块大小的长度。一种工作模式描述了加密每一数据块的过程,并常常使用基于一个通常称为初始化向量的附加输入值以进行随机化,以保证安全。

而不同的工作模式的实现细节也不相同,在Java中,指定加密算法的字符串是AES/ECB/PKCS5Padding,也就是“算法/模式/填充方式”。而IV就和工作模式有关。常见的工作模式包括,ECB、CBC、PCBC、CFB、OFB、CTR等。

ECB

加密:


image

解密:


image

CBC

加密:


image

解密:


image

PCBC

加密:


image

解密:


image

根据上面的几张图可以看出,ECB模式下是不需要IV的,而CBC和PCBC是需要IV的。

那么IV的取值有什么需要注意的呢?

在密码学的领域里,初始化向量(英语:initialization vector,缩写为IV),或译初向量,又称初始变量(starting variable,缩写为SV),是一个固定长度的输入值。一般的使用上会要求它是随机数或拟随机数(pseudorandom)。使用随机数产生的初始化向量才能达到语义安全(散列函数与消息验证码也有相同要求),并让攻击者难以对同一把密钥的密文进行破解。在区块加密中,使用了初始化向量的加密模式被称为区块加密模式。

初始化向量的值依密码算法而不同。最基本的要求是“唯一性”,也就是说同一把密钥不重复使用同一个初始化向量。这个特性无论在区块加密或流加密中都非常重要。

许多要求初始化向量必须让攻击者无法预测。这种要求一般使用随机数或拟随机数来达到。在这种应用中,重复的初始化向量是可以被忽略的,但是生日攻击的问题依然得列入考量,因为若向量可以被预测,会让攻击者找到撤消明文的线索。

初始化向量的值主要还是取决于密码算法。其做法不外乎就是随机或指定(stateful)。使用随机的方式则取值由发送方计算,并要将向量值送交给接收方。指定的方式则是让收发两方分享初始化向量所能指定的所有值(state),这些值收发双方必须预先就定义好。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 夏天傍晚的雨 怎么说呢 是喜欢还是不喜欢 它浇凉了炎热的暑气 却也打消了我攒了一整天想出门的念头 终于等到了雨停 ...
    _Celeste_阅读 369评论 0 0
  • DES 算法原理 DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位,其算法主要分为两...
    Astrophel_06c5阅读 430评论 0 0
  • 我要走遍世上的每一条路,度过深沉的悲伤,莫名的哀愁,无尽的喜悦,只求放手一搏体验人生,追求灵魂中的星辰。~摘抄
    潘思璇阅读 253评论 0 0
  • 人生如梦 梦想是帆 每个人都有一个属于自己的梦想 我有一个梦想 蓝蓝的天上白云朵朵 我有一个梦想 田野里麦浪滚滚,...
    李木只阅读 378评论 2 6