请高手进来解决这个问题,关于解密字符串的问题
ryuxy 2004-09-08 03:46:20 我在论坛上找到了这样的例子,感觉比较精简也符合我的需求,
以下是该文件的详细代码:
package com.pechinsoft.util;
import java.security.*;
import javax.crypto.*;
public class WriteOffDES {
private String Algorithm = "DES";
public WriteOffDES() {
init();
}
public void init() {
Security.addProvider(new com.sun.crypto.provider.SunJCE());
try {
keygen = KeyGenerator.getInstance(Algorithm);
deskey = keygen.generateKey();
c = Cipher.getInstance(Algorithm);
}
catch(NoSuchAlgorithmException ex) {ex.printStackTrace();}
catch(NoSuchPaddingException ex) {ex.printStackTrace();}
}
public byte[] encrypt(String e) {
try {
c.init(Cipher.ENCRYPT_MODE, deskey);
cipherByte = c.doFinal(e.getBytes());
}
catch(java.security.InvalidKeyException ex){ex.printStackTrace();}
catch(javax.crypto.BadPaddingException ex){ex.printStackTrace();}
catch(javax.crypto.IllegalBlockSizeException ex){ex.printStackTrace();}
return cipherByte;
}
public String decrypt(byte[] d) {
try {
c.init(Cipher.DECRYPT_MODE, deskey);
cipherByte = c.doFinal(d);
}
catch(java.security.InvalidKeyException ex){ex.printStackTrace();}
catch(javax.crypto.BadPaddingException ex){ex.printStackTrace();}
catch(javax.crypto.IllegalBlockSizeException ex){ex.printStackTrace();}
return (new String(cipherByte));
}
public String byteTohex(byte[] b) {
String str = "";
String stmp = "";
for(int n=0;n<b.length;n++) {
stmp=(java.lang.Integer.toHexString(b[n] & 0XFF));
if(stmp.length()==1) str = str + "0" + stmp;
else str = str + stmp;
if(n<b.length-1) str = str + ":";
}
return str.toUpperCase();
}
private KeyGenerator keygen;
private SecretKey deskey;
private Cipher c;
private byte[] cipherByte;
}
附运用方法:
<%--TestDES.jsp--%>
<%@ page contentType="text/html; charset=gb2312" %>
<jsp:useBean id="DES" scope="page" class="com.pechinsoft.util.WriteOffDES" />
<html>
<head><title>TestDES File</title></head>
<body bgcolor="#FFFFFF">
<div align="center"><center>
<%
String Num = request.getParameter("Num");
if(Num==null || Num.equals("")) {
%>
<form name="form" action="TestDES.jsp" method="post">
<input type="text" name="Num" size="25" value=""/>
<input type="submit" name="button" value=" 确定 "/>
</form>
<%
}else{
out.println("加密前的数据:"+Num +"<br/>");
out.println("加密后的数据:"+DES.encrypt(Num) +"<br/>");
out.println("解密后的数据:"+DES.decrypt(DES.encrypt(Num)) +"<br/>");
}
%>
</center></div>
</body>
</html>
大家看该例子解密的代码:out.println("解密后的数据:"+DES.decrypt(DES.encrypt(Num)) +"<br/>"); 是把加密的字符再解密,自然没有问题,可是我在登陆时验证密码时要从数据库中读取密码,再解密,而DES.encrypt()返回的是byte[]类型,数据库中是字符类型,我用str.getBytes()转化后报错,所以不能用DES.decrypt()解密,但用DES.encrypt()加密后每次的密文都不一样,所以也不能把输入的密码加密后和数据库中的密文比对。请教高手这个问题怎么解决??或者还有没有其他的加密解密方法,md5就不用了,这个不能解密。如果有其他的,请按照上面的例子,给出bean和jsp的代码也行!!!分不够可以再开贴!