高手、板主幫忙,一個加密的問題!!!

zmeng發表於2003-08-20
我們現在要從類似QQ的軟體上,透過一個連線連到網站上,需要把使用者的使用者名稱口令帶過來,這就需要對口令進行加密,然後在網站上對口令進行解密。準備使用jdk1.4自帶des,在類似QQ的軟體上加密密碼,透過連線傳遞密文和金鑰,然後到網站上用des和金鑰解密,現在出現一個問題就是,我接收到的密文和金鑰是字串,透過金鑰字串怎麼生成金鑰,另外將密文字串轉化成位元組時不穩定,解密有時會出現錯誤。
我用的測試程式碼如下:
import javax.crypto.*;
public class testdes {
public static void main(String[] args) {
testdes my = new testdes();
my.run();
}

public void run() {
//新增新安全演算法,如果用JCE就要把它新增進去
//Security.addProvider(new com.sun.crypto.provider.SunJCE());
String Algorithm = "DES"; //定義 加密演算法,可用 DES,DESede,Blowfish
String myinfo = "要加密的資訊";
try {
//生成金鑰
KeyGenerator keygen = KeyGenerator.getInstance(Algorithm);
SecretKey deskey = keygen.generateKey();
//加密
System.out.println("加密前的二進串:" + byte2hex(myinfo.getBytes()));
System.out.println("加密前的資訊:" + myinfo);
Cipher c1 = Cipher.getInstance(Algorithm);
c1.init(Cipher.ENCRYPT_MODE, deskey);
byte[] cipherByte = c1.doFinal(myinfo.getBytes());
System.out.println("加密後的字串:"+ (new String(cipherByte))+ "&你好");
System.out.println("加密後的二進串:" + byte2hex(cipherByte));
//解密
c1 = Cipher.getInstance(Algorithm);
c1.init(Cipher.DECRYPT_MODE, deskey);
System.out.println("金鑰="+deskey);
byte[] clearByte = c1.doFinal((new String(cipherByte)).getBytes());

System.out.println("解密後的二進串:" + byte2hex(clearByte));
System.out.println("解密後的資訊:" + (new String(clearByte)));

}
catch (java.security.NoSuchAlgorithmException e1) {
e1.printStackTrace();
}
catch (javax.crypto.NoSuchPaddingException e2) {
e2.printStackTrace();
}
catch (java.lang.Exception e3) {
e3.printStackTrace();
}
}

public String byte2hex(byte[] b) { //二行制轉字串
String hs = "";
String stmp = "";
for (int n = 0; n < b.length; n++) {
stmp = (java.lang.Integer.toHexString(b[n] & 0XFF));
if (stmp.length() == 1)
hs = hs + "0" + stmp;
else
hs = hs + stmp;
if (n < b.length - 1)
hs = hs + ":";
}
return hs.toUpperCase();
}

}
類似QQ的軟體用的是VC,網站用的是Java

更為不確定的因素是jdk中對des的實現時預設,我不知道具體的確省值是多少,那麼就很難確定VC所調類庫的具體實現,如果對des的實現不同不知道會不會有影響,我對des具體的實現不清楚,另外我也不想搞清楚,只想使用。

大家說說看,不然就我透過JNI呼叫VC所呼叫的類庫這樣應該就不會有這樣的問題了吧!

相關文章