DES加密

加密原理及流程

DES是一种将64比特的明文加密成64比特密文的对称密码算法,密钥长度56比特。64比特的单位称为分组,DES是分组密码的一种。DES,又称Feistel密码,在Feistel网络中,加密的各个步骤称为轮,整个加密过程就是进行若干次轮的循环。

(R0和K1,经过轮运算,再与L0异或。)

一)IP置换,按照初始置换表,将原来的64位二进制重新排序。

 

(将原始数据第58位的数转化为第一个,将原始数据50的数转化为第二个......)

二)16轮的轮函数F变换。轮函数F由3个部分组成:扩展置换(E盒),非线性代换(S盒)和线性置换(P盒)。

E盒的作用是将32为扩展为48位,其扩展规则按下表进行。该表大小为6*8,去掉最左和最右两行,中间的四列包含了1-32的顺序。第1列和第6列分别是对第4和第1列的扩展。经过扩展置换,32位的输入得到了48位的输出;S盒的作用是进行非线性代换。

32比特数据分为8组长度为4比特的数据。增加的第一个数据是前一组原始数据最后一位,增加的最后一个数据是后一组原始数据的第一位。

例如:

 

 S盒是DES中唯一的非线性部分,DES的安全强度主要取决于S盒的安全程度。S盒运算其实是一个查表运算。在E盒的扩展之后得到了48位的数据,将其和48位的子密钥进行异或运算,这是密钥参与运算的步骤。将其分成8个组,每组6个,送到8个S盒中去。每一个S盒都是一个6位输入4位输出的结构,也就是说,48位输入到8个S盒会得到4*8=32位的输出。6位输入到8位输出的映射关系如下表所示,其中,第一位和最后一位作为行号,第二位到第五位最为列号。例如,101100,则行号为10=2,列号为0110=6。查得(2,6)=2,化成二进制位0010。注意,8个S盒的映射关系各不相同。

 

经查询表可得一个数,再转化为二进制。原始的六比特转化为四比特,得到32比特数据。

img

P盒的作用只是进行简单的位置置换,只是简单地把一位换成另一位,不进行扩展和压缩。经过P盒操作,32位的输入得到32位的输出。

三)进行IP的逆置换得到密文。

密钥生成

DES使用一个56位的初始密钥,但提供的其实是一个64位的值,第8位、16位、32位、40位、48位、56位、64位是奇偶校验位,首先要去位。64bit的初始密钥,经过置换盒子——PC-1盒,去掉奇偶校验位,得到56bit,分成左右两部分,各28bit,经过密钥位移表,得到新的数据,合并后经过置换选择PC-2得到密钥。

 代码编写

加密与解密算法类似,加密算法实现思路:
Step1:从文件中读取明文;
Step2:将明文利用ASCII换成01比特流;
Step3:将明文比特流每64位分为一组,最后不足的用0补齐;
Step4:对64位比特加密操作(进行IP置换,16轮的Feistel变换、交换L、R、IP逆置换,将L、R合并为密文比特流);
Step5:将每一组密文比特流合并转换成密文字符保存至文件。
1)文件读入模块

2)文件写入模块

def write_file(message): 输入需要写入字符串,即可生成含有该字符串的text.txt文件。 

3)字符串转01比特流

  每一个字符利用ord( )函数转化成对应ASCII值,利用bin( )将其转换成二进制字符串。

4)01比特流转字符
  def bit_str(bits): 输入01比特串(长度要是8的倍数),返回对应的字符,核心代码如下,主要利用int( )和chr( )函数。

5)密钥字符串转比特流
  假定密钥比特流的8、16、24、32、40、48、56、64位采用偶校验方式,分别校验其前面的7位01串。密钥字符串依然采用ASCII编码方式,一个字符占7位,第8位采用偶校验方式

 6)对比特流分组
  函数定义如下,最后一组位数不足即补0。

 7)IP置换
  为了实现简单,提前将IP、IP_RE、PC_1、PC_2、E、P、S等盒值写入文件DES_BOX.py,主函数即可直接调用。IP置换实现如下:

 8.)PC_1置换
实现代码同IP置换。
9.)比特串左移
def key_leftshift(key_str,num): 将输入的01比特流key_str循环左移num位返回。
10.)PC_2置换
实现代码同IP置换。
11.)16轮密钥生成

 12)E置换
  实现代码同IP置换。
13)异或运算
  将输入的两个字符串逐位运算。

14)单次S盒查找 

 15)S盒变换
  def S_change(bits): 输入48bit字符串,输出经过S盒之后的32bit字符串。调用8次单次S盒查找函数:

 16)P置换

17)F函数
  通过调用12-16模块即可实现第 i i i轮F函数运算:

 18)IP逆置换
  实现代码同IP置换。
19)64bit加密
  调用IP置换、16轮密钥生成、F函数、异或运算、IP逆置换等模块可以实现64bit一组明文的加密:

 20)64bit解密
  def des_decrypt(bits,key):该模块与64bit加密模块流程相同,不同在于16个密钥使用顺序相反,16轮代换代码如下,其余代码同加密。

21)整体加密模块
  def all_des_encrypt(message,key): 读入明文字符串message,以及密钥字符串key,返回加密后01比特流。通过调用字符串转01比特流、密钥字符串转比特流、对比特流分组、64bit加密等模块即可实现。

 

22)整体解密模块
def all_des_decrypt(message,key): 读入明文字符串message,以及密钥字符串key,返回解密后01比特流。与加密类似。

23) 主模块

输出提示语,并与用户交互。通过调用文件读入或写入、字符串转01比特流、比特流转01字符串、加解密等模块实现,伪代码如下:

 

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值