《DES算法源代码.doc》由会员分享,可在线阅读,更多相关《DES算法源代码.doc(15页珍藏版)》请在金锄头文库上搜索。
1、#include#includevoid main() /声明变量char MingWen104; /存放原始的明文char target8; /将明文断成8个字符的一个分组char InputKey8; /存放字符型的八位密钥int text64; /存放一个分组转成二进制后的数据int text_ip64; /存放第一次初始换位的结果int L032,Li32; /将64位分成左右各32位进行迭代int R032,Ri32;int RE048; /存放右半部分经过E表扩展换位后的48位数据int key64; /存放密钥的二进制形式int keyPC156; /存放密钥key经过PC1换位
2、表后变成的56位二进制int A28; /将keyPC1分成左右两部分,左部A,右部B,各28位,以便进行循环左移int B28;int keyAB56; /将循环左移后两部分的结果合并起来int K1648; /存放16次循环左移产生的子密钥int RK48; /存放RE和K异或运算后的结果int RKS8; /存放经过查找8个S表后得到的8个十进制结果int SP32; /将RKS表中的十进制数化成二进制int RKSP32; /存放SP表经过P盒换位后的结果int text_end64; /存放经过左右32位换位后的结果int text_out1464; /存放初始化向量和所有经过DES
3、的分组的二进制char init9=HTmadeit; /设置初始化向量为“HTmadeit”int CBC64;int result1364;int H208;char MiWen208;int C832;int M138;char choice;int t;int i,j;int k,l,m,n;int r8,c8;int flag=1;int IP64= /初始换位表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,
4、 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;int E48= /扩展换位表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,
5、29, 28, 29, 30, 31, 32, 1 ;int PC156= /PC1换位表(6456)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 ;int move16= /循环移位表1,1,2,2,2,2,2,2
6、,1,2,2,2,2,2,2,1;int PC248= /PC2换位表(5648)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 ; int S1416= /S换位表14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7, 0, 1
7、5, 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;int S2416=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,
8、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;int S3416=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,
9、 2, 12;int S4416= 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;int S5416= 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9,14,
10、 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;int S6416=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,
11、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;int S7416= 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,
12、2, 3, 12;int S8416=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 ; int P32= /P换位表16,7,20,21,29,12,28,17,1,15,23,26,5,18,31,10,2,8,2
13、4,14,32,27,3,9,19,13,30,6,22,11,4,25;printf(欢迎使用SKY的加密&解密小程序!nn);while(flag)printf(A加密,B解密,请选择:n);scanf(%c,&choice);while(choice!=A&choice!=B&choice!=a&choice!=b)printf(对不起,您的输入不合法。请选择A或B,A表示加密,B表示解密。n); scanf(%c,&choice);getchar(); /生成子密钥printf(请输入8位密钥:n);gets(InputKey);while(InputKey7=0|InputKey8!=0) printf(您输入的密钥位数有误,请重新输入8位密钥:n); gets(InputKey);for(i=0;i8;i+) /将密钥转化成64位二进制数放到一维数组key中 int a8=0,0,0,0,0,0,0,0; m=InputKeyi; for(j=0;m!=0;j+) aj=m%2; m=m/2;