程序在myEclipse中可以运行 在命令行里运行出错

gq2010 2012-08-10 12:35:22
package com.hnzskj.encrypt;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.security.NoSuchAlgorithmException;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;

import org.apache.commons.codec.binary.Base64;

public class Encrypt {

/**
* 对称加密-产生密钥
*/
public static void generatorKey() {
SecretKey key = null;
try {
// 指定算法,这里为DES;如果想用Blowfish算法,则用getInstance("Blowfish")
// BouncyCastle基本上支持所有通用标准算法
KeyGenerator keygen = KeyGenerator.getInstance("DES");
// 指定密钥长度,长度越高,加密强度越大
keygen.init(56);
// 产生密钥
key = keygen.generateKey();
// 构造输出文件,这里的目录是动态的,根据用户名称来构造目录
ObjectOutputStream keyFile = new ObjectOutputStream(
new FileOutputStream("c:\\encrypt\\yhb.des"));
keyFile.writeObject(key);
keyFile.close();
} catch (NoSuchAlgorithmException e5) {
// generateKey()抛出的异常
e5.printStackTrace();
System.out.print("no such algorithm");
System.exit(0);
} catch (IOException e4) {
e4.printStackTrace();
System.out.print("error when generate the deskey");
System.exit(0);
}
}

/**
* 方法描述:对称加密-读取密钥
*/
private static SecretKey getSecretKey() {
// 从密钥文件中读密钥
SecretKey key = null;
try {
ObjectInputStream keyFile = new ObjectInputStream(
new FileInputStream("c:\\encrypt\\yhb.des"));
key = (SecretKey) keyFile.readObject();
keyFile.close();
} catch (FileNotFoundException ey1) {
ey1.printStackTrace();
System.out.println("Error when read keyFile");
System.exit(0);
} catch (Exception ey2) {
System.out.println("error when read the keyFile");
ey2.printStackTrace();
}
return key;
}

/**
* 方法描述:加密文本信息
*/
public static String encrypt(String encryptStr) {
SecretKey key = getSecretKey();
Cipher cipher = null;
try {
// 设置算法,应该与加密时的设置一样
cipher = Cipher.getInstance("DES");
// 设置解密模式
cipher.init(Cipher.ENCRYPT_MODE, key);
} catch (Exception ey3) {
ey3.printStackTrace();
System.out.println("Error when create the cipher");
}
byte[] data = null;
try {
data = cipher.doFinal(encryptStr.getBytes());
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
}
encryptStr = Base64.encodeBase64String(data);
return encryptStr;
}

public static void main(String[] args) {
System.out.println(encrypt("加密字符串"));
}
}

这个类在myeclipse中可以正常运行,但是命令行里执行时就出现以下问题:

java.security.NoSuchAlgorithmException: Cannot find any provider supporting DES
at javax.crypto.Cipher.getInstance(DashoA13*..)
at com.hnzskj.encrypt.Encrypt.encrypt(Encrypt.java:90)
at com.hnzskj.encrypt.Encrypt.main(Encrypt.java:110)
Error when create the cipher
Exception in thread "main" java.lang.NullPointerException
at com.hnzskj.encrypt.Encrypt.encrypt(Encrypt.java:99)
at com.hnzskj.encrypt.Encrypt.main(Encrypt.java:110)


...全文
260 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
FFF9527 2012-08-10
  • 打赏
  • 举报
回复

try {
// 设置算法,应该与加密时的设置一样
cipher = Cipher.getInstance("DES");
// 设置解密模式
cipher.init(Cipher.ENCRYPT_MODE, key);
} catch (Exception ey3) {
ey3.printStackTrace();
System.out.println("Error when create the cipher");
// 这里都出现异常了,cipher还是为null
}
byte[] data = null;
try {
//运行到这里,cipher为空肯定出空指针异常啊
data = cipher.doFinal(encryptStr.getBytes());
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (BadPaddingException e) {



看看是否是jar包依赖的问题...
五哥 2012-08-10
  • 打赏
  • 举报
回复
命令行中运行,需要把相关的jar路径加到 classpath中 或者通过 -cp .;相应使用的jar路径 com.hnzskj.encrypt.Encrypt
  • 打赏
  • 举报
回复
你用的是myeclipse自带的jdk吧?
FFF9527 2012-08-10
  • 打赏
  • 举报
回复
-Djava.ext.dirs=E:\workspace\ContractEncrypt\lib

你不是设置了扩展jar包的路径么?
gq2010 2012-08-10
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
java -Djava.ext.dirs=E:\workspace\ContractEncrypt\lib -classpath E:\workspace\ContractEncrypt\lib所依赖jar包的目录 com.hnzskj.encrypt.Encrypt

这样试一下,可以不?
我基本上不用命令行的...
[/Quote]
在命令行是这样运行的

将jdk\jre\lib\ext目录下的sunjce_provider.jar放到E:\workspace\ContractEncrypt\lib中 程序竟然运行正常了
gq2010 2012-08-10
  • 打赏
  • 举报
回复
将jdk\jre\lib目录下的sunjce_provider.jar放在E:\workspace\ContractEncrypt\lib中程序就运行正常了 怎么回事啊
FFF9527 2012-08-10
  • 打赏
  • 举报
回复
java -Djava.ext.dirs=E:\workspace\ContractEncrypt\lib -classpath E:\workspace\ContractEncrypt\lib所依赖jar包的目录 com.hnzskj.encrypt.Encrypt

这样试一下,可以不?
我基本上不用命令行的...
gq2010 2012-08-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
Java code


try {
// 设置算法,应该与加密时的设置一样
cipher = Cipher.getInstance("DES");
// 设置解密模式
cipher.init(Cipher.ENCRYPT_MODE, key);
} catch (Exce……
[/Quote]
在命令行是这样运行的
java -Djava.ext.dirs=E:\workspace\ContractEncrypt\lib com.hnzskj.encrypt.Encrypt
E:\workspace\ContractEncrypt\lib所依赖jar包的目录
我百了个度 2012-08-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
Java code


try {
// 设置算法,应该与加密时的设置一样
cipher = Cipher.getInstance("DES");
// 设置解密模式
cipher.init(Cipher.ENCRYPT_MODE, key);
} catch (Exce……
[/Quote]
同意楼上意见

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧