补充:
- 通信前服务端发送RSA公钥给客户端,客户端接收后,使用该RSA公钥加密DES密钥,发送给服务端;
- 服务端接收加密后的DES密钥,使用手上的RSA私钥进行解密,此后双方内容经过DES加密,双方正式开始通信。
- key:8个字节的密钥
- data:所需加密或解密的数据
- mode:加密或者解密
一、初始置换和逆置换
- 初始置换:明文以64位分组,每组将64位明文按照置换表进行置换,后分成左右两部分L0和R0。
- 逆置换:位于加解密的最后一步,目的是打乱原有64位的顺序。
二、f函数
-
第一步,将32位数据根据扩展表扩展为48位。
-
第二步,两者异或作为S盒的输入。
-
第三步,将第二步得到的48位结果分为8组,每组6bit,查找S盒置换。
**PS:**6位中高低2位作为行数,中间4位作为列数,查找对应值即为替换后的值,行列数是从0开始的。
-
最后一步,将S盒压缩后的32位数进行P置换,得到f函数结果。
三、子密钥生成
- 第一步去掉奇偶校验位,64位密钥根据PC1表置换为56位。
- 第二步 上一步得到的56位结果分为左右各28位,根据循环移位表分别进行循环移位,并拼接。
- 第三步,结果再按PC2表进行压缩置换,去掉某些位,得到48位子密钥。
- 循环16次,得到16轮的密钥。
四、加密
- 第一步,初始置换IP,位数是从左往右的,最左为第一位。
- 第二步,将64位明文分成左右各32位。
- 第三步,进行16轮迭代。
- 第四步,合并left和right。
- 最后一步,逆初始置换y=IP-1(L16R16)。
五、解密
- 逆序使用子密钥,与加密相同的操作。
六、目录结构
|-tcp-des-chat
|-des-src //DES算法实现
|-const.h //一些DES用到的常量,如置换表
|-des.h //封装的DES类,供外部调用加密和解密操作
|-des.cpp //DES类成员的实现
|-main.cpp //DES加解密功能测试
|-Makefile //使用make编译Des模块,执行main
|-rsa-src //RSA算法实现
|-tools.h //一些RSA的辅助函数实现
|-rsa.h //封装的RSA类
|-rsa.cpp
|-main.cpp // RSA 功能测试
|-Makefile //单独编译RSA模块,执行main
|-config.h//客户端和服务端共用的函数和常量
|-tcp-client.cpp//客户端实现
|-tcp-server.cpp//服务端实现
|-Makefile //make编译链接生成client和server可执行程序
七、参考文章