求个java 叫加密解密算法!大家帮帮忙,在线等!

joinduan 2012-04-06 10:23:10
比如:把一个用户存到数据库之前进行加密,取出来进行解密才能得到想要的数据。
...全文
401 点赞 收藏 26
写回复
26 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
fangkaifang 2012-04-06
[Quote=引用 22 楼 的回复:]
引用 20 楼 的回复:

简单的例子把字符与密钥在例子里是'*'做^运算,就能实现一个简单的加密解密了,当然还可以加一些换位或者加减
Java code
public static void md5(String src) {

char psw = '*';

char srcArray[] = src.toCharArray();
System.out.pr……


……
[/Quote]

没有啊 那里调的是解密字节数组那个方法
回复
joinduan 2012-04-06
[Quote=引用 20 楼 的回复:]

简单的例子把字符与密钥在例子里是'*'做^运算,就能实现一个简单的加密解密了,当然还可以加一些换位或者加减
Java code
public static void md5(String src) {

char psw = '*';

char srcArray[] = src.toCharArray();
System.out.pr……
[/Quote]


public String decrypt(String strIn) throws Exception {
return new String(decrypt(hexStr2ByteArr(strIn)));
}; 这里我不大懂,能解释下吗?方法自己调自己?
回复
fangkaifang 2012-04-06
用des吧。。。
import java.security.*;

import javax.crypto.Cipher;

public class DESPlus {
private static String strDefaultKey = "000001D919A9";
private Cipher encryptCipher = null;
private Cipher decryptCipher = null;

/**
* 将byte数组转换为表示16进制值的字符串, 如:byte[]{8,18}转换为:0813, 和public static byte[]
* hexStr2ByteArr(String strIn) 互为可逆的转换过程
*
* @param arrB
* 需要转换的byte数组
* @return 转换后的字符串
* @throws Exception
* 本方法不处理任何异常,所有异常全部抛出
*/
public static String byteArr2HexStr(byte[] arrB) throws Exception {
int iLen = arrB.length;
// 每个byte用两个字符才能表示,所以字符串的长度是数组长度的两倍
StringBuffer sb = new StringBuffer(iLen * 2);
for (int i = 0; i < iLen; i++) {
int intTmp = arrB[i];
// 把负数转换为正数
while (intTmp < 0) {
intTmp = intTmp + 256;
}
// 小于0F的数需要在前面补0
if (intTmp < 16) {
sb.append("0");
}
sb.append(Integer.toString(intTmp, 16));
}
return sb.toString();
}

/**
* 将表示16进制值的字符串转换为byte数组, 和public static String byteArr2HexStr(byte[] arrB)
* 互为可逆的转换过程
*
* @param strIn
* 需要转换的字符串
* @return 转换后的byte数组
* @throws Exception
* 本方法不处理任何异常,所有异常全部抛出
* @author hhayyok@163.com
*/
public static byte[] hexStr2ByteArr(String strIn) throws Exception {
byte[] arrB = strIn.getBytes();
int iLen = arrB.length;

// 两个字符表示一个字节,所以字节数组长度是字符串长度除以2
byte[] arrOut = new byte[iLen / 2];
for (int i = 0; i < iLen; i = i + 2) {
String strTmp = new String(arrB, i, 2);
arrOut[i / 2] = (byte) Integer.parseInt(strTmp, 16);
}
return arrOut;
}

/**
* 默认构造方法,使用默认密钥
*
* @throws Exception
*/
public DESPlus() throws Exception {
this(strDefaultKey);
}

/**
* 指定密钥构造方法
*
* @param strKey
* 指定的密钥
* @throws Exception
*/
public DESPlus(String strKey) throws Exception {
//Security.addProvider(new com.sun.crypto.provider.SunJCE());
Key key = getKey(strKey.getBytes());

encryptCipher = Cipher.getInstance("DES");
encryptCipher.init(Cipher.ENCRYPT_MODE, key);

decryptCipher = Cipher.getInstance("DES");
decryptCipher.init(Cipher.DECRYPT_MODE, key);
}

/**
* 加密字节数组
*
* @param arrB
* 需加密的字节数组
* @return 加密后的字节数组
* @throws Exception
*/
public byte[] encrypt(byte[] arrB) throws Exception {
return encryptCipher.doFinal(arrB);
}

/**
* 加密字符串
*
* @param strIn
* 需加密的字符串
* @return 加密后的字符串
* @throws Exception
*/
public String encrypt(String strIn) throws Exception {
return byteArr2HexStr(encrypt(strIn.getBytes()));
}

/**
* 解密字节数组
*
* @param arrB
* 需解密的字节数组
* @return 解密后的字节数组
* @throws Exception
*/
public byte[] decrypt(byte[] arrB) throws Exception {
return decryptCipher.doFinal(arrB);
}

/**
* 解密字符串
*
* @param strIn
* 需解密的字符串
* @return 解密后的字符串
* @throws Exception
*/
public String decrypt(String strIn) throws Exception {
return new String(decrypt(hexStr2ByteArr(strIn)));
}

/**
* 从指定字符串生成密钥,密钥所需的字节数组长度为8位 不足8位时后面补0,超出8位只取前8位
*
* @param arrBTmp
* 构成该字符串的字节数组
* @return 生成的密钥
* @throws java.lang.Exception
*/
private Key getKey(byte[] arrBTmp) throws Exception {
// 创建一个空的8位字节数组(默认值为0)
byte[] arrB = new byte[8];

// 将原始字节数组转换为8位
for (int i = 0; i < arrBTmp.length && i < arrB.length; i++) {
arrB[i] = arrBTmp[i];
}

// 生成密钥
Key key = new javax.crypto.spec.SecretKeySpec(arrB, "DES");

return key;
}

public static void main(String[] args) {
try {
String test = "fangkai";
//DESPlus des = new DESPlus();//默认密钥
DESPlus des = new DESPlus("FUCK");// 自定义密钥
System.out.println("加密前的字符:" + test);
System.out.println("加密后的字符:" + des.encrypt(test));
System.out.println("解密后的字符:" + des.decrypt(des.encrypt(test)));
} catch (Exception e) {
e.printStackTrace();
}
}
}
回复
creso 2012-04-06
简单的例子把字符与密钥在例子里是'*'做^运算,就能实现一个简单的加密解密了,当然还可以加一些换位或者加减
	public static void md5(String src) {

char psw = '*';

char srcArray[] = src.toCharArray();
System.out.print("加密后:");
for (int i = 0; i < src.length(); i++) {
srcArray[i] = (char) (srcArray[i] ^ psw);
System.out.print(srcArray[i]);
}
System.out.println("");
System.out.print("加密前:");
for (int i = 0; i < src.length(); i++) {
srcArray[i] = (char) (srcArray[i] ^ psw);
System.out.print(srcArray[i]);

}
System.out.println();
}
[Quote=引用 16 楼 的回复:]

引用 15 楼 的回复:

引用 12 楼 的回复:

引用 10 楼 的回复:

加密分為可逆不可逆,你要那種?



不好意思,这个我不懂,能解释下吗?





现在很多网站密码采用MD5 方式加密,MD5是不可逆的运算,所以加密后不可能根据密文来还原。
这里设明文到MD5密文的转换过程为函数,f(x),对任意x只有一个y=f(x)与之对应,对于任意……
[/Quote]
回复
逆乾坤 2012-04-06
可以用DES或者TDES等等,都行,
回复
逆乾坤 2012-04-06
大哥,MD5和SHA等等是单向加密算法,不能解密的[Quote=引用 3 楼 的回复:]

这个网上多的是简单的就是移位,还有MD5加密,解密。。。
[/Quote]
回复
昨日凡阳 2012-04-06
[Quote=引用 16 楼 的回复:]

引用 15 楼 的回复:

引用 12 楼 的回复:

引用 10 楼 的回复:

加密分為可逆不可逆,你要那種?



不好意思,这个我不懂,能解释下吗?





现在很多网站密码采用MD5 方式加密,MD5是不可逆的运算,所以加密后不可能根据密文来还原。
这里设明文到MD5密文的转换过程为函数,f(x),对任意x只有一个y=f(x)与之对应,对于任意……
[/Quote]

這個沒什麽好寫的啊。很簡單的。

不過我建議你還是使用復雜一點的,如使用jdk 的jce完成aes 256位的加密解密,需要用到owasp 的esapi中的方法。這個非產安全。
回复
joinduan 2012-04-06
[Quote=引用 15 楼 的回复:]

引用 12 楼 的回复:

引用 10 楼 的回复:

加密分為可逆不可逆,你要那種?



不好意思,这个我不懂,能解释下吗?





现在很多网站密码采用MD5 方式加密,MD5是不可逆的运算,所以加密后不可能根据密文来还原。
这里设明文到MD5密文的转换过程为函数,f(x),对任意x只有一个y=f(x)与之对应,对于任意y=f(x)只可能有唯一的一个x可……
[/Quote]

那能不能给个可逆的例子阿? 可能用户名之类的都会用到,不可逆的化就不好显示出来到页面的!谢谢!
回复
昨日凡阳 2012-04-06
[Quote=引用 12 楼 的回复:]

引用 10 楼 的回复:

加密分為可逆不可逆,你要那種?



不好意思,这个我不懂,能解释下吗?
[/Quote]




现在很多网站密码采用MD5 方式加密,MD5是不可逆的运算,所以加密后不可能根据密文来还原。
这里设明文到MD5密文的转换过程为函数,f(x),对任意x只有一个y=f(x)与之对应,对于任意y=f(x)只可能有唯一的一个x可以得到f(x)=y。16位MD5 的算法有f("Array17")="d2dc5d48Array242e60e"。因为运算不可逆,所以不会存在统一的算法g(y)=x而是你通过"d2dc5d48Array242e60e"得到"Array17"。
如果你在一个系统中的注册密码是"Array17",出于安全考虑,系统留下的不是明文而是"d2dc5d48Array242e60e"。比如说你本次登录对系统提交的是"Array17",系统不是直接验证,而是用f("Array17")来验证是不是等于系统中保存的"d2dc5d48Array242e60e"。如果相等,就代表登陆成功,不相等就不成功。
你可以通过各种方法得到系统中存储的"d2dc5d48Array242e60e",此时的唯一选择是在有效的范围内枚举(一一列举)可能的明文通过f(x)看是否等于"d2dc5d48Array242e60e"。因为计算机的优势就是运算速度快和运算精确度高,每秒钟可以枚举数万甚至更高。比如可以让计算机循环从0枚举到ArrayArrayArray,当到Array17时就会得到与上例相同的密文,就证明明文是"Array17"。指定计算机允许的全部字符范围理论上就可以破解所有的密码明文,而只是时间问题(一个复杂的密码可能需要破解者N个世纪来破解,而一个8位纯数字、常用单词可能只需要计算机N秒的时间)。尽管数据库不是那么容易泄露和被入侵者得到,但是安全意识必须加强,密码强度要足够大。
而很多时候我们需要可逆的算法来加密。比如我们发邮件,如果是机要文件发送路途中可能会被各种方法拦截而泄密。这是我们需要可逆算法。假设有一种简单算法为y=f(x,m),逆算有x=g(y,n)。发送方使用f(x,m),接受方使用g(y,n)。m,n分别为双方的“钥匙”。设m=1,n=2时有y=f("晚上8点桥上见",1)="你吃饭了么?";x=g("你吃饭了么?",2)="晚上8点桥上见"。此时发送方只用根据自己的y=f(x,m)发送“你吃饭了么?”给接受方,即使路上被拦截也没有泄露什么,接受方用自己唯一的x=g(y,n)代入得到的y=“你吃饭了么?”和自己的钥匙就轻松得到x="晚上8点桥上见"。

引用自:
http://www.sudu.cn/info/index.php?op=article&id=215815
回复
joinduan 2012-04-06
[Quote=引用 11 楼 的回复:]

Java code

else if(action.equals("/regist")){
String username=request.getParameter("username");
String name=request.getParameter("name");
String pwd=request.getPa……
[/Quote]
谢谢,我试下!
回复
fangkaifang 2012-04-06
密码类型的 一般用11楼所说的那样
回复
joinduan 2012-04-06
[Quote=引用 10 楼 的回复:]

加密分為可逆不可逆,你要那種?
[/Quote]


不好意思,这个我不懂,能解释下吗?
回复
X497347200 2012-04-06

else if(action.equals("/regist")){
String username=request.getParameter("username");
String name=request.getParameter("name");
String pwd=request.getParameter("pwd1");
String sex=request.getParameter("sex");
String number=request.getParameter("number");
HttpSession session=request.getSession();
String number1=(String) session.getAttribute("number");
//System.out.println(number+" "+number1);
if(!number.equals(number1)){
request.setAttribute("error", "验证码错误,请重新输入");
request.getRequestDispatcher("regist.jsp").forward(request, response);
return;
}
MessageDigest md;
String Pwd = null;
try {
md = MessageDigest.getInstance("MD5");
byte[] buf=md.digest(pwd.getBytes());
BASE64Encoder encoder=new BASE64Encoder();
Pwd=encoder.encode(buf);
} catch (NoSuchAlgorithmException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}

User u=new User();
u.setUsername(username);
u.setName(name);
u.setPwd(Pwd);
u.setSex(sex);
EmployeeDao dao=(EmployeeDao) DAOFactory.getInstance("EmployeeDao");
try {
dao.regist(u);
request.getRequestDispatcher("login.jsp").forward(request, response);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}


注册用户的时候就吧密码进行md5加密存入数据库,数据库里面看见的是md5码,还有md5加密了是不能解码的,也用不着解码。登陆判断的时候先把输入的密码md5加密再和数据库比较:

EmployeeDao dao=(EmployeeDao) DAOFactory.getInstance("EmployeeDao");
try {
MessageDigest md;
String Pwd = null;
md = MessageDigest.getInstance("MD5");
byte[] buf=md.digest(password.getBytes());
BASE64Encoder encoder=new BASE64Encoder();
Pwd=encoder.encode(buf);
User u=dao.findUserByName(username);
if(u!=null&&u.getPwd().equals(Pwd)){
request.setAttribute("loginUser", u);
session=request.getSession();
session.setAttribute("user", u);
request.getRequestDispatcher("list.do").forward(request, response);
}else{
request.setAttribute("loginMsg","Wrong Username or Password");
request.getRequestDispatcher("login.jsp").forward(request, response);
}
回复
昨日凡阳 2012-04-06
加密分為可逆不可逆,你要那種?
回复
qybao 2012-04-06
算法很多,只要保证加密解密一致就可以了
保存数据前,调用一下加密encode方法,再保存
获取数据时,调用一下解密decode方法,再显示
怎么加密怎么解密可以自由发挥,需要现成的加密解密算法,直接谷哥或百度就可以了
回复
joinduan 2012-04-06
这个我没了解过,我主要是实现在数据库不能直观的让别人看到密码之类的东西!
回复
creso 2012-04-06
[Quote=引用 5 楼 的回复:]

引用 3 楼 的回复:
这个网上多的是简单的就是移位,还有MD5加密,解密。。。


MD5不是不可以解密么?
[/Quote]
有密钥就可以
回复
能加密有啥用?你的密钥怎么保管?
回复
fangkaifang 2012-04-06
[Quote=引用 3 楼 的回复:]
这个网上多的是简单的就是移位,还有MD5加密,解密。。。
[/Quote]

MD5不是不可以解密么?
回复
creso 2012-04-06
一般是MD5~加密密码~~MySql有自带的加密函数
回复
加载更多回复
相关推荐
发帖
Java EE
创建于2007-09-28

6.6w+

社区成员

J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
申请成为版主
帖子事件
创建了帖子
2012-04-06 10:23
社区公告
暂无公告