我们现在要从类似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所调用的类库这样应该就不会有这样的问题了吧!