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命名空间下提供了DESCryptoServiceProvider作为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向量,加密结果尚且同。

 

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

  • C与C#报道加密之C语言DES的cbc
    pkcs7的落实
  • C与C#报道加密之C语言DES的cbc
    pkcs7的落实(二)
  • python和c#通用一致的des加密应用CBC和PKCS7
  • php实现3DES加密算法,工作模式CBC,填充模式PKCS7
    Padding
  • 用 Java 解密 C#
    加密的多寡C语言(DES)
  • Applied Crypto++: Block
    Ciphers