<求救>DES及3DES加密算法
请问在哪可以找到DES及3DES的源代码(Java版)啊!?
问题点数:30、回复次数:17Top
1 楼an_andy()回复于 2005-04-11 10:45:33 得分 0
顶帖也是解决的前提...Top
2 楼dj0517(小可)回复于 2005-04-11 11:01:10 得分 0
哪里有下的呀!? 急用 ̄ ̄Top
3 楼xuetinge(薛挺)回复于 2005-04-11 11:20:28 得分 20
看看这个。
http://community.csdn.net/Expert/TopicView.asp?id=3787998Top
4 楼dj0517(小可)回复于 2005-04-11 11:36:11 得分 0
真的很感谢 ̄ ̄ ̄Top
5 楼dj0517(小可)回复于 2005-04-11 13:42:40 得分 0
为什么我输出不了结果呢,改后代码如下:
import java.security.*;
import javax.crypto.*;
import javax.crypto.spec.*;
import java.util.*;
import java.io.*;
public class DES {
/**
* DES 加密算法
* @param data 处理数据
* @param key 密钥
* @param mode =0加密 =1解密
*/
public static String des(String data,String key,int mode)
{
if(mode == 0 )
{
mode = Cipher.ENCRYPT_MODE;
}else{
mode = Cipher.DECRYPT_MODE;
}
try{
Cipher cipher = Cipher.getInstance("DES");
SecretKeySpec spec = new SecretKeySpec(key.getBytes(),"DES");
Key deskey = spec;
cipher.init(mode, deskey);
return crypt(new ByteArrayInputStream(data.getBytes()),cipher);
}catch(Exception e)
{
e.printStackTrace();
return "";
}
}
private static String crypt(InputStream in,Cipher cipher)throws IOException,
GeneralSecurityException
{
int blockSize = cipher.getBlockSize();
int outputSize = cipher.getOutputSize(blockSize);
byte[] inBytes = new byte[blockSize];
byte[] outBytes = new byte[outputSize];
ByteArrayOutputStream out = new ByteArrayOutputStream();
int inLength = 0;;
boolean more = true;
while (more)
{
inLength = in.read(inBytes);
if (inLength == blockSize)
{
int outLength
= cipher.update(inBytes, 0, blockSize, outBytes);
out.write(outBytes, 0, outLength);
System.out.println(outLength);
}
else more = false;
}
if (inLength > 0)
outBytes = cipher.doFinal(inBytes, 0, inLength);
else
outBytes = cipher.doFinal();
System.out.println(outBytes.length);
out.write(outBytes);
return new String(out.toByteArray());
}
public static void main(String[] args) {
DES des = new DES();
System.out.println(des.des("123","wer",1));
}
}Top
6 楼dj0517(小可)回复于 2005-04-11 13:44:18 得分 0
显示错误为:
java.security.InvalidKeyException: Invalid key length: 3 bytes
at com.sun.crypto.provider.DESCipher.engineGetKeySize(DashoA6275)
at javax.crypto.Cipher.b(DashoA12275)
at javax.crypto.Cipher.a(DashoA12275)
at javax.crypto.Cipher.a(DashoA12275)
at javax.crypto.Cipher.a(DashoA12275)
at javax.crypto.Cipher.init(DashoA12275)
at javax.crypto.Cipher.init(DashoA12275)
at DES.des(DES.java:27)
at DES.main(DES.java:71)
Invalid key length: 3 bytes 什么意思啊!?Top
7 楼xuetinge(薛挺)回复于 2005-04-11 13:55:48 得分 0
http://javaalmanac.com/egs/javax.crypto/pkg.html
Top
8 楼dj0517(小可)回复于 2005-04-11 14:00:42 得分 0
能直接告诉我问题所在吗!? 我英文不太好哦,要看懂不是很容易。。。。Top
9 楼ChDw(米)回复于 2005-04-11 14:11:52 得分 10
因为绝对不可以将加密后的数据变成String
唉,你必须清楚,这个byte[]根本不是字符串,这样一转换就存在丢失了
所以你应该使用sun.misc.BASE64Encoder来将它们变成String,而绝对不是new StringTop
10 楼dj0517(小可)回复于 2005-04-11 14:19:17 得分 0
我调用时没有用new string啊,而是直接去调的,因为返回值就是String型的。。。
如下:
public static String des(String data,String key,int mode)
你的意思是我在调用时出错,还是这个方法String des()本身就是错的。。。。!?
Top
11 楼dj0517(小可)回复于 2005-04-11 14:19:43 得分 0
我调用时没有用new string啊,而是直接去调的,因为返回值就是String型的。。。
如下:
public static String des(String data,String key,int mode)
你的意思是我在调用时出错,还是这个方法String des()本身就是错的。。。。!?Top
12 楼dj0517(小可)回复于 2005-04-11 14:29:38 得分 0
你指的是这句错吗!?return new String(out.toByteArray());
“sun.misc.BASE64Encoder”是什么东东啊,为什么我在JDK文档中查不到,要怎么使用啊!?Top
13 楼lasthope(学生)回复于 2005-04-11 15:23:11 得分 0
捧场来了,接分来了Top
14 楼ChDw(米)回复于 2005-04-11 15:41:53 得分 0
就是这句错误了:return new String(out.toByteArray());
sun.misc.BASE64Encoder是一个没有在JDK文档中的类,方法也就两三个啦,从方法名就可以知道意思
它可以完成base64编码,对应的有sun.misc.BASE64Decoder
这两个类经常会有用的,你只有肯定byte[]的确是一个可见字符的字符串时才可以调用new String
否则就使用sun.misc.BASE64Encoder或者其它不会产生丢失数据(如逐个byte to String)的方法来进行转换Top
15 楼dj0517(小可)回复于 2005-04-11 15:51:28 得分 0
谢谢。。。
是这样写吗!?return sun.misc.BASE64Encoder(out.toByteArray());Top
16 楼zyf128(狂风)回复于 2005-04-19 22:25:13 得分 0
怎么用:sun.misc.BASE64Encoder啊?Top
17 楼dj0517(小可)回复于 2005-04-25 09:30:33 得分 0
这样用。。。
String pw="中文";
System.out.println(pw);
pw=new sun.misc.BASE64Encoder().encode(pw.getBytes());
System.out.println(pw);
Top




