虽以数据论8只字节一段进展DES加密或解密得到一致段落8独字节的密文或者明文。就是将数据论8单字节一截进展DES加密或解密得到同段8独字节的密文或者明文。则补位为CCCCCCCC88888888

DES是同等种植对如加密(Data Encryption
Standard)算法,于1977年拿走美国政府之正式认可,是平种植用56位密钥来加密64号数据的主意。一般密码长度为8独字节,其中56各类加密密钥,每个第8各项都用作奇偶校验。

DES是同样种植对如加密(Data Encryption
Standard)算法,于1977年得美国政府的业内批准,是一样栽用56各类密钥来加密64各类数据的不二法门。一般密码长度为8个字节,其中56各加密密钥,每个第8个还作为奇偶校验。

1. 背景

DES算法一般发生有限只重大点,第一只凡是加密模式,第二独凡是数码补位,加密模式之机要意义就是,加密算法是准块进行加密的,例如
DES ,是 64Bit 一个片的进行加密,就是历次加密 8
个字节,因此老是输入八单字节的公开输出八只字节密文,如果是 16
只字节,那么分成两独片依次进行加密,问题即应运而生于此,如果公开是
1234567812345678,分块分别进行加密,那么加密的结果类似“C4132737962C519C
C4132737962C519C”,可以看到明文的原理,这就是 ECB
加密模式,密文可以看看明文的法则;为了化解者问题,有矣另外的加密模式:CBC
加密模式(密码分组连接),CFB加密模式(密码反馈模式),OFB加密模式(输出反馈模式)CBC
是讲求给一个初始化的向量,然后用每个输出及该为量作运算,并将运算的结果作下一个加密块的初始化向量,CFB
和 OFB
则无需提供初始化向量,直接拿密码要输出作为初始化向量进行演算;这样虽避免了明的法则起在密文中;当然缺点是解密时需要确保密文的正确,如果网络传输时产生了平等有错误,则后面的解密结果虽可能是谬误的;(ECB模式仅影响传输错误的那个块。密码算法基本上都是分组(按快)进行加密的,如果密文长度不是刚好得开展分组,怎么处置?只能进行填空。

  DES算法一般有点儿个重大点,第一个是加密模式,第二单凡是多少补位,加密模式之重要意义就是,加密算法是遵循块进行加密的,例如
DES ,是 64Bit 一个块的开展加密,就是每次加密 8
只字节,因此老是输入八独字节的公开输出八独字节密文,如果是 16
个字节,那么分成两单片依次进行加密,问题就涌出于这边,如果公开是
1234567812345678,分块分别展开加密,那么加密的结果类似”C4132737962C519C
C4132737962C519C”,可以看到明文的法则,这便是 ECB
加密模式,密文可以看来明文的规律;为了解决这个题材,有矣其它的加密模式:CBC
加密模式(密码分组连接),CFB加密模式(密码反馈模式),OFB加密模式(输出反馈模式)CBC
是求受一个初始化的朝向量,然后将每个输出和该向量作运算,并拿运算的结果当下一个加密块的初始化向量,CFB
和 OFB
则无待提供初始化向量,直接以密码还是输出作为初始化向量进行演算;这样即便避免了堂而皇之的规律起在密文中;当然缺点是解密时需确保密文的不利,如果网络传输时有了一如既往片错误,则后面的解密结果就可能是不当的;(ECB模式仅影响传输错误的坏块。密码算法基本上都是分组(按快)进行加密的,如果密文长度不是正好得拓展分组,怎么惩罚?只能进展填写。

近年型以交接第三正在产品,传输过程被干到多少加密, 数据加密流程也:

  • 发送数据DES加密
  • DES加密后底数开展base64编码
  • 出殡,接受多少
  • 领读取的数码开展base64解码
  • base64解码完的数额机型DES解密

    是因为采用golang对接,文档且不论说明情况下,默认使用CBC模式加解密,导致大丰富日子针对连接不齐。
    后透过对方Java
    Demo代码查看得知采用ECB加密模式,Java默认DES算法使用DES/ECB/PKCS5Padding工作法,在GO语言中以ECB的脆弱性,DES的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)  

  加密算法常见的有ECB模式与CBC模式:

DES介绍

DES 使用一个 56 位的密钥以及附加的 8 位奇偶校验位,产生无限可怜 64
位的分组大小。这是一个迭代的分组密码,使用称为 Feistel
的技艺,其中以加密的文本块分成两半。使用子密钥对中一半使循环功能,然后以出口以及其它一半进展”异或”运算;接着交换这有限半,这同了程会继续下去,但说到底一个循环往复不交换。DES
使用 16 单循环,使用异或,置换,代换,移位操作四种基本运算。

     
密文分组链接道,在CBC方式下,每个明文组xi在加密前同先行一组密文按位模二加后,再送及DES加密,CBC方式克服了ECB方式报内组重的缺点,但由明文组加密前和同样组密文有关,因此前一组密文的谬误会流传到下同样组。
这是.NET封装的DES算法的默认模式,它比较费心,加密步骤如下:

  第一种植电子密本方式(ECB)

DES常见加密模式

1、首先以数据以8单字节一组进行分组得到D1D2……Dn(若数据未是8底平头倍增,就提到到数码补位了)

  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(加密分组链接模式)

密文分组链接方式,这是golang和.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即为加密结果。
  • 数量补位一般生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。

2、第一组数据D1与向量I异或后的结果开展DES加密得到第一组密文C1(注意:这里发出于量I的传道,ECB模式下没以于量I)

  第二种密文分组链接方式(CBC)

ECB(电子密码按照模式)

电子密本方式,这是JAVA卷入的DES算法的默认模式,就是将数据据8个字节一截进行DES加密或解密得到同段8只字节的密文或者明文,最后一段落不足8独字节,则补足8个字节(注意:这里就是关系到数量补位了)进行计算,之后依顺序将计所得的数目连在一起即可,各段数据中互不影响。

3、第二组数D2与第一组的加密结果C1异或后的结果进行DES加密,得到第二组密文C2

  密文分组链接方式,在CBC方式下,每个明文组xi在加密前与先行一组密文按位模二加后,再送及DES加密,CBC方式克服了ECB方式报内组重的弱点,但出于明文组加密前同同一组密文有关,因此前一组密文的荒谬会传及下同样组。
这是。NET封装的DES算法的默认模式,它于费心,加密步骤如下:

CFB(加密汇报模式)

加密上报模式克服了欲等8个字节才会加密的短,它使用了分组密码作为流密码的密钥流生成器;

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

  1、首先以数据以8只字节一组进行分组得到D1D2……Dn(若数据未是8底平头倍,就涉嫌到数量补位了)

OFB(输出反馈模式)

和CFB模式不同之处在于,
加密位移寄存器与密文无关了,仅及加密key和加密算法有关;
做法是不再把密文输入到加密移动寄存器,而是将出口的分组密文(Oi)输入到同一各项寄存器;

5、按梯次并为C1C2C3……Cn即为加密结果。

  2、第一组数据D1与向量I异或后的结果进行DES加密得到第一组密文C1(注意:这里有向量I的说教,ECB模式下没有行使于量I)

DES加密之golang的CBC和ECB模式代码实现

其三栽密文反馈方式(CFB),可用以序列密码
   明文X=(x0,x1,……,xn-1),其中xi由t个比较特组成0  
第四种植输出反馈方式(OFB),可用来序列密码
  
与CFB唯一不同之是OFB是一直取DES输出的t个比特,而不是取密文的t个比特,其余都同CFB相同。但其得到的凡DES的出口,所以它们克服了CFB的密文错误传播的缺陷

  3、第二组数D2与第一组的加密结果C1异或下的结果进行DES加密,得到第二组密文C2

CBC和ECB模式加密

func DesECBEncrypt(data, key []byte)([]byte, error) {
    block, err := des.NewCipher(key)
    if err != nil {
        return nil, err
    }
    bs := block.BlockSize()
    data = PKCS5Padding(data, bs)
    if len(data)%bs != 0 {
        return nil, errors.New("Need a multiple of the blocksize")
    }
    out := make([]byte, len(data))
    dst := out
    for len(data) > 0 {
        block.Encrypt(dst, data[:bs])
        data = data[bs:]
        dst = dst[bs:]
    }
    return out, nil
}

func DesCBCEncrypt(origData, key []byte) ([]byte, error) {
    block, err := des.NewCipher(key)
    if err != nil {
        return nil, err
    }
    origData = PKCS5Padding(origData, block.BlockSize())
    // origData = ZeroPadding(origData, block.BlockSize())
    blockMode := cipher.NewCBCEncrypter(block, key)
    crypted := make([]byte, len(origData))
    // 根据CryptBlocks方法的说明,如下方式初始化crypted也可以
    // crypted := origData
    blockMode.CryptBlocks(crypted, origData)
    return crypted, nil
}

func PKCS5Padding(ciphertext []byte, blockSize int) []byte {
    padding := blockSize - len(ciphertext)%blockSize
    padtext := bytes.Repeat([]byte{byte(padding)}, padding)
    return append(ciphertext, padtext...)
}

多少补位一般有NoPadding和PKCS7Padding(Java中凡是PKCS5Padding)填充方式,PKCS7Padding和PKCS5Padding实际只有是商不一致,根据有关资料证实:PKCS5Padding明确定义了加密畈是8字节,PKCS7Padding加密快好是1-255里边。但是封装的DES算法默认都是8字节,所以可以当他俩一致。数据补位实际是在数量不满8字节之翻番,才上及8字节底倍数的填充过程。

  4、之后的数码为此类推,得到Cn

CBC和ECB模式解密

func DesECBDecrypt(data, key []byte)([]byte, error) {
    block, err := des.NewCipher(key)
    if err != nil {
        return nil, err
    }
    bs := block.BlockSize()
    if len(data)%bs != 0 {
        return nil, errors.New("crypto/cipher: input not full blocks")
    }
    out := make([]byte, len(data))
    dst := out
    for len(data) > 0 {
        block.Decrypt(dst, data[:bs])
        data = data[bs:]
        dst = dst[bs:]
    }
    out = PKCS5UnPadding(out)
    return out, nil
}

func DesCBCDecrypt(crypted, key []byte) ([]byte, error) {
    block, err := des.NewCipher(key)
    if err != nil {
        return nil, err
    }
    blockMode := cipher.NewCBCDecrypter(block, key)
    //origData := make([]byte, len(crypted))
    origData := crypted
    blockMode.CryptBlocks(origData, crypted)
    //origData = PKCS5UnPadding(origData)

    origData = PKCS5UnPadding(origData)
    return origData, nil
}

func PKCS5UnPadding(origData []byte) []byte {
    length := len(origData)
    unpadding := int(origData[length-1])
    return origData[:(length - unpadding)]
}

NoPadding填充方式:算法本身不填充,比如.NET的padding提供了发出None,Zeros方式,分别吗未填和填充0的道。

  5、按梯次并也C1C2C3……Cn即为加密结果。

总结

因要求使技术,技术本身没有优略之分,只有工作的分。

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

  第三栽密文反馈方式(CFB),可用以序列密码

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

  明文X=(x0,x1,……,xn-1),其中xi由t个比特组成0  
第四种输出反馈方式(OFB),可用以序列密码

.NET中的DES加密

  与CFB唯一不同的凡OFB是直取DES输出的t个比特,而非是取密文的t个比特,其余都同CFB相同。但她赢得之是DES的输出,所以其克服了CFB的密文错误传播之欠缺

对于.NET,框架在System.Security.Cryptography命名空间下提供了DESCryptoServiceProvider作为System.Security.Cryptography.DES加密解密的包装接口,它提供了之类的4单主意:

  数据补位一般发生NoPadding和PKCS7Padding(Java受到凡PKCS5Padding)填充方式,PKCS7Padding和PKCS5Padding实际只是协议免一样,根据相关资料证实:PKCS5Padding明确概念了加密畈是8字节,PKCS7Padding加密快得是1-255里面。但是封装的DES算法默认都是8字节,所以可以认为他们同样。数据补位实际是以数不满8字节之翻番,才补偿到8字节底倍数的填过程。

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

  NoPadding填充方式:算法本身不填充,比如。NET的padding提供了发生None,Zeros方式,分别吗非填和填充0的办法。

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

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

public override void GenerateIV()

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

public override void GenerateKey()

  .NET中的DES加密

从.NET类似库封装情况,加解密需要传入一个Key和IV向量。而且Key必须也8字节底多寡,否则会直接扔大出,当用ECB模式下,不管传入什么IV向量,加密结果都一样。

  对于。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)

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

  public override void GenerateIV()

  public override void GenerateKey()

  从。NET类库封装情况,加解密需要传入一个Key和IV向量。而且Key必须也8字节的数码,否则会直接丢弃大出,当以ECB模式下,不管传入什么IV向量,加密结果尚且同一。

相关文章