📄 des.java
字号:
temp[ 9] = (byte)binary[1+valindex]; temp[10] = (byte)binary[2+valindex]; temp[11] = (byte)binary[3+valindex]; valindex = s4[2*ER[18]+ER[23]][2*(2*(2*ER[19]+ER[20])+ER[21])+ER[22]]; valindex = valindex * 4; temp[12] = (byte)binary[0+valindex]; temp[13] = (byte)binary[1+valindex]; temp[14] = (byte)binary[2+valindex]; temp[15] = (byte)binary[3+valindex]; valindex = s5[2*ER[24]+ER[29]][2*(2*(2*ER[25]+ER[26])+ER[27])+ER[28]]; valindex = valindex * 4; temp[16] = (byte)binary[0+valindex]; temp[17] = (byte)binary[1+valindex]; temp[18] = (byte)binary[2+valindex]; temp[19] = (byte)binary[3+valindex]; valindex = s6[2*ER[30]+ER[35]][2*(2*(2*ER[31]+ER[32])+ ER[33])+ER[34]]; valindex = valindex * 4; temp[20] = (byte)binary[0+valindex]; temp[21] = (byte)binary[1+valindex]; temp[22] = (byte)binary[2+valindex]; temp[23] = (byte)binary[3+valindex]; valindex = s7[2*ER[36]+ER[41]][2*(2*(2*ER[37]+ER[38])+ ER[39])+ER[40]]; valindex = valindex * 4; temp[24] = (byte)binary[0+valindex]; temp[25] = (byte)binary[1+valindex]; temp[26] = (byte)binary[2+valindex]; temp[27] = (byte)binary[3+valindex]; valindex = s8[2*ER[42]+ER[47]][2*(2*(2*ER[43]+ER[44])+ ER[45])+ER[46]]; valindex = valindex * 4; temp[28] = (byte)binary[0+valindex]; temp[29] = (byte)binary[1+valindex]; temp[30] = (byte)binary[2+valindex]; temp[31] = (byte)binary[3+valindex]; } /** * P置换,将S盒处理;处理后的32位字节数按照P置换的规则置换 */protected void p(){ /* Permute - P */ Rn[ 0] = temp[15]; Rn[ 1] = temp[ 6]; Rn[ 2] = temp[19]; Rn[ 3] = temp[20]; Rn[ 4] = temp[28]; Rn[ 5] = temp[11]; Rn[ 6] = temp[27]; Rn[ 7] = temp[16]; Rn[ 8] = temp[ 0]; Rn[ 9] = temp[14]; Rn[10] = temp[22]; Rn[11] = temp[25]; Rn[12] = temp[ 4]; Rn[13] = temp[17]; Rn[14] = temp[30]; Rn[15] = temp[ 9]; Rn[16] = temp[ 1]; Rn[17] = temp[ 7]; Rn[18] = temp[23]; Rn[19] = temp[13]; Rn[20] = temp[31]; Rn[21] = temp[26]; Rn[22] = temp[ 2]; Rn[23] = temp[ 8]; Rn[24] = temp[18]; Rn[25] = temp[12]; Rn[26] = temp[29]; Rn[27] = temp[ 5]; Rn[28] = temp[21]; Rn[29] = temp[10]; Rn[30] = temp[ 3]; Rn[31] = temp[24]; } protected void IIP(){ /* Inverse Initial Permutation */ output[ 0] = bufout[39]; output[ 1] = bufout[ 7]; output[ 2] = bufout[47]; output[ 3] = bufout[15]; output[ 4] = bufout[55]; output[ 5] = bufout[23]; output[ 6] = bufout[63]; output[ 7] = bufout[31]; output[ 8] = bufout[38]; output[ 9] = bufout[ 6]; output[10] = bufout[46]; output[11] = bufout[14]; output[12] = bufout[54]; output[13] = bufout[22]; output[14] = bufout[62]; output[15] = bufout[30]; output[16] = bufout[37]; output[17] = bufout[ 5]; output[18] = bufout[45]; output[19] = bufout[13]; output[20] = bufout[53]; output[21] = bufout[21]; output[22] = bufout[61]; output[23] = bufout[29]; output[24] = bufout[36]; output[25] = bufout[ 4]; output[26] = bufout[44]; output[27] = bufout[12]; output[28] = bufout[52]; output[29] = bufout[20]; output[30] = bufout[60]; output[31] = bufout[28]; output[32] = bufout[35]; output[33] = bufout[ 3]; output[34] = bufout[43]; output[35] = bufout[11]; output[36] = bufout[51]; output[37] = bufout[19]; output[38] = bufout[59]; output[39] = bufout[27]; output[40] = bufout[34]; output[41] = bufout[ 2]; output[42] = bufout[42]; output[43] = bufout[10]; output[44] = bufout[50]; output[45] = bufout[18]; output[46] = bufout[58]; output[47] = bufout[26]; output[48] = bufout[33]; output[49] = bufout[ 1]; output[50] = bufout[41]; output[51] = bufout[ 9]; output[52] = bufout[49]; output[53] = bufout[17]; output[54] = bufout[57]; output[55] = bufout[25]; output[56] = bufout[32]; output[57] = bufout[ 0]; output[58] = bufout[40]; output[59] = bufout[ 8]; output[60] = bufout[48]; output[61] = bufout[16]; output[62] = bufout[56]; output[63] = bufout[24]; } public Des(String key){ this.key=key; subKey=new SubKey(key); } /** * 加密数据操作 * @param dataSrc * @param readLen * @return 加密后的数据 */public String enc(String dataSrc,int readLen) { this.dataSrc=dataSrc; this.readLen=readLen; convert4CharTo64bit(dataSrc);//将4个字符串转换为64为byte的字节 IP(); //IP置换后分为左右各32位的两组数据 for (int i = 0; i<32; i++) { Ln[i]=bufout[i]; // L0 Rn[i]=bufout[32+i]; //R0 } /* * 16次迭代加密 */ for (int iter = 1; iter<17; iter++) { for (int i = 0; i<32; i++) { LR[i]=Ln[i]; Ln[i]=Rn[i]; } expand32To48bit(Rn); //从32位扩展置换成为48位 /* * 选择当前需要使用的密钥 */ switch(iter) { case 1: ki=subKey.k1; break; case 2: ki=subKey.k2; break; case 3: ki=subKey.k3; break; case 4: ki=subKey.k4; break; case 5: ki=subKey.k5; break; case 6: ki=subKey.k6; break; case 7: ki=subKey.k7; break; case 8: ki=subKey.k8; break; case 9: ki=subKey.k9; break; case 10: ki=subKey.k10; break; case 11: ki=subKey.k11; break; case 12: ki=subKey.k12; break; case 13: ki=subKey.k13; break; case 14: ki=subKey.k14; break; case 15: ki=subKey.k15; break; case 16: ki=subKey.k16; break; } XOR(ER,ki);//异或处理后要以后用的数据为ER sBox(); //S盒处理 p();//P处理 XOR(Rn,LR);//将P置换后的数据Rn与LR进行异或,最后得到的数据在Rn里面,作为下一次迭代的数据 } /* * 将16次迭代后的数据组合在一起 */ for (int i = 0; i<32; i++) { bufout[i]=Rn[i]; bufout[32+i]=Ln[i]; } IIP();//将16次迭代后组合在一起的数据进行IP逆置换 convert64bitTo4Char();//将64位字节转换成4个字符 return dataDest; } /** * 解密加密数据操作 * @param dataSrc * @param readLen * @return 解密后的数据 */ public String dec(String dataSrc,int readLen){ this.dataSrc=dataSrc; this.readLen=readLen; convert4CharTo64bit(dataSrc); IP();//进行IP置换 for (int i = 0; i<32; i++) { Ln[i]=bufout[i]; // L0 Rn[i]=bufout[32+i]; //R0 } for (int iter = 1; iter<17; iter++) { for (int i = 0; i<32; i++) { LR[i]=Ln[i]; Ln[i]=Rn[i]; } expand32To48bit(Rn); //Rn-1 expand to 48 bit save to ER[] switch(iter) { case 1: ki=subKey.k16; break; case 2: ki=subKey.k15; break; case 3: ki=subKey.k14; break; case 4: ki=subKey.k13; break; case 5: ki=subKey.k12; break; case 6: ki=subKey.k11; break; case 7: ki=subKey.k10; break; case 8: ki=subKey.k9; break; case 9: ki=subKey.k8; break; case 10: ki=subKey.k7; break; case 11: ki=subKey.k6; break; case 12: ki=subKey.k5; break; case 13: ki=subKey.k4; break; case 14: ki=subKey.k3; break; case 15: ki=subKey.k2; break; case 16: ki=subKey.k1; break; } XOR(ER,ki); sBox(); p(); XOR(Rn,LR); } for (int i = 0; i<32; i++) { bufout[i]=Rn[i]; bufout[32+i]=Ln[i]; } IIP(); convert64bitTo4Char(); return dataDest; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -