`
littlefish
  • 浏览: 27058 次
  • 性别: Icon_minigender_2
  • 来自: 西安
文章分类
社区版块
存档分类
最新评论
阅读更多

这两天程序做压力测试,发现了一个问题,在用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));  
     } 

}

 

分享到:
评论

相关推荐

    利用DES加密算法保护Java源代码

    本文首先分析了Java源代码需要加密的原因,简要介绍了DES算法及Java密码体系和Java密码扩展,最后说明了利用DES加密算法保护Java源代码的方法及步骤。

    java加密算法:Base64加密\数字签名\对称加密算法\非对称加密算法\消息摘要算法

    java关于加密的算法demo代码(Base64加密\数字签名\对称加密算法\非对称加密算法\消息摘要算法) JAVA安全实现三种方式: 1.JDK 2.Commons Codec 3.Bouncy Castle 一。非对称加密算法: 1.DH 2.RSA 3.ELGamal 二。...

    用Java加密类实现DES、RSA及SHA的加密算法

    用Java加密类实现常规的DES、RSA及SHA的加密算法,代码完整,收藏一下。

    bcprov-jdk14-133.rar_SHA in java_bcpprov-jdk14_des_java des

    内容:基于jdk1.4的加密算法的具体实现,算法包括MD5,SHA-1,DES,DESede,RSA等

    基于JDK1.6的DES_ECB加密

    DESServiceECB.jar 实现了DES的ECB模式下的算法,允许对字符串、字节、文件的加密.

    Java_security:Java加密算法(Base64、MD5、AES、DES)

    非对称加密算法:com.timliu.security.asymmetric_encryption 1.DH 2.RSA 3.ElGamal 二。Base64:com.timliu.security.base64 1.JDK实现 2.common codes实现 3.bouncy castle实现 三。消息摘要算法:...

    jce(Java加密扩展)

    1、javax.crypto.Cipher 类提供加密和解密的功能,它构成了 Java Cryptography Extension (JCE) —— Java 加密扩展框架的核心。这些都是 Java JDK 原生的 API,...3、Cipher 支持 4 种加密算法:AES、DES、DESede、R

    Java RSA,MD5 string,MD5 File,DES,ELGamal算法实现+RSA数字签名

    RSA、MD5 字符串、MD5文件、DES、ELGamal等加密算法实现,以及RSA模拟数字签名过程(工程Crypto和RSASignature),全部用GUI展现(NetBean6.5的Swing库),要求JDK1.5+,读者可以直接运行dist目录下的jar文件,一目了然...

    JAVA编写的加密解密聊天工具

    本实验应用DES,RSA,MD5 等加密算法,以及Socket 套接字实现一个简单的加密解密的聊天工具CryptTalk。本实验的程序在jdk1.6 与Eclipse 开发环境下编写,基本实现了 消息加密的聊天工具的功能。通信的步骤基本如下:...

    ToolsFx密码学工具箱-Java语言编写,是爬虫工程师的好用工具

    通过使用这款软件,就能帮助用户对编解码、编码转换、字符处理、哈希、MAC、对称加密、非对加密。软件是用Java语言编写的,要...对称加密算法:AES、DES、IDEA、XXTEA等 非对称加密算法:RSA、SM(国产椭圆曲线密码)

    encryption.zip

    涉及到的算法如下(Java...所有算法的实现均是JDK官方实现或者是Apache的开源实现,本人不对算法做任何单独实现。所以关于算法细节我一概不知。 我只是一个搬运工而已!附件是涉及到的jar包 eclipse项目直接导入即可。

    JAVA 范例大全 光盘 资源

    实例166 利用DES加密/解密 474 第17章 Java多媒体 495 实例167 幸运52(Applet) 495 实例168 三维弹球游戏(Java 3D) 498 实例169 贪吃的小蛇 502 实例170 有趣的拼图游戏 510 实例171 滚动的文字 517 实例...

Global site tag (gtag.js) - Google Analytics