请高手进来解决这个问题,关于解密字符串的问题

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的代码也行!!!分不够可以再开贴!
...全文
167 点赞 收藏 21
写回复
21 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
ryuxy 2005-07-06
ding
回复
ryuxy 2005-06-22
tjjzs(王、) ,能否详细给个代码?多谢了!
回复
cnyxlxw 2005-06-21
什么艰难险阻也挡不住我顶你的脚步!!!
回复
su27007 2005-06-21
学习中,帮顶!
回复
为什么用str.getBytes()转化后报错,楼主应该想想为什么会这样,怎么解决
回复
ryuxy 2005-02-26
算了,再有5个人顶就结
回复
以梦为马 2005-02-04
啥也别说了,缘分啦~
回复
ryuxy 2005-02-01
不解决不揭贴
回复
ryuxy 2004-11-23
再顶!
回复
computersim 2004-09-11
md5是hash算法,不是加密算法!而且md5已经被Dr.Wang废了
回复
ryuxy 2004-09-11
再顶!
回复
chancelin 2004-09-11
md5确实不能解密,但是它可以加密,所以修改密码是不会有问题的。
回复
ryuxy 2004-09-10
风继续吹,我继续顶
回复
ryuxy 2004-09-09
楼上的兄弟,我说的是md5不能解密,不是不能加密。
回复
chancelin 2004-09-08
>>>可是md5不能解密啊,这样别人要是需要修改密码就不行了吧
为什么不行?
所有的密码,都可以加密的。
回复
ryuxy 2004-09-08
楼上大侠能否详细说明一下???拜托了啊!! 怎样保存deskey呢??
回复
ChDw 2004-09-08
你每次都 deskey = keygen.generateKey(); 当然不行,你只应该在内部一次以后,将这个
desKey保存下来,一直使用它才可以

另外,你加密了以后是成为byte[],但是这个不能new String的会有问题
你需要使用sun.misc.Base64Encoder来将这个byte[]就String
回复
woderoom 2004-09-08
学习
回复
ryuxy 2004-09-08
楼上兄弟说的方法一:
方法一:
新增USER时,先encrypt(),把得到的byte[]拆成若干byte,再存入数据库。
登陆时将数据库中取出的byte重新组装成byte[],然后decrypt()得到明文,最后和用户填写的passwd比较即可。
怎么把byte[]拆成若干byte,再存入数据库?再就是登陆时将数据库中取出的byte重新组装成byte[]?麻烦详细指点一下啊?我才学java不到一个月。
回复
ryuxy 2004-09-08
可是md5不能解密啊,这样别人要是需要修改密码就不行了吧
回复
加载更多回复
相关推荐
发帖
Web 开发
创建于2007-09-28

8.0w+

社区成员

Java Web 开发
申请成为版主
帖子事件
创建了帖子
2004-09-08 03:46
社区公告
暂无公告