加密原理及流程
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比特数据。
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字符串、加解密等模块实现,伪代码如下: