这两天程序做压力测试,发现了一个问题,在用jdk提供的des加密时,当访问量过大时,加解密时突然报错
java.lang.IllegalStateException: Cipher not initialized
at javax.crypto.Cipher.c(DashoA12275)
at javax.crypto.Cipher.doFinal(DashoA12275)
at com.changda.encrypt.DESEngine.encrypt(DESEngine.java:67)
at com.changda.encrypt.DESEngine.encrypt(DESEngine.java:106)
at com.changda.clientapi.BaseCall.creatKey(BaseCall.java:220)
at com.changda.util.SendXNMRequest.sendRequest(SendXNMRequest.java:50)
at com.changda.business.service.AccountServiceImpl.login(AccountServiceImpl.java:21)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:304)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:139)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:107)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:161)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
at $Proxy1.login(Unknown Source)
at com.changda.struts.action.LoginAction.execute(LoginAction.java:71)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at com.changda.util.ParseConfigfile.doFilter(ParseConfigfile.java:18)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at com.mas.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:122)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
at java.lang.Thread.run(Thread.java:595)
看错误是Cipher未初始化,可代码中肯定初始化了,怀疑是jdk本身没来得及初始化,原程序中的做法是,每次解加解密,都创建一个Cipher对象,现改为,有几个密钥就创建几个静态的Cipher对象,放在hashmap中,问题解决。
修改后的java des加密 程序如下:
import java.security.*;
import java.util.HashMap;
import javax.crypto.*;
public class DESEngine {
private static HashMap encryptCipherMap=new HashMap();
private static HashMap decryptCipherMap=new HashMap();
public static String byteArr2HexStr(byte[] arrB) throws Exception {
int iLen = arrB.length;
StringBuffer sb = new StringBuffer(iLen * 2);
for (int i = 0; i < iLen; i++) {
int intTmp = arrB[i];
while (intTmp < 0) {
intTmp = intTmp + 256;
}
if (intTmp < 16) {
sb.append("0");
}
sb.append(Integer.toString(intTmp, 16));
}
return sb.toString();
}
public byte[] hexStr2ByteArr(String strIn) throws Exception {
byte[] arrB = strIn.getBytes();
int iLen = arrB.length;
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;
}
private static DESEngine single = new DESEngine();
private DESEngine() {
}
public static DESEngine getInstance() {
return single;
}
private void init(String strKey)throws Exception{
Security.addProvider(new com.sun.crypto.provider.SunJCE());
Key key = getKey(strKey.getBytes());
if(encryptCipherMap.get(strKey)==null){
Cipher encryptCipher = Cipher.getInstance("DES/ECB/NoPadding","SunJCE");
encryptCipher.init(Cipher.ENCRYPT_MODE, key);
encryptCipherMap.put(strKey, encryptCipher);
}
if(decryptCipherMap.get(key)==null){
Cipher decryptCipher = Cipher.getInstance("DES/ECB/NoPadding","SunJCE");
decryptCipher.init(Cipher.DECRYPT_MODE, key);
decryptCipherMap.put(strKey, decryptCipher);
}
}
public byte[] encrypt(byte[] arrB,String key) throws Exception {
return ((Cipher)encryptCipherMap.get(key)).doFinal(arrB);
}
public byte[] decrypt(byte[] arrB,String key) throws Exception {
return ((Cipher)decryptCipherMap.get(key)).doFinal(arrB);
}
private Key getKey(byte[] arrBTmp) throws Exception {
byte[] arrB = new byte[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 String encrypt(String key,String strIn) throws Exception {
this.init(key);
byte[] inb = strIn.getBytes();
int length = inb.length;
int mod = length % 8;
if (mod != 0) {
mod = 8 - mod;
}
byte[] newin = new byte[length + mod];
for (int u = 0; u < length; u++) {
newin[u] = inb[u];
}
//给存储明文的字节数组a的不足位补0
for (int u = length; u < newin.length; u++) {
newin[u] = 0;
}
return byteArr2HexStr(encrypt(newin,key));
}
public String decrypt(String key,String strIn) throws Exception {
this.init(key);
return new String(decrypt(hexStr2ByteArr(strIn),key));
}
}
分享到:
相关推荐
本文首先分析了Java源代码需要加密的原因,简要介绍了DES算法及Java密码体系和Java密码扩展,最后说明了利用DES加密算法保护Java源代码的方法及步骤。
java关于加密的算法demo代码(Base64加密\数字签名\对称加密算法\非对称加密算法\消息摘要算法) JAVA安全实现三种方式: 1.JDK 2.Commons Codec 3.Bouncy Castle 一。非对称加密算法: 1.DH 2.RSA 3.ELGamal 二。...
用Java加密类实现常规的DES、RSA及SHA的加密算法,代码完整,收藏一下。
内容:基于jdk1.4的加密算法的具体实现,算法包括MD5,SHA-1,DES,DESede,RSA等
DESServiceECB.jar 实现了DES的ECB模式下的算法,允许对字符串、字节、文件的加密.
非对称加密算法:com.timliu.security.asymmetric_encryption 1.DH 2.RSA 3.ElGamal 二。Base64:com.timliu.security.base64 1.JDK实现 2.common codes实现 3.bouncy castle实现 三。消息摘要算法:...
1、javax.crypto.Cipher 类提供加密和解密的功能,它构成了 Java Cryptography Extension (JCE) —— Java 加密扩展框架的核心。这些都是 Java JDK 原生的 API,...3、Cipher 支持 4 种加密算法:AES、DES、DESede、R
RSA、MD5 字符串、MD5文件、DES、ELGamal等加密算法实现,以及RSA模拟数字签名过程(工程Crypto和RSASignature),全部用GUI展现(NetBean6.5的Swing库),要求JDK1.5+,读者可以直接运行dist目录下的jar文件,一目了然...
本实验应用DES,RSA,MD5 等加密算法,以及Socket 套接字实现一个简单的加密解密的聊天工具CryptTalk。本实验的程序在jdk1.6 与Eclipse 开发环境下编写,基本实现了 消息加密的聊天工具的功能。通信的步骤基本如下:...
通过使用这款软件,就能帮助用户对编解码、编码转换、字符处理、哈希、MAC、对称加密、非对加密。软件是用Java语言编写的,要...对称加密算法:AES、DES、IDEA、XXTEA等 非对称加密算法:RSA、SM(国产椭圆曲线密码)
涉及到的算法如下(Java...所有算法的实现均是JDK官方实现或者是Apache的开源实现,本人不对算法做任何单独实现。所以关于算法细节我一概不知。 我只是一个搬运工而已!附件是涉及到的jar包 eclipse项目直接导入即可。
实例166 利用DES加密/解密 474 第17章 Java多媒体 495 实例167 幸运52(Applet) 495 实例168 三维弹球游戏(Java 3D) 498 实例169 贪吃的小蛇 502 实例170 有趣的拼图游戏 510 实例171 滚动的文字 517 实例...