DES加密算法 JAVA.docx
- 文档编号:9887200
- 上传时间:2023-02-07
- 格式:DOCX
- 页数:16
- 大小:18.71KB
DES加密算法 JAVA.docx
《DES加密算法 JAVA.docx》由会员分享,可在线阅读,更多相关《DES加密算法 JAVA.docx(16页珍藏版)》请在冰豆网上搜索。
DES加密算法JAVA
/**
*Des加密算法初步完成版
*使用基础函数实现,未调用java.security.Key和javax.crypto.Cipher
*
*@version0.9
*@authoralexWu
*@电子邮箱:
alexthinking(at)
*@新浪微博:
*@完成日期:
2011-10-20
*
*/
publicclassDes{
/**
*轮密匙,由轮密匙生成器getKeys(key)获得并赋值
*在初始化Des(Stringkey)方法中运行getKeys(key)
*/
int[][]keys=newint[16][48];
/**
*初始置换
*/
int[][]displaceTable={{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}};
/**
*逆初始置换
*/
int[][]antiDisplaceTable={{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,在F变换中调用:
fTrans()
*/
int[][]expandTable={{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,在置换运算中调用
*/
int[][]pTable={{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}};
/**
*S盒压缩,调用:
sBoxTrans
*/
int[][][]sBox={
//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}
}
};
/**
*获得密匙
*@paramkey密匙
*/
publicDes(Stringkey){
getKeys(key);
}
privatevoidgetKeys(Stringkey){
int[]binaryKey=getIntArray(key);
int[][]dTable11={{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}};
int[][]dTable12={{63,55,47,39,31,33,15},
{7,62,54,46,38,30,22},
{14,6,61,53,45,37,29},
{21,13,5,28,20,12,4}};
int[][]dTable2={{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[]c=getFromTable(binaryKey,dTable11);
int[]d=getFromTable(binaryKey,dTable12);
for(inti=0;i<16;i++){
c=leftMove(i,c);
d=leftMove(i,d);
int[]main=plusArray(c,d);
//依次输出二进制密匙
//System.out.println("密匙:
"+main.length);
//showIntArray(main);
keys[i]=getFromTable(main,dTable2);
//依次输出16进制密匙
//System.out.println("key"+i+":
"+binaryToHex(getFromTable(main,dTable2)));
}
}
privateint[]plusArray(int[]c,int[]d){
intlen=c.length+d.length;
int[]arr=newint[len];
for(inti=0;i arr[i]=c[i]; } for(inti=0;i arr[i+c.length]=d[i]; } returnarr; } privateint[]leftMove(intcount,int[]arr){ int[]moveTable={1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1}; if(moveTable[count]==1){ inttep0=arr[0]; for(inti=0;i arr[i]=arr[i+1]; } arr[arr.length-1]=tep0; }else{ inttep0=arr[0]; inttep1=arr[1]; for(inti=0;i arr[i]=arr[i+2]; } arr[arr.length-2]=tep0; arr[arr.length-1]=tep1; } returnarr; } privateint[]getFromTable(int[]binaryKey,int[][]table){ intx=table.length; inty=table[0].length; int[]tep=newint[x*y]; intcount=0; for(inti=0;i for(intj=0;j tep[count++]=binaryKey[table[i][j]-1]; } } returntep; } /** *加密 *@paramtest被加密的内容 *@return加密后的结果 */ privateStringencrypt(Stringcontent){ //将16进制表示的字符串转换为二进制字符串 int[]binary=getIntArray(content); //初始置换 int[]arr=getFromTable(binary,displaceTable); //16轮乘积变换 arr=loop(arr); //逆初始置换 arr=getFromTable(arr,antiDisplaceTable); Stringresult=binaryToHex(arr); returnresult; } privateint[]loop(int[]arr){ int[]array=arr; int[]l=arrCopy(array,0,32); int[]r=arrCopy(array,32,64); System.out.print("L0="+binaryToHex(l)+""); System.out.println("R0="+binaryToHex(r)); int[]tep=newint[32]; //前15轮乘积变换 for(inti=0;i<15;i++){ tep=r; r=fTrans(r,i);//F变换 r=arrayXOR(l,r);//异或运算 l=tep; System.out.print("L"+(i+1)+"="+binaryToHex(l)+""); System.out.print("R"+(i+1)+"="+binaryToHex(r)+""); System.out.println("K"+(i+1)+"="+binaryToHex(keys[i])); } //最后一轮乘积变换 tep=l; l=fTrans(r,15); l=arrayXOR(tep,l); System.out.print("L16="+binaryToHex(l)+""); System.out.print("R16="+binaryToHex(r)+""); System.out.println("K16="+binaryToHex(keys[15])); int[]result=this.plusArray(l,r); returnresult; } /** *F变换 *@paramr *@return */ privateint[]fTrans(int[]r,intindex){ int[]tepR=getFromTable(r,expandTable); int[]key=this.keys[index]; //扩展运算的得到的tepR与轮密匙key进行异或运算 int[]result=arrayXOR(tepR,key); //选择压缩变换,S盒代替 tepR=sBoxTrans(result); //置换运算P tepR=getFromTable(tepR,pTable); returntepR; } /** *选择压缩变换,S盒代替 *@paramresult *@return */ privateint[]sBoxTrans(int[]arr){ intresult=0; int[]tepResult=newint[32]; intj=0; for(inti=0;i<8;i++,j=i*6){ //获取S盒中对应的数据 result=sBox[i][Integer.parseInt(""+arr[j]+arr[j+5],2)][Integer.parseInt(""+arr[j+1]+arr[j+2]+arr[j+3]+arr[j+4],2)]; //将S盒中取出的十进制数转化成二进制 StringtepBinaryStr=Integer.toBinaryString(result); //不够的补0 while(tepBinaryStr.length()<4){ tepBinaryStr="0"+tepBinaryStr; } //将二进制数存入tepResult char[]charArray=tepBinaryStr.toCharArray(); for(intn=0,m=i*4;n<4;n++){ tepResult[m+n]=(int)charArray[n]-48;; } } returntepResult; } /** *数组每个元素异或运算 *@paramarray1异或数组1 *@paramarray2异或数组2 *@return异或运算得到的结果 */ privateint[]arrayXOR(int[]array1,int[]array2){ intlen=array1.length; int[]result=newint[len]; for(inti=0;i result[i]=array1[i]^array2[i]; } returnresult; } /** *复制数组 *@paramsourceArray要被复制的源数组 *@paramstartIndex源数组开始位置 *@paramendIndex源数组结束位置 *@return复制后得到的数组 */ privateint[]arrCopy(int[]sourceArray,intstartIndex,intendIndex){ intlen=endIndex-startIndex; int[]copyArray=newint[len]; for(inti=0;i copyArray[i]=sourceArray[startIndex+i]; } returncopyArray; } /** *将16进制表示的字符串转换为二进制字符串 *@paramcontent16进制表示的字符串 *@return二进制字符串 */ privateStringhexToBinary(Stringcontent){ Stringstr=content; Stringstr2=""; inttepInt=0; StringtepStr=""; for(inti=0;i tepInt=Integer.parseInt(str.substring(i,i+1),16); tepStr=Integer.toBinaryString(tepInt); while(tepStr.length()<4){ tepStr="0"+tepStr; } str2+=tepStr; } returnstr2; } /** *将16进制字符串转换为二进制整形数组 *@paramstr16进制字符 *@return二进制整形数组 */ privateint[]getIntArray(Stringstr){ str=hexToBinary(str); int[]array=newint[str.length()*4]; char[]charArray=str.toCharArray(); intcount=0; for(charc: charArray){ array[count++]=(int)c-48; } returnarray; } /** *将二进制数组表示的字符串转换为16进制 *@paramcontent16进制表示的字符串
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DES加密算法 JAVA DES 加密算法
![提示](https://static.bdocx.com/images/bang_tan.gif)