DES加密解密
发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,#include "memory.h"#include "stdio.h"#include "conio.h"enum {ENCRYPT,DECRYPT};// ENCRYPT:加密,DECRY
千家信息网最后更新 2026年11月01日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安全错误
数据库的锁怎样保障安全
南京欣网互联网络科技有限公司
科技制造互联网公司
安徽鑫晟辉互联网科技
鑫亿盛互联网科技
华中科技大学互联网
广西互联网科技公司
上游互联网科技
卓越科技互联网 招聘
成都仁贤领冠互联网科技有限公司
互联网对科技的发展
厦门比较好的科技互联网公司
苏州五指互联网络科技有限
晓花互联网科技有限公司网址
互联网科技扶贫时间
互联网在线教育科技创业
广州千川互联网科技有限公司
上海同邻互联网科技有限公司规模
科技互联网行业投资研究
中国互联网公司的科技投入
第三届互联网大会安防黑科技
互联网科技开发公司
科技创新互联网企业
有木互联网科技
想开互联网科技公司怎么样
互联网科技大赛获奖感言
互联网相关科技技术
福仕德教育科技互联网
玉溪新华互联网科技怎么选
互联网科技大会大佬
优雇互联网科技有限公司