综合了几篇文章的内容,以C#的核算结果为参阅标准,总结出CFB形式的流程(OFB形式先占坑,未来再填)
CFB形式
密文反应(CFB,Cipher feedback)形式与ECB和CBC形式只能够加密块数据不同,能够将块暗码变为自同步的流暗码;CFB的解密进程几乎便是颠倒的CBC的加密进程。
留意:CFB、OFB和CTR形式中解密也都是用的加密器而非解密器。
CFB的加密工作分为两部分:
1.将一前段加密得到的密文再加密;
2.将第1步加密得到的数据与当前段的明文异或。
由于加密流程和解密流程中被块加密器加密的数据是前一段密文,因此即便明文数据的长度不是加密块巨细的整数倍也是不需要填充的,这保证了数据长度在加密前后是相同的。
CFB形式克服了ECB/CBC形式需要等候8个字节才干加解密的缺陷,它采用了分组暗码作为流暗码的密钥流生成器;
特色:
每次加密不大于64位;
加密算法和解密算法相同,不能适用于公钥算法;
运用相同的密钥和初始向量的时候,相同明文运用CFB形式加密输出相同的密文;
能够运用不同的初始化变量使相同的明文产生不同的密文,防止字典进犯;
加密强度依赖于密钥长度;
加密块长度过小时,会添加循环的数量,导致开支添加;
加密块长度应为8位的整数倍(即字节为单位);
一旦某位数据出错,会影响目前和这以后8个块的数据
我的总结
ECB/CBC形式对数据进行8字节分块,而OFB形式能够更小分块来核算,这个分块巨细在C#的DESCryptoServiceProvider
类中称为FeedbackSize
,以bit位为单位,经测试C#中该值只能为8bit,也便是只能逐字节核算,但我以为理论上能够分16bit、24bit字节等来核算,只要该值不超过IV向量的巨细(也便是64bit)就行。
加密示例(FeedbackSize=8)
明文:11 22 33 44 55 66 77 88
密钥:12 34 56 78 90 11 22 33
初始IV:AA BB CC DD 77 88 99 55
第一步:用密钥对初始IV进行ECB形式加密得到X=B9 EF 8C 84 E2 B5 FF 53
第二步:用X的第1字节B9 与 明文的第1字节11 进行异或 得到密文的第1字节A8
第三步:将初始IV左移8位,最右边填充密文的第1字节A8,得到新的IV=BB CC DD 77 88 99 55 A8
第四步:用密钥对新的IV进行ECB形式加密得到X=34 91 48 8F BA A2 FC 18
第五步:用X的第1字节34 与 明文的第2字节22 进行异或 得到密文的第2字节16
第六步:将IV左移8位,最右边填充密文的第2字节16,得到新的IV=CC DD 77 88 99 55 A8 16,用密钥对新的IV进行ECB形式加密得到X=99 42 70 47 50 9A B8 DC,用X的第1字节99 与 明文的第3字节33 进行异或 得到密文的第3字节AA
…..
第N步:依此类推,终究得到8字节密文A8 16 AA 7B 36 B3 5F D6
解密示例(FeedbackSize=8)
密文:A8 16 AA 7B 36 B3 5F D6
密钥:12 34 56 78 90 11 22 33
初始IV:AA BB CC DD 77 88 99 55
第一步:用密钥对初始IV进行ECB形式加密得到X=B9 EF 8C 84 E2 B5 FF 53
第二步:用X的第1字节B9 与 密文的第1字节A8 进行异或 得到明文的第1字节11
第三步:将初始IV左移8位,最右边填充密文的第1字节A8,得到新的IV=BB CC DD 77 88 99 55 A8
第四步:用密钥对新的IV进行ECB形式加密得到X=34 91 48 8F BA A2 FC 18
第五步:用X的第1字节34 与 密文的第2字节16 进行异或 得到明文的第2字节22
第六步:将IV左移8位,最右边填充密文的第2字节16,得到新的IV=CC DD 77 88 99 55 A8 16,用密钥对新的IV进行ECB形式加密得到X=99 42 70 47 50 9A B8 DC,用X的第1字节99 与 密文的第3字节AA 进行异或 得到明文的第3字节33
…..
第N步:依此类推,终究得到8字节明文11 22 33 44 55 66 77 88
OFB形式
OFB形式(输出反应:Output feedback),OFB是先用块加密器生成密钥流(Keystream),然后再将密钥流与明文流异或得到密文流,解密是先用块加密器生成密钥流,再将密钥流与密文流异或得到明文,由于异或操作的对称性所以加密和解密的流程是完全相同的。
OFB与CFB相同都十分适合对流数据的加密,OFB由于加密和解密都依赖与前一段数据,所以加密和解密都不能并行。
特色:
与CFB相似,以下都是不同之处;
因为密文没有参加链操作,所以使得OFB形式更简单受到进犯;
不会进行错误传播,某位密文产生错误,只会影响该位对应的明文,而不会影响其他位;
不是自同步的,如果加密和解密两个操作失去同步,那么系统需要从头初始化;
每次从头同步时,应运用不同的初始向量。能够防止产生相同的比特流,防止”已知明文”进犯 ;