DES加密解密
发表于:2024-11-19 作者:千家信息网编辑
千家信息网最后更新 2024年11月19日,#include "memory.h"#include "stdio.h"#include "conio.h"enum {ENCRYPT,DECRYPT};// ENCRYPT:加密,DECRY
千家信息网最后更新 2024年11月19日DES加密解密
#include "memory.h"#include "stdio.h"#include "conio.h"enum {ENCRYPT,DECRYPT};// ENCRYPT:加密,DECRYPT:解密void Des_Run(char Out[8], char In[8], bool Type=ENCRYPT);void Des_SetKey(const char Key[8]);// 设置密钥static void F_func(bool In[32], const bool Ki[48]);// f 函数static void S_func(bool Out[32], const bool In[48]);// S 盒代替static void Transform(bool *Out, bool *In, const char *Table, int len);// 变换static void Xor(bool *InA, const bool *InB, int len);// 异或static void RotateL(bool *In, int len, int loop);// 循环左移static void ByteToBit(bool *Out, const char *In, int bits);// 字节组转换成位组static void BitToByte(char *Out, const bool *In, int bits);// 位组转换成字节组//置换IP表const static char IP_Table[64] = { 58,50,42,34,26,18,10,2,60,52,44,36,28,20,12,4, 62,54,46,38,30,22,14,6,64,56,48,40,32,24,16,8, 57,49,41,33,25,17,9,1,59,51,43,35,27,19,11,3, 61,53,45,37,29,21,13,5,63,55,47,39,31,23,15,7};//逆置换IP-1表const static char IPR_Table[64] = { 40,8,48,16,56,24,64,32,39,7,47,15,55,23,63,31, 38,6,46,14,54,22,62,30,37,5,45,13,53,21,61,29, 36,4,44,12,52,20,60,28,35,3,43,11,51,19,59,27, 34,2,42,10,50,18,58,26,33,1,41,9,49,17,57,25};//E位选择表(扩展置换表)static const char E_Table[48] = { 32,1,2,3,4,5,4,5,6,7,8,9, 8,9,10,11,12,13,12,13,14,15,16,17, 16,17,18,19,20,21,20,21,22,23,24,25, 24,25,26,27,28,29,28,29,30,31,32,1};//P换位表(单纯换位表)const static char P_Table[32] = { 16,7,20,21,29,12,28,17,1,15,23,26,5,18,31,10, 2,8,24,14,32,27,3,9,19,13,30,6,22,11,4,25};//PC1选位表(密钥生成置换表1)const static char PC1_Table[56] = { 57,49,41,33,25,17,9,1,58,50,42,34,26,18, 10,2,59,51,43,35,27,19,11,3,60,52,44,36, 63,55,47,39,31,23,15,7,62,54,46,38,30,22, 14,6,61,53,45,37,29,21,13,5,28,20,12,4};//PC2选位表(密钥生成置换表2)const static char PC2_Table[48] = { 14,17,11,24,1,5,3,28,15,6,21,10, 23,19,12,4,26,8,16,7,27,20,13,2, 41,52,31,37,47,55,30,40,51,45,33,48, 44,49,39,56,34,53,46,42,50,36,29,32};//左移位数表const static char LOOP_Table[16] = { 1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};// S盒const static char S_Box[8][4][16] = { // S1 14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7, 0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8, 4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0, 15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13, //S2 15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10, 3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5, 0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15, 13,8,10,1,3,15,4,2,11,6,7,12,0,5,14,9, //S3 10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8, 13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1, 13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7, 1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12, //S4 7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15, 13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9, 10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4, 3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14, //S5 2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9, 14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6, 4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14, 11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3, //S6 12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11, 10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8, 9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6, 4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13, //S7 4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1, 13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6, 1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2, 6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12, //S8 13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7, 1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2, 7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8, 2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11}; static bool SubKey[16][48];// 16圈子密钥 void Des_Run(char Out[8], char In[8], bool Type){ static bool M[64], Tmp[32], *Li = &M[0], *Ri = &M[32]; ByteToBit(M, In, 64);// 字节组转换成位组 Transform(M, M, IP_Table, 64);// 变换 if( Type == ENCRYPT ){ for(int i=0; i<16; i++) { memcpy(Tmp, Ri, 32); F_func(Ri, SubKey[i]); Xor(Ri, Li, 32);// 异或 memcpy(Li, Tmp, 32); } }else{ for(int i=15; i>=0; i--) { memcpy(Tmp, Li, 32); F_func(Li, SubKey[i]); Xor(Li, Ri, 32);// 异或 memcpy(Ri, Tmp, 32); } } Transform(M, M, IPR_Table, 64);// 变换 BitToByte(Out, M, 64);} void Des_SetKey(const char Key[8]){ static bool K[64], *KL = &K[0], *KR = &K[28]; ByteToBit(K, Key, 64);// 字节组转换成位组 Transform(K, K, PC1_Table, 56);// 变换 for(int i=0; i<16; i++) { RotateL(KL, 28, LOOP_Table[i]);// 循环左移 RotateL(KR, 28, LOOP_Table[i]);// 循环左移 Transform(SubKey[i], K, PC2_Table, 48);// 变换 }} void F_func(bool In[32], const bool Ki[48])// f 函数{ static bool MR[48]; Transform(MR, In, E_Table, 48);// 变换 Xor(MR, Ki, 48);// 异或 S_func(In, MR);// S 盒代替 Transform(In, In, P_Table, 32);// 变换} void S_func(bool Out[32], const bool In[48])// S 盒代替,输入6位的数,输出4位的数,将第一六位对应的十进制数作为行,第二三四五为的对应十进制数作为列{ for(char i=0,j,k; i<8; i++,In+=6,Out+=4) { j = (In[0]<<1) + In[5]; k = (In[1]<<3) + (In[2]<<2) + (In[3]<<1) + In[4]; ByteToBit(Out, &S_Box[i][j][k], 4); }} void Transform(bool *Out, bool *In, const char *Table, int len)//变换{ static bool Tmp[256]; for(int i = 0; i < len; i++) { Tmp[i] = In[ Table[i] - 1 ]; } memcpy(Out, Tmp, len);} void Xor(bool *InA, const bool *InB, int len)//异或{ for(int i = 0; i < len; i++) { InA[i] ^= InB[i]; }} void RotateL(bool *In, int len, int loop)//循环左移{ static bool Tmp[256]; memcpy(Tmp, In, loop); memcpy(In, In+loop, len-loop); memcpy(In+len-loop, Tmp, loop);} void ByteToBit(bool *Out, const char *In, int bits)//字节组转换成位组{ for(int i = 0; i < bits; i++) { Out[i] = (In[i/8] >> (i%8)) & 1; }} void BitToByte(char *Out, const bool *In, int bits){ memset(Out, 0, (bits+7)/8); for(int i = 0; i < bits; i++) { Out[i/8] |= In[i] << (i%8); }} int main(int argc, char *argv[]){ char key[8] = {1, 9, 8, 0, 9, 1, 7, 2}, str[] = "Hello"; puts("Before encrypting"); puts(str); Des_SetKey(key); Des_Run(str, str, ENCRYPT); puts("After decrypting"); puts(str); puts("After decrypting"); Des_Run(str, str, DECRYPT); puts(str); return 0; }
变换
字节
置换
密钥
循环
函数
十进制
十进
生成
加密
圈子
输入
输出
选择
加密解密
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
物流自动化服务器
数字计算机网络技术专业
网络安全感想开头
软件开发流程及岗位职责
河北放心软件开发服务推广
杭州新瑞云软件开发有限公司
安徽综合软件开发近期价格
校招软件开发笔试题
3个数据库的概念
小学生网络安全班会课总结
网络安全试验心得
安卓应用软件开发记账本
宝山区优势软件开发试验设备
计算机网络技术学什么高数
二道区现代化网络安全质量服务
powermill数据库
excel 服务器 开发
河南格入网络技术怎么样
国产串口服务器价格
路由器搭建nas存储服务器
建行软件开发笔试机考
安徽综合软件开发近期价格
数据库建表代码唯一非空
泉州天际软件开发
miui隐私保护华为服务器
263 imap服务器
阿里adb数据库为什么快
苏宁易购 软件开发
专科网络技术有用吗
toad怎么连接数据库服务器