Java加密之IV

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

AES是一种**分组密码**。算法

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

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

ECB

加密: 函数

image

解密: 加密

image

CBC

加密: code

image

解密: cdn

image

PCBC

加密: htm

image

解密: blog

image

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

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

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

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

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

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

相关文章
相关标签/搜索