>

支持中文,NET中的DES对称加密

- 编辑:金沙国际平台登录 -

支持中文,NET中的DES对称加密

目录

DES是一种对称加密(Data Encryption Standard)算法,于一九八零年赢得United States政党的正儿八经批准,是一种用伍十八位密钥来加密六12个人数据的格局。一般密码长度为8个字节,个中五17位加密密钥,每一种第8位都看作奇偶校验。

  • ECB形式介绍
  • pkcs5padding和pkcs7padding的区别
  • python实现
  • 注意事项

DES算法一般有多个关键点,第三个是加密情势,第一个是多少补位,加密格局的严重性意义便是,加密算法是按块实行加密的,举个例子DES ,是 64Bit 三个块的进行加密,就是历次加密 8 个字节,由此老是输入多少个字节的通晓输出五个字节密文,假设是 十五个字节,那么分成四个块依次举行加密,难点就出今后此处,假如公开是 1234567812345678,分块分别开展加密,那么加密的结果类似“C4132737962C519C C4132737962C519C”,能够旁观明文的规律,那便是 ECB 加密格局,密文能够见到明文的原理;为了缓慢解决这几个难点,有了别的的加密情势:CBC 加密情势,CFB加密格局,OFB加密形式CBC 是讲求给一个伊始化的向量,然后将各种输出与该向量作运算,并将运算的结果作为下叁个加密块的初步化向量,CFB 和 OFB 则没有必要提供初步化向量,直接将密码依然输出作为早先化向量举办演算;那样就防止了堂而皇之的准绳出现在密文中;当然劣势是解密时须求保险密文的准确性,借使网络传输时爆发了一部分错误,则后边的解密结果就可能是不当的;(ECB情势仅影响传输错误的老大块。密码算法基本上都以分组进行加密的,假若密文长度不是刚刚好能够实行分组,怎么做?只可以进展填空。

ECB格局介绍

电码本形式(Electronic Codebook Book
这种情势是将全数明文分成若干段一样的小段,然后对每一小段打开加密。
图片 1

加密算法常见的有ECB格局和CBC形式:
首先种电子密本格局
ECB格局:电子密本格局,正是将数据依照8个字节一段进展DES加密或解密得到一段8个字节的密文只怕明文,最终一段不足8个字节,则补足8个字节(注意:这里就提到到数码补位了)进行测算,之后根据顺序将计算机本领切磋所得的数码连在一齐就能够,各段数据里面互不影响。将公开分成n个64比特分组,假如公开长度不是64比特的翻番,则在明文末尾填充适当数指标鲜明符号。对明文组用给定的密钥分别开展加密,行密文C=(C0,C1,……,Cn-1)当中Ci=DES,i=0,1,…..,n-1。 这是Java封装的DES算法的暗许情势.
其次种密文分组链接格局

pkcs5padding和pkcs7padding的区别

pkcs5padding和pkcs7padding都以用来填充数据的一种格局。在ECB中,数据是分块加密的。假如急需加密的多寡的字节码的长短不是块大小的整数倍就须要填写。
使用PKCS5,填充时:
要填充7个字节,那么填入的值正是0×7;
一旦只填充1个字节,那么填入的值正是0×1;
刚好8个字节时还要补8个字节的0×08
多亏这种就是恰好是8个字节也亟需再补充字节的规定,能够让解密的数量很显明科学的移除多余的字节。
图片 2
PKCS7和PKCS5的分别是数据块的深浅;

  • PKCS5填充块的高低为8bytes
  • PKCS7填充块的大大小小能够在1-255bytes中间。

因为AES并从未六19个人的块, 假设接纳PKCS5, 那么真相上正是选拔PKCS7

密文分组链接格局,在CBC格局下,各种明文组xi在加密前与先一组密文按位模二加后,再送到DES加密,CBC方式克制了ECB格局报内组重的弱项,但由于明文组加密前与一组密文有关,由之前一组密文的失实会传出到下一组。 那是.NET封装的DES算法的暗中认可情势,它比较麻烦,加密步骤如下:

python实现

设置所需求的包

pip install pycryptodome

python代码

# -*- coding:utf-8 -*-import base64from Crypto.Cipher import AESclass EncryptDate:    def __init__(self, key):        self.key = key  # 初始化密钥        self.length = AES.block_size  # 初始化数据块大小        self.aes = AES.new(self.key, AES.MODE_ECB)  # 初始化AES,ECB模式的实例        # 截断函数,去除填充的字符        self.unpad = lambda date: date[0:-ord]          def pad(self, text):        """        #填充函数,使被加密数据的字节码长度是block_size的整数倍        """        count = len(text.encode('utf-8'))        add = self.length - (count % self.length)        entext = text +  * add)        return entext    def encrypt(self, encrData):  # 加密函数        res = self.aes.encrypt(self.pad.encode("utf8"))        msg = str(base64.b64encode, encoding="utf8")        return msg    def decrypt(self, decrData):  # 解密函数        res = base64.decodebytes(decrData.encode("utf8"))        msg = self.aes.decrypt.decode("utf8")        return self.unpadeg = EncryptDate("iiiioooojjjjpppp")  # 这里密钥的长度必须是16的倍数res = eg.encrypt("中文测试!")printprint(eg.decrypt

运维效果
图片 3
可点击这里在线加解密,验证一下
图片 4

1、首先将数据根据8个字节一组举办分组得到D1D2……Dn(若数据不是8的卡尺头倍,就事关到多少补位了)

注意事项

  1. 慎选安装pycryptodome并不是pycrypto(安装pycrypto在python的有些版本会报错)
  2. 加密华语供给加密的是字节码并非字符串
  3. pad函数中总结长度的时候总结的也是转换来字节码后的长度实际不是字符串的长度
  4. 留意Linux下的换行符是n,Windows下的换行符是rn(跨平台传输加密后的文书,在写入时要求小心)

2、第一组数据D1与向量I异或后的结果举办DES加密获得第一组密文C1(注意:这里有向量I的传道,ECB方式下未有应用向量I)

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

4、之后的多少就那样类推,获得Cn

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

其三种密文反馈格局,可用以体系密码
明文X=(x0,x1,……,xn-1),在那之中xi由t个比特组成0 第多种输出反馈方式,可用来连串密码
与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# 加密的数码
  • Applied Crypto++: Block Ciphers

本文由编程发布,转载请注明来源:支持中文,NET中的DES对称加密