加密解密,脑袋都搞大了,请大家帮忙看看!(200分)

  • 主题发起人 主题发起人 yuanzi
  • 开始时间 开始时间
Y

yuanzi

Unregistered / Unconfirmed
GUEST, unregistred user!
下面是两个测试程序,(均是从网上找到的,^_^)。
测试程序一:
package encryption;
/**
* Title:
* Description:
* Copyright: Copyright (c) 2001
* Company:
* @author
* @version 1.0
*/
import java.io.*;
import java.math.BigInteger;
import java.security.*;
import java.security.spec.*;
import java.security.interfaces.*;
import javax.crypto.*;
import javax.crypto.spec.*;
import javax.crypto.interfaces.*;
public class En1 {
public En1() {
KeyGenerator keygen;
SecretKey desKey;
Cipher desCipher;
try{
//DES,DESede,PBEWithMD5AndDES,Blowfish
//Generating a Key
// keygen = KeyGenerator.getInstance("DES");
// keygen = KeyGenerator.getInstance("DESede");
keygen = KeyGenerator.getInstance("Blowfish");
desKey = keygen.generateKey();
System.out.println(
desKey.getEncoded().toString()
);
// Create the cipher
// desCipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
// desCipher = Cipher.getInstance("DESede");
desCipher = Cipher.getInstance("Blowfish");

// Our cleartext
byte[] cleartext = "This is just an example:邢战军".getBytes();
StringBuffer StrBuf = new StringBuffer();
for(int i=0,j=cleartext.length;i<j;i++)
{
StrBuf.append(String.valueOf((char)cleartext));
}
System.out.println(" ");
System.out.println(StrBuf.toString());
//Initialize the cipher for encryption
desCipher.init(Cipher.ENCRYPT_MODE,desKey);
// Encrypt the cleartext
StrBuf = new StringBuffer();
byte[] ciphertext = desCipher.doFinal(cleartext);
// System.out.println(ciphertext.toString());
for(int i=0,j=ciphertext.length;i<j;i++)
{
StrBuf.append(String.valueOf((char)ciphertext));
}
System.out.println(" ");
System.out.println("Encrypt the cleartext");
System.out.println(StrBuf.toString());
SecretKeySpec seckey = new javax.crypto.spec.SecretKeySpec(
desKey.getEncoded(),"Blowfish");
System.out.println(
seckey.getEncoded()
);
seckey = new javax.crypto.spec.SecretKeySpec(
seckey.getEncoded(),"Blowfish");
System.out.println(
seckey.getEncoded()
);
// Initialize the same cipher for decryption
// desCipher.init(Cipher.DECRYPT_MODE, desKey);
desCipher.init(Cipher.DECRYPT_MODE, seckey);
// Decrypt the ciphertext
StrBuf = new StringBuffer();
byte[] cleartext1 = desCipher.doFinal(ciphertext);
// System.out.println(cleartext1.toString());
for(int i=0,j=cleartext1.length;i<j;i++)
{
StrBuf.append(String.valueOf((char)cleartext1));
}
System.out.println(" ");
System.out.println("Decrypt the ciphertext");
System.out.println(StrBuf.toString());
}
catch(java.security.InvalidKeyException e2)
{
e2.printStackTrace();
}
catch(java.security.NoSuchAlgorithmException e)
{
e.printStackTrace();
}
catch(javax.crypto.NoSuchPaddingException e1)
{
e1.printStackTrace();
}
catch(javax.crypto.BadPaddingException e3)
{
e3.printStackTrace();
}
catch(javax.crypto.IllegalBlockSizeException e4)
{
e4.printStackTrace();
}
}
public static void main(String[] args) {
En1 en11 = new En1();
}
}
测试程序二:作者:王辉 (ddxxkk@21cn.com)
/*
安全程序 DESede/DES测试
*/
import java.security.*;
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("加密后的二进串:"+byte2hex(cipherByte));
//解密
c1 = Cipher.getInstance(Algorithm);
c1.init(Cipher.DECRYPT_MODE,deskey);
byte[] clearByte=c1.doFinal(cipherByte);
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] &amp;
0XFF));
if (stmp.length()==1) hs=hs+"0"+stmp;
else
hs=hs+stmp;
if (n<b.length-1) hs=hs+":";
}
return hs.toUpperCase();
}
}
我下载了JCE1.2.1版本,导入VAJ3.5,编译通过,遗憾的是上面两个程序运行时都报这
种错误:
Thread[main,5,main](活动):未捕捉到的异常(java.lang.ExceptionInInitializerError)
Thread[Reference Handler,10,system](守护程序活动)
通过分段测试和所报的异常来看,可能是在
keygen = KeyGenerator.getInstance("Blowfish");这个地方就开始出错了。
于是怀疑是JCE有问题:可是在jdk1.4下编译通过,运行时报这种错误:
Exception in thread "main" java.lang.NoClassDefFoundError: d:/En1
不知道是怎么回事了麻烦大家帮我看看这是怎么回事,
其实,我的需求很简单,就是对一个字符串进行加密,得到一段密文,然后对这短密
文可以进行解密,这个串可能很大,密文可能会在WEB浏览器上显示。帮帮忙,提示
得详细一点。
 
拜托,帮忙看看~!
 
VAJ3.5里面不通过很可能是因为VAJ3.5自己的问题,因为VAJ3.5还是jdk1.2.2的执行环境,
而你的JCE可能需要1.3以上。
而NoClassDefFundError,是什么没找到呢?
 
我下的JCE的安装说明中并没有说需要1.3以上,而是jdk1.2.1以后就可以了。(Note that
JCE 1.2.1 requires that you have JavaTM 2 SDK v 1.2.1 or later or JavaTM
2 Runtime Environment v 1.2.1 or later already installed. )
NoClassDefFundError,我也不知道是什么没有找到,怎么来看啊?我的JDK1.4的环境变量设置没有问题,
可以运行别的程序。
 
你的详细的出错信息?
就是在NoClassDefFoundError那一句的,请给出完整的出错信息。
 
奇怪!
你为什么不问作者?明明有他的地址嘛!
我玩《永远的依苏2》,给写攻略的人发信,都是很老的游戏了,可是很快就给我回了:)
 
还是我们自己先捣鼓一下,要使每个人都问作者,作者早就自杀而死了。
 
其实,这两个程序都是没有问题的,在另一个站上的同志都用这个例子通过了,
运行结果也出来了。我就是没有搞明白为什么在我的环境下会有这个问题。
 
to 曹晓钢:
你的详细的出错信息?
就是在NoClassDefFoundError那一句的,请给出完整的出错信息。
???
奇怪,后面什么也没有了啊。根据以往的经验,应该是类没有找到。不会是我的JDK1.4也
有问题吧?
 
根据VAJ所报的错误信息,ExceptionInInitializerError未捕捉。而文档对
ExceptionInInitializerError却是这样说的:
Signals that an unexpected exception has occurred in a static initializer.
An ExceptionInInitializerError is thrown to indicate that an exception
occurred during evaluation of a static initializer or the initializer for
a static variable.
也就是程序在执行keygen = KeyGenerator.getInstance("Blowfish");时就遇到问题了。
 
今天太晚了,明天我给你看吧。
 
to 曹晓钢
当然应该自己先研究一下。不过有问题也可以问问作者的。
如果忙,也用不着自杀,可以置之不理嘛!
小人之心度君子之腹:(面露狰狞)
是不是我最近问你太多了?
不好意思哦,我刚入门确实问题比较多,可是大家谁不是这样过来的?
对你的帮助,我一直都非常感激!
 
你的比喻和这个问题不一样。你说的是供略,而不是写游戏的人。要是每个玩游戏的人都
写信去问写游戏的人,写游戏的人当然要忙死。而写攻略的人和你一样都是玩家,你可以
问玩家,这叫相互切磋;问作者就叫技术支持了。
我们现在面临的这个加密解密的类库,我们都是“玩家”,我们自己先讨论,实在发现了
bug才应该去问原作者。
 
多谢了~!
 
唉~~~~~~!谁有现成的用底层API写的加密解密类啊,不用JCE,能给我一个吗?
如你愿意请发renping_wu@hotmail.com
多谢先~!
 
曹晓钢的歪理还真是不少,我从来也没有想到过这一层。
嗯,好好体会这几个名词:“玩家”,“技术支持”,有道理。
不过不管怎么说,作者可以不理睬嘛!
就像正版软件的厂商一样,就算你买了正版,我也不提供技术支持~~看你能把我怎样?
无奈小弟的水平太差,爱莫能助~~
 
http://delphi.mychangshu.com//dispdoc.asp?id=132
看看这个,不过是Delphi的,但是有说明文档。
 
->可是在jdk1.4下编译通过,运行时报这种错误:
->Exception in thread "main" java.lang.NoClassDefFoundError: d:/En1
你是在VAJ中编译的,还是在命令行编译的??
我觉得从出错信息来看,java 是找D盘下的En1.class没有找到.很显然:如果你没有改程序En1.java
的话,那么一定会报错的.
有两种方法改正:
1.将En1.class放到encryption目录下.在命令行运行命令:
d:>javac En1.java
d:>mkdir encryption
d:>copy ./En1.class d:/encryption
d:>java encryption/En1
(注意:不要把斜线写反了.)
2.修改En1.java文件.去掉程序的第一行:package encryption;
重新编译,并在命令行运行命令:
d:>javac En1.java
d:>java En1
如果你是用VAJ编译的,我没用过它,不太清楚怎么改正,但应该与工程文件(JB中的名词)有关.
 
事实上,我修改了程序的第一行,VAJ编译通过。无法运行.用jDK1.4,在命令行编译运行。
报上面的错误。
后来,删掉jdk1.4,重新装了一个,运行,好了!但在VAJ中情况依然。有时间,在好好看
看到底是怎么回事。
多谢了各位。买单!
 
后退
顶部