JAVA求助,有关DES算法问题。
接触java时间不长,根据书上和网上的DES加密/解密原理自己编写了加密/解密算法,可是不管怎么运行加密和解密的结果都是乱码,但是输入的明文里没有中文,全是英文字符。自己检查了好几遍也不知道是哪里出了问题,头都大了,请大家帮我找找毛病。谢谢!!public class Details {
public static int getSourceBitArrayLength(String source){
int length=source.length();
return length/8+(length%8==0?0:1);
}
public static String[] getSubstringArray(String source,int length){
String[] substring=new String[length];
int lettersLeft=source.length();
int low=0,high=8;
for(int i=0;i<length;++i){
if(lettersLeft<8){
substring[i]=source.substring(low,source.length());
StringBuilder bd=new StringBuilder();
for(int j=0;j<8-lettersLeft;++j)
bd.append(' ');
substring[i]+=bd.toString();
break;
}
substring[i]=source.substring(low, high);
low=high;high+=8;lettersLeft-=8;
}
return substring;
}
//Byte类型转为bit类型
public static int[] bytesToBits(String source){
int[] bits=new int[64];
char element=0;
for(int i=0;i<64;++i){
for(int j=0;j<8;++j){
element=source.charAt(j);
for(int k=0;k<8;++k)
bits[8*(j+1)-k-1]=(element>>k)&1;
}
}
return bits;
}
//bit类型转为Byte类型
public static byte[] bitsToBytes(int[] bits){
byte element[]=new byte[]{0,0,0,0,0,0,0,0};
int j=0,k=0;
for(int i=0;i<64;++i){
if(k==8){ j++;k=0;}
element[j]|=bits[i]<<(8-(k++)-1);
}
return element;
}
//初始IP置换
public static void initialPermutation(int[] bits){
int[] newBits=new int[64];
for(int i=0;i<64;++i)
newBits[i]=bits[Table.getIP()[i]-1];
bits=newBits;
}
//获取子密钥
public static int[][] getSubkeys(int[] key){
int[][] subkey=new int[16][48];
int[] tempKey=new int[56];
int[] C=new int[28];
int[] D=new int[28];
for(int i=0;i<56;++i){
tempKey[i]=key[Table.getPC_1()[i]-1];
if(i<28)
C[i]=tempKey[i];
else
D[i%28]=tempKey[i];
}
for(int i=0;i<16;++i){
leftShift(Table.getShift()[i],C);
leftShift(Table.getShift()[i],D);
int index=0;
for(;index<28;++index)
tempKey[index]=C[index];
for(;index<56;++index)
tempKey[index]=D[index%28];
for(int j=0;j<48;++j)
subkey[i][j]=tempKey[Table.getPC_2()[j]-1];
}
return subkey;
}
//左移
private static void leftShift(int index,int[] key){
int[] temp=new int[index];
for(int i=0;i<index;++i)
temp[i]=key[i];
for(int i=index;i<key.length;++i)
key[i-index]=key[i];
for(int i=0;i<index;++i)
key[key.length-i-1]=temp[index-i-1];
}
//扩展置换
private static int[] expansionPermutation(int[] R){
int[] newR=new int[48];
for(int i=0;i<48;++i)
newR[i]=R[Table.getE()[i]-1];
return newR;
}
//扩展置换结果与Ki进行异或运算
private static void RxorKey(int[] R,int[] key){
for(int i=0;i<48;++i)
R[i]^=key[i];
}
//S盒置换
private static int[] sBoxConversion(int[] R,int[] L){
int[] newL=new int[32];
int[][] splitedR=new int[8][6];
int b1=0,b0=0,index=0;
int count=0;
int[] b=new int[4];
int[] bits=new int[4];
for(int i=0;i<8;++i){
for(int j=0;j<6;++j){
splitedR[i][j]=R[index++];
}
}
for(int i=0;i<8;++i){
for(int j=0,k=0;j<6;++j){
if(j==0) b0=splitedR[i][j];
else if(j==5) b1=splitedR[i][j];
else b[k++]=splitedR[i][j];
}
int row=b0*2+b1;
int column=0;
for(int e=0;e<4;++e)
column+=b[e]*Math.pow(2, 4-e-1);
int result=Table.getS()[i][row][column];
for(int e=0;e<4;++e)
bits[4-e-1]=(result>>e)&1;
for(int e=0;e<4;++e)
newL[count++]=bits[e];
}
pBoxConversion(newL);
for(int i=0;i<32;++i)
newL[i]^=L[i];
return newL;
}
//P盒置换
private static void pBoxConversion(int[] newL){
int[] temp=new int[32];
for(int i=0;i<32;++i)
temp[i]=newL[Table.getP()[i]-1];
newL=temp;
}
//IP_1置换
public static int[] finalPermutation(int[] L,int[] R){
int[] bits=new int[64];
int index=0;
int[] codeBits=new int[64];
for(int i=0;i<32;++i)
bits[index++]=L[i];
for(int i=0;i<32;++i)
bits[index++]=R[i];
for(int i=0;i<64;++i)
codeBits[i]=bits[Table.getIP_1()[i]-1];
return codeBits;
}
public static int[] encryption(int[] R,int[] L,int[] key){
int[] newR=expansionPermutation(R);
RxorKey(newR,key);
return sBoxConversion(newR,L);
}
}
下面是具体加密的函数:
source=jtaSource.getText();
length=Details.getSourceBitArrayLength(source);
substring=Details.getSubstringArray(source, length);
sourceBits=new int[length][64];
codeBits=new int[length][64];
for(int i=0;i<length;++i)
sourceBits[i]=Details.bytesToBits(substring[i]);
String keyString=jtfKey.getText();
int keyLength=keyString.length();
if(keyLength<8){
StringBuilder bd=new StringBuilder(keyString);
for(int i=0;i<8-keyLength;++i)
bd.append(' ');
keyString=bd.toString();
}
if(keyLength>8)
keyString=keyString.substring(0, 8);
subkey=Details.getSubkeys(Details.bytesToBits(keyString));
for(int i=0;i<length;++i){
Details.initialPermutation(sourceBits[i]);
int[] L=new int[32];
int[] R=new int[32];
for(int j=0;j<64;++j){
if(j<32)
L[j]=sourceBits[i][j];
else
R[j%32]=sourceBits[i][j];
}
for(int j=0;j<16;++j){
int[] tempL=new int[32];
int[] tempR=new int[32];
for(int k=0;k<32;++k)
{
tempL[k]=L[k];
tempR[k]=R[k];
}
if(j<15){
R=Details.encryption(R, L, subkey[j]);
L=tempR;
}
else{
L=Details.encryption(R, L, subkey[j]);
R=tempR;
}
}
codeBits[i]=Details.finalPermutation(L, R);
}
StringBuilder tbd=new StringBuilder();
for(int i=0;i<length;++i){
codeByte=Details.bitsToBytes(codeBits[i]);
for(int j=0;j<8;++j)
tbd.append((char)codeByte[j]);
}
jtaCode.setText(tbd.toString());
置换表网上都有,就不贴了。
谢谢!!
--------------------编程问答-------------------- 有人吗?能帮我看看吗? --------------------编程问答-------------------- 亲,你把你所有涉及到字符集(即编码)都认真对一遍,看看是否统一!
补充:Java , Java SE