`
asuwing712
  • 浏览: 5734 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类

大批量字符加解密时报 Cipher not initialized

阅读更多
在使用Cipher类最加密的时候,如果需要大量进行加解密工作,需要避免Cipher类的大量实例化,本文用MAP记录已经实例化的Cipher,如果已经存在则不需要在实例化、避免内存浪费、导致 Cipher not initialized    错误。


import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import java.util.HashMap;

import javax.crypto.Cipher;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import sun.misc.BASE64Decoder;

/**
 * 解密
 */
public class DESTool {
	private static String Algorithm = "DESede";// 加密算法的名称
	private static Cipher c;// 密码器
	//private static byte[] cipherByte;
	private static SecretKey deskey;// 密钥
	private static String keyString = "XXXXXXXXXXXXXXXXXXXXXXXXX";// 获得密钥的参数
    private static HashMap decryptCipherMap=new HashMap(); 
   // Logger  log =Logger.getLogger(DESTool.class);
	// 对base64编码的string解码成byte数组
	public byte[] deBase64(String parm) throws IOException {
		BASE64Decoder dec = new BASE64Decoder();
		byte[] dnParm = dec.decodeBuffer(parm);
		//System.out.println(dnParm.length);
		//System.out.println(dnParm);
		return dnParm;
	}

	// 把密钥参数转为byte数组
	public byte[] dBase64(String parm) throws IOException {
		BASE64Decoder dec = new BASE64Decoder();
		byte[] dnParm = dec.decodeBuffer(parm);
		return dnParm;
	}

	/**
	 * 对 Byte 数组进行解密
	 * 
	 * @param buff
	 *            要解密的数据
	 * @return 返回加密后的 String
	 */
	public static String createDecryptor(byte[] buff)
			throws NoSuchPaddingException, NoSuchAlgorithmException,
			UnsupportedEncodingException {
		 byte[] cipherByte = buff ;
		try {
		
			  cipherByte = c.doFinal(buff);
		} catch (javax.crypto.BadPaddingException ex) {
			
			ex.printStackTrace();
			
			return null;
		} catch (javax.crypto.IllegalBlockSizeException ex) {
			ex.printStackTrace();
			return null;
		}
		return (new String(cipherByte, "UTF-8"));
	}

	public void init(String key) throws IOException, InvalidKeyException,
			InvalidKeySpecException {
		byte[] dKey = dBase64(key);
		try {
			
			if(decryptCipherMap.get("keyString")==null){//判断是否已经存在实例,如果存在不在实例化。
				deskey = new javax.crypto.spec.SecretKeySpec(dKey, Algorithm);
				c = Cipher.getInstance(Algorithm);
			    c.init(Cipher.DECRYPT_MODE, deskey);// 初始化密码器,用密钥deskey,进入解密模式
				decryptCipherMap.put("keyString", c);   
			
			}	
		} catch (NoSuchPaddingException ex) {
		} catch (NoSuchAlgorithmException ex) {
		}
	}
	
	
	/**
	 * 
	 * @param strEncryption 加密字符串
	 * @return 返回解密后的字符串
	 * @throws IOException
	 * @throws NoSuchAlgorithmException
	 * @throws NoSuchPaddingException
	 * @throws InvalidKeySpecException
	 * @throws InvalidKeyException
	 * @throws IOException
	 */
	public static String decryptScore(String strEncryption)throws IOException,
	NoSuchAlgorithmException, NoSuchPaddingException,
	InvalidKeySpecException, InvalidKeyException, IOException{
		DESTool des = new DESTool();
		des.init(keyString);
		byte[] dBy = des.deBase64(strEncryption);
		return des.createDecryptor(dBy);
	}
	

	public static void main(String args[]) throws IOException,
			NoSuchAlgorithmException, NoSuchPaddingException,
			InvalidKeySpecException, InvalidKeyException, IOException {
		DESTool des = new DESTool();
		des.init(keyString);
		//byte[] dBy = des.deBase64("1ZVasdJJco1qccDnnfQfb8QeaARxhkR6");
		byte[] dBy = des.deBase64("JdTkEPNsw8E=");
		String dStr = des.createDecryptor(dBy);
		System.out.println("解:" + decryptScore("JdTkEPNsw8E="));
	}
	

}
分享到:
评论
2 楼 douglozy 2014-07-29  
Exception in thread "main" java.security.InvalidKeyException: Invalid key length: 18 bytes
at com.sun.crypto.provider.DESedeCipher.engineGetKeySize(DashoA13*..)
at javax.crypto.Cipher.b(DashoA13*..)
at javax.crypto.Cipher.a(DashoA13*..)
at javax.crypto.Cipher.a(DashoA13*..)
at javax.crypto.Cipher.a(DashoA13*..)
at javax.crypto.Cipher.init(DashoA13*..)
at javax.crypto.Cipher.init(DashoA13*..)
at com.douglas.test.DESTool.init(DESTool.java:91)
at com.douglas.test.DESTool.main(DESTool.java:126)
1 楼 douglozy 2014-07-29  
运行错误?

相关推荐

    Cipher加密解密

    Cipher加密解密

    信息安全密码学中关键词加解密、Permutation cipher加解密、RSA加解密等

    在`keywordcipher_Encryption`和`keywordcipher_Decryption`函数中,我们分别实现了基于关键词的加密和解密过程,通过对明文或密文字符与替代表进行对应操作,实现信息的隐藏和恢复。 Permutation Cipher,又称为...

    Delphi AES 加密解密控件 Cipher_Component(1.0.0.0).rar

    Delphi 开发的AES 等对称加密解密控件 1.AES算法 AES-128-CBC、AES-192-CBC、AES-256-CBC; AES-128-CFB、AES-192-CFB、AES-256-CFB; AES-128-CFB1、AES-192-CFB1、AES-256-CFB1; AES-128-CFB8、AES-192-CFB8、...

    java加密解密算法类_Cipher

    Cipher类在Java Cryptography Architecture (JCA)中扮演了核心角色,它提供了各种加密和解密算法的实现,包括对称加密、非对称加密以及消息认证码(MAC)。在这个Java实现的加密解密工具类中,我们很可能会看到以下...

    自己做的简单的字符加密解密工具

    为了解决这个问题,我们可以利用各种加密技术来保护我们的敏感信息,比如创建自己的简单字符加密解密工具。这样的工具能够将密码等重要数据转换成看似随机的字符串,确保即使信息被他人获取,也无法轻易解读。 加密...

    关于字符串加密解密 DES加密解密

    ### 字符串加密解密——DES加密解密详解 #### 一、概述 在现代信息技术领域,数据安全显得尤为重要。为了保护数据不被未授权访问或窃取,加密技术成为了必不可少的一部分。其中,**DES(Data Encryption Standard...

    Java 生成RSA密钥进行数据加密解密 支持超长字符分区

    本篇主要介绍如何使用Java生成RSA密钥对,进行数据的加密与解密,以及如何处理超长字符的分区问题。 RSA是一种非对称加密算法,它基于两个不同的密钥:公钥和私钥。公钥用于加密,而私钥用于解密。这种机制使得只有...

    高效数据脱敏工具 - MyBatis-Cipher,基于MyBatis的数据库敏感信息加密解密方案

    MyBatis-Cipher 是一款基于 Java 语言开发的数据库敏感信息加密解密方案,专为 MyBatis 设计。它能够在数据进出数据库(DB)的过程中自动对敏感信息进行脱敏处理,极大提高了数据安全性,同时避免了开发者手动实现...

    OJ_字符串加解密

    这个特定的压缩包文件“OJ_字符串加解密”似乎与在OJ平台上解决字符串加解密问题有关。从标签我们可以推断,这个问题可能涉及到C语言,并且可能包含加密和解密字符串的方法。 字符串加解密是信息安全和数据处理中的...

    CIPHER加密解密等多种算法

    综上所述,CIPHER加密解密算法涉及的范围广泛,从基础的对称和非对称加密到复杂的数字签名和网络安全协议,都是确保数据安全的重要工具。在实际应用中,理解并正确使用这些技术对于保护信息安全至关重要。

    字符串的加密解密操作实现

    在IT领域,字符串的加密和解密操作是信息安全和数据保护的重要组成部分。字符串,作为计算机程序中最基础的数据类型之一,经常需要被加密以确保敏感信息的安全性,防止未经授权的访问和泄露。本篇将深入探讨字符串...

    RSA和Vigenere Cipher加解密算法

    2. **解密**:对于密文中的每一个字符C和密钥K中的对应字符,计算出的明文P为P=(C-K+26)%26。这里同样使用了模26运算来处理负数结果。 在给定的代码片段中,`encrypt_vigenere`函数实现了加密过程,而`decrypt_...

    java字符串-用户名和密码-加密解密

    本示例通过Java实现了字符串的加密与解密功能,采用DES加密算法,提供了基本的加密解密功能及字符串与十六进制之间的转换。这种实现方式适用于简单的加密需求,但对于更复杂的安全场景,建议考虑使用更先进的加密...

    des加密解密算法,可以加密解密字符串及文件

    des加解密算法,可加解密文件,及内存 非常好用。

    Java实现的RSA加密解密算法示例

    Cipher类提供了加密和解密的方法,例如doFinal()方法和update()方法。例如,在上面的代码中,我们使用Cipher类来实现加密和解密。 知识点6:密钥文件的生成 在RSA加密解密算法中,密钥文件的生成是非常重要的一步...

    使用VC++实现AES加解密程序

    在本文中,我们将深入探讨如何使用Visual C++(VC++)来实现AES(Advanced Encryption Standard)加解密算法。AES是一种广泛使用的对称加密标准,它提供了强大的数据保护能力,适用于各种应用程序,如文件存储、网络...

    Hi3520/Hi3515 CIPHER API参考 加密/解密

    根据给定文件的信息,我们可以详细地探讨Hi3520/Hi3515 CIPHER API参考中的加密/解密技术及其应用场景。 ### Hi3520/Hi3515 CIPHER API概述 Hi3520/Hi3515 CIPHER API是一套专门用于实现数据加密和解密功能的接口...

    java和javascript之间的DES加密解密

    接着,创建Cipher对象,初始化为加密或解密模式,并使用密钥。最后,调用`doFinal()`方法处理数据。 3. **JavaScript实现DES加密解密**: JavaScript中没有内置的DES库,通常需要依赖第三方库,如`crypto-js`。这...

    恺撒加解密(Caesar cipher)——python脚本实现

    恺撒加密的python实现,CTF必备,小游戏很好,恺撒加解密(Caesar cipher)——python脚本实现

Global site tag (gtag.js) - Google Analytics