C语言.NET中的DES对称加密

DES是一种对称加密(Data Encryption
Standard)算法,于1977年拿到美利哥政党的标准批准,是一种用56位密钥来加密64位数据的措施。一般密码长度为8个字节,其中56位加密密钥,每个第8位都用作奇偶校验。

DES算法一般有几个关键点,第一个是加密形式,第二个是数据补位,加密情势的重大意义就是,加密算法是按块举办加密的,例如
DES ,是 64Bit 一个块的进展加密,就是历次加密 8
个字节,由此老是输入七个字节的公开输出两个字节密文,假使是 16
个字节,那么分成六个块依次举办加密,问题就出现在这边,假设公开是
1234567812345678,分块分别展开加密,那么加密的结果类似“C4132737962C519C
C4132737962C519C”,可以看出明文的法则,这就是 ECB
加密格局,密文可以看来明文的原理;为理解决这个题目,有了其余的加密形式:CBC
加密情势(密码分组连接),CFB加密格局(密码反馈情势),OFB加密格局(输出反馈格局)CBC
是讲求给一个起首化的向量,然后将各类输出与该向量作运算,并将运算的结果作为下一个加密块的最先化向量,CFB
和 OFB
则不需要提供开端化向量,直接将密码仍然输出作为起头化向量举办演算;这样就制止了堂而皇之的原理出现在密文中;当然缺点是解密时索要保证密文的不易,假设网络传输时暴发了一局部错误,则后边的解密结果就可能是错误的;(ECB形式仅影响传输错误的要命块。密码算法基本上都是分组(按快)举行加密的,假诺密文长度不是刚刚好可以开展分组,怎么做?只好举行填写。

加密算法常见的有ECB形式和CBC形式:
率先种电子密本形式(ECB) 
     
ECB格局:电子密本情势,就是将数据依据8个字节一段展开DES加密或解密拿到一段8个字节的密文或者明文,最后一段不足8个字节,则补足8个字节(注意:这里就提到到数码补位了)举办测算,之后按照顺序将总括所得的数码连在一起即可,各段数据里面互不影响。将公开分成n个64比特分组,假若公开长度不是64比特的翻番,则在明文末尾填充适当数目的规定符号。对明文组用给定的密钥分别展开加密,行密文C=(C0,C1,……,Cn-1)其中Ci=DES(K,xi),i=0,1,…..,n-1。
那是Java封装的DES算法的默认情势.
第两种密文分组链接格局(CBC)  

     
密文分组链接形式,在CBC模式下,每个明文组xi在加密前与先一组密文按位模二加后,再送到DES加密,CBC形式制伏了ECB情势报内组重的短处,但鉴于明文组加密前与一组密文有关,因以前一组密文的谬误会传来到下一组。
这是.NET封装的DES算法的默认情势,它相比较辛劳,加密步骤如下:

1、首先将数据遵照8个字节一组开展分组得到D1D2……Dn(若数据不是8的整数倍,就涉嫌到数量补位了)

2、第一组数据D1与向量I异或后的结果举行DES加密得到第一组密文C1(注意:这里有向量I的说教,ECB格局下并未接纳向量I)

3、第二组数据D2与第一组的加密结果C1异或未来的结果举办DES加密,得到第二组密文C2

4、之后的数目以此类推,得到Cn

5、按顺序连为C1C2C3……Cn即为加密结果。

其二种密文反馈格局(CFB),可用以连串密码
   明文X=(x0,x1,……,xn-1),其中xi由t个比特组成0  
第四种输出反馈情势(OFB),可用于系列密码
  
与CFB唯一不同的是OFB是直接取DES输出的t个比特,而不是取密文的t个比特,其它都与CFB相同。但它取的是DES的输出,所以它打败了CFB的密文错误传播的短处

多少补位一般有NoPadding和PKCS7Padding(Java中是PKCS5Padding)填充形式,PKCS7Padding和PKCS5Padding实际只是钻探不相同,依照相关资料证实:PKCS5Padding明确概念了加密块是8字节,PKCS7Padding加密快可以是1-255之间。可是封装的DES算法默认都是8字节,所以可以认为他俩一如既往。数据补位实际是在数量不满8字节的倍数,才补偿到8字节的翻番的填充过程。

NoPadding填充格局:算法本身不填充,比如.NET的padding提供了有None,Zeros情势,分别为不填充和填充0的情势。

PKCS7Padding(PKCS5Padding)填充形式:为.NET和Java的默认填充形式,对加密数据字节长度对8取余为r,如r大于0,则补8-r个字节,字节为8-r的值;尽管r等于0,则补8个字节8.比如:

加密字符串为为AAA,则补位为AAA55555;加密字符串为BBBBBB,则补位为BBBBBB22;加密字符串为CCCCCCCC,则补位为CCCCCCCC88888888.

.NET中的DES加密

对于.NET,框架在System.Security.Cryptography命名空间下提供了DESCrypto瑟维斯(Service)(Service)Provider作为System.Security.Cryptography.DES加密解密的包裹接口,它提供了之类的4个方法:

public override ICryptoTransform CreateDecryptor(byte[] rgbKey,
byte[] rgbIV)

public override ICryptoTransform CreateEncryptor(byte[] rgbKey,
byte[] rgbIV)

public override void GenerateIV()

public override void GenerateKey()

从.NET类库封装境况,加解密需要传入一个Key和IV向量。而且Key必须为8字节的数量,否则会一向抛极度出来,当使用ECB格局下,不管传入什么IV向量,加密结果都无异。

 

各大语言互操作解决方案: