java⾃带des补位⽅式设置,DES加密模式详解(zz)
互联⽹的软件设计⼀定少不了加密算法,并且⼤量使⽤的都会是对称加密,⽐较常见的对称加密有:DES、3DES、RC4、AES等等;加密算法都有⼏个共同的要点:密钥长度;(关系到密钥的强度)
加密模式;(ecb、cbc等等)
块加密算法⾥的填充⽅式区分;
对于加密模式,很多同学还不清楚,⽐如DES,也会有ECB、CBC等不同的区分,它们都是标准的;
Windows加密库中,默认则是CBC模式,也可以⼿⼯设置;
Openssl库要更明显⼀点,它的函数名⾥⾯就写明了,⽐如:DES_ncbc_encrypt,⼀看就知道是cbc模式;
JAVA⾥⾯也⽐较清楚:Cipher c = Instance(”DES/CBC/PKCS5Padding”); 也可以看到是CBC模式
java加密方式有哪些各种加密模式有什么不同呢:(为了⽅便,这⾥的加密key都取64位)
电⼦密码本模式ECB:
最古⽼,最简单的模式,将加密的数据分成若⼲组,每组的⼤⼩跟加密密钥长度相同;
然后每组都⽤相同的密钥加密, ⽐如DES算法, 如果最后⼀个分组长度不够64位,要补齐64位;
定义:
Enc(X,Y)是加密函数
Dec(X,Y)是解密函数
Key是加密密钥;
Pi ( i = 0,1…n)是明⽂块,⼤⼩为64bit;
Ci ( i = 0,1…n)是密⽂块,⼤⼩为64bit;
ECB加密算法可表⽰为:
Ci = Enc(Key, Pi)
ECB解密算法可以表⽰为:
Pi = Dec(Key,Ci)
算法 特点:每次Key、明⽂、密⽂的长度都必须是64位;
数据块重复排序不需要检测;
相同的明⽂块(使⽤相同的密钥)产⽣相同的密⽂块,容易遭受字典攻击;
⼀个错误仅仅会对⼀个密⽂块产⽣影响;
加密块链模式CBC:
与ECB模式最⼤的不同是加⼊了初始向量
定义:
Enc(X,Y)是加密函数
Dec(X,Y)是解密函数
Key是加密密钥;
Pi ( i = 0,1…n)是明⽂块,⼤⼩为64bit;
Ci ( i = 0,1…n)是密⽂块,⼤⼩为64bit;
XOR(X,Y)是异或运算;
IV是初始向量(⼀般为64位);
ECB加密算法可表⽰为:
C0 = Enc(Key, XOR(IV, P0)
Ci = Enc(Key, XOR(Ci-1, Pi)
ECB解密算法可以表⽰为:
P0 = XOR(IV, Dec(Key, C0))
Pi = XOR(Ci-1, Dec(Key,Ci))
算法特点:每次加密的密⽂长度为64位(8个字节);
当相同的明⽂使⽤相同的密钥和初始向量的时候CBC模式总是产⽣相同的密⽂;
密⽂块要依赖以前的操作结果,所以,密⽂块不能进⾏重新排列;
可以使⽤不同的初始化向量来避免相同的明⽂产⽣相同的密⽂,⼀定程度上抵抗字典攻击;
⼀个错误发⽣以后,当前和以后的密⽂都会被影响;
加密反馈模式CFB:
加密反馈模式克服了需要等待8个字节才能加密的缺点,它采⽤了分组密码作为流密码的密钥流⽣成器;定义:
Enc(X,Y)是加密函数
Dec(X,Y)是解密函数
Key是加密密钥;
Pi ( i = 0,1…n)是明⽂块,⼤⼩为64bit;
Ci ( i = 0,1…n)是密⽂块,⼤⼩为64bit;
Si ( i = 0,1…n),⼤⼩为8bit,n个连续的Si组成加密位移寄存器,⼀般n=8;
Oi = Enc(Key, Si);
Lef(x) 为取数据x的最左8个bit位;
A(x,y)为合并x左移8位,空位⽤y填充
CFB加密算法可表⽰为:
S0 = IV;
Oi = Enc(Key, Si);
Ci = XOR( Ci, Lef(Oi));
Si = A(Si-1, Ci);
CFB解密算法可表⽰为:
S0 = IV;
Oi = Enc(Key, Si);
Si = A(Si-1, Ci);
图⽰:
特点:每次加密的Pi和Ci不⼤于64位;
加密算法和解密算法相同,不能适⽤于公钥算法;
使⽤相同的密钥和初始向量的时候,相同明⽂使⽤CFB模式加密输出相同的密⽂;
可以使⽤不同的初始化变量使相同的明⽂产⽣不同的密⽂,防⽌字典攻击;
加密强度依赖于密钥长度;
加密块长度过⼩时,会增加循环的数量,导致开销增加;
加密块长度应时8位的整数倍(即字节为单位);
⼀旦某位数据出错,会影响⽬前和其后8个块的数据;
输出反馈模式OFB:
与CFB模式不同之处在于, 加密位移寄存器与密⽂⽆关了,仅与加密key和加密算法有关;
做法是不再把密⽂输⼊到加密移位寄存器,⽽是把输出的分组密⽂(Oi)输⼊到⼀位寄存器;定义:
Enc(X,Y)是加密函数
Dec(X,Y)是解密函数
Key是加密密钥;
Pi ( i = 0,1…n)是明⽂块,⼤⼩为64bit;
Ci ( i = 0,1…n)是密⽂块,⼤⼩为64bit;
Si ( i = 0,1…n),⼤⼩为8bit,n个连续的Si组成加密位移寄存器,⼀般n=8;
Oi = Enc(Key, Si);
Lef(x) 为取数据x的最左8个bit位;
A(x,y)为合并x左移8位,空位⽤y填充
CFB加密算法可表⽰为:
S0 = IV;
Oi = Enc(Key, Si);
Si = A(Si-1, Oi);          注意这⾥与CFB模式的不同
CFB解密算法可表⽰为:
S0 = IV;
Oi = Enc(Key, Si);
Ci = XOR( Ci, Lef(Oi));
Si = A(Si-1, Oi);
特点:与CFB类似,以下都是不同之处;
因为密⽂没有参与链操作,所以使得OFB模式更容易受到攻击;
不会进⾏错误传播,某位密⽂发⽣错误,只会影响该位对应的明⽂,⽽不会影响别的位;
不是⾃同步的,如果加密和解密两个操作失去同步,那么系统需要重新初始化;
每次重新同步时,应使⽤不同的初始向量。可以避免产⽣相同的⽐特流,避免”已知明⽂”攻击 ;
Windows API进⾏加密参数设置:
CryptGetKeyParam可以对HCRYPTKEY对象的各种参数进⾏查询,包括加密模式、padding⽅式等;但这个函数不能⽤于查询加密key 的明⽂;
但如果需要看到真正加密的key是什么,则需要另外的API:CryptExportKey,选择PLAINTEXTKEYBLOB⽅式进⾏导出可以得到key的明⽂;
使⽤加密要注意的地⽅:
当两个封装好的加密算法对8byte数据进⾏DES加密时,如果加密出来的结果是⼀样的,千万不要认为这两个算法可以互换;
因为ECB模式,和向量全为0的CBC模式得到的密⽂前8byte,确实是⼀样,但后⾯的密⽂就不⼀样了;
使⽤加密以前确定你理解了它;
互联⽹程序中加密模式的使⽤:
ECB是不推荐的⽅式,Key相同时,相同的明⽂在不同的时候产⽣相同的明⽂,容易遭到字典攻击;
CBC由于加⼊了向量参数,⼀定程度上抵御了字典⼯具,但缺点也随之⽽来,⼀旦中间⼀个数据出错或丢失,后⾯的数据将受到影响;
CFB与CBC类似,好处是明⽂和密⽂不⽤是8bit的整数倍,中间⼀个数据出错,只影响后⾯的⼏个块的数据;
OFB⽐CFB⽅式,⼀旦⼀个数据出错,不会影响后⾯的数据,但安全性降低;
因此,推荐使⽤CFB⽅式,但每个数据包单独加密,否则⼀个数据包丢失,需要做很多容错处理;
当然,具体问题也要具体分析,对于只需要”特定安全性”①,不需要”计算安全性”以上的软件,也可以使⽤ECB模式;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。