DES 加密算法的64位C++ 实现

来源:互联网 发布:淘宝灵异事件 编辑:程序博客网 时间:2024/06/15 20:57

密码课的实验作业。。。 作为一个竞赛旷掉了一周的课作业还没写的大学渣我还真是有心情啊啊啊啊啊

言归正传 这次的DES 的C++实现使用了64为整型存储明文和秘钥 应该会比bit数组的朴素实现稍微快那么一点点吧。。

总之在我的i7 笔记本上大概可以跑到~500kB/s 的速度 作为周末随手一敲的小代码算是感到满足了=____=

感觉应该还有可以优化的地方 不过懒得做了

编译环境是g++ 用VC++编译器的孩纸们可能会出现输入输出错误吧 懒得做 不管了← ←


***Sep.10.2014 改了一下位运算的表达式 原来写的太丑***

**改了之后大概能达到~800KB/s 可喜可贺**

*数据输出竟然也上错了ORZ 感觉自己真是萌萌哒_(:з」∠)_*

上代码

#include<cstdio>#include"DES_const.h"using namespace std;#define ull unsigned long longFILE* fi;FILE* fo;ull origin,key64,key56,r,tmp;ull key48[16];ull perm64(ull scr,const int* table,int size0,int size1){ull ret=0;for(int i=0;i<size1;i++)ret+=((scr>>(size0-table[i]))&1)<<(size1-i-1);return ret;}ull split_rotate(ull a){a<<=1;a=a-(a&((ull)(1)<<28))+((a>>28)&1);a=a-(a&((ull)(1)<<56))+(((a>>56)&1)<<28);return a;}ull sb(ull a){ull ret=0,t1,t2;for(int i=0;i<8;i++){t1=((a>>4)&2)+(a&1);t2=(a>>1)&0x0f;ret+=((ull)(S_box[7-i][t1][t2]))<<(i*4);a>>=6;}return  ret;}ull enc_dec(ull origin,bool dec){ull r,tmp;origin=perm64(origin,IP,64,64);r=origin&0x00000000ffffffff;origin=(origin&0xffffffff00000000)>>32;for(int i=0;i<16;i++){tmp=r;if(dec) r=perm64(r,E,32,48)^key48[15-i];else r=perm64(r,E,32,48)^key48[i];r=perm64(sb(r),P,32,32)^origin;origin=tmp;}origin=perm64((r<<32)+origin,IPR,64,64);return origin;}int main(){fi=fopen("DES.in","r");fo=fopen("DES.out","w");fscanf(fi,"%llx",&origin);fscanf(fi,"%llx",&key64);//printf("Message:\t%016llx\n",origin);//printf("Key:\t\t%016llx\n",key64);key56=perm64(key64,PC_1,64,56);for(int i=0;i<16;i++){if(Rn[i]==2) key56=split_rotate(key56);key56=split_rotate(key56);key48[i]=perm64(key56,PC_2,56,48);}for(int i=0;i<1024;i++)for(int j=0;j<1024;j++)origin=enc_dec(origin,0);//printf("Encrypted:\t%016llx\n",origin);fprintf(fo,"Encrypted:\t%016llx\n",origin);origin=enc_dec(origin,1);//printf("Decrypted:\t%016llx\n",origin);fprintf(fo,"Decrypted:\t%016llx\n",origin);fclose(fi);fclose(fo);}



DES_const.h 里面是置换表

const int IP[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};//64 to 64const int IPR[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};const int E[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};//32 to 48const int P[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};//32 to 32const int S_box[8][4][16]={//s114, 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,//s215, 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,//s310, 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,//s47, 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,//s52, 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,//s612, 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,//s74, 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,//s813, 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};const int PC_1[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};//64 to 56const int PC_2[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};//56 to 48const int Rn[16]={1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};
输入文件: DES.in

输出文件: DES.out

输入:

02468aceeca86420
0f1571c947d9e859

输出:

Encrypted: da02ce3a89ecac3b
Decrypted: 02468aceeca86420

0 0