`
sam_hg
  • 浏览: 4196 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

java blowfish cbc编码解码

阅读更多
java的javax.crypto.Cipher类可以用来做blowfish-cbc算法的编解码;(关于这个类的用法很多好心人已经放在网上,我这里只记录我遇到的问题及解决方法)

我写了一段程序目的是实现php写的一段blowfish-cbc编解码算法,废话不多说了直接上代码:



import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;


public class BlowfishCoder {

	private static final String KEY = "fucking_java_fucking_java_fucking_java_fucking_java_fucking_javafucking_java";
	private static final String ALGORITHM = "Blowfish";
	private static final String MODE = "Blowfish/CBC/NoPadding";

	private SecretKeySpec key = null;
	private Cipher cipherEcode = null;
	private Cipher cipherDecode = null;
	private static BlowfishCoder blowfishCoder = null;
	
	private BlowfishCoder(){}
	
	private void initKey(){
		if(null != this.key){
			return;
		}
		try{
			byte salt[] = KEY.subSequence(0, 32).toString().getBytes();
			this.key = new SecretKeySpec(salt, ALGORITHM);
			
		}catch (Exception e) {
			e.printStackTrace();
		}
		
	}
	
	private void initCipher(int mode){
		initKey();
		try {
			Cipher cipher = Cipher.getInstance(MODE);
			byte[] iv = KEY.subSequence(32, 40).toString().getBytes();
			IvParameterSpec sr = new IvParameterSpec(iv);
			
			cipher.init(mode, this.key, sr);
			if(Cipher.DECRYPT_MODE == mode){
				this.cipherDecode = cipher;
			}
			if(Cipher.ENCRYPT_MODE == mode){
				this.cipherEcode  = cipher;
			}
		}catch (Exception e) {
			e.printStackTrace();
			
		}
		
	}
	
	private String cripherDecode(String in){
		
		try {

			String pass = in;
			
			byte[] xx = Base64.decode(pass);

			Cipher cipher = this.cipherDecode;

			byte[] encrypted = cipher.doFinal( xx );
			String id = new String(encrypted);

			return id;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
	
	private String cripherEncode(String in){       

		try {
			
			Cipher cipher = this.cipherEcode;
			
			byte[] encrypted = cipher.doFinal( in.getBytes() );

			String code = Base64.encode(encrypted);


			return code;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
	
	private static void getInstance(){
		if(null == blowfishCoder){
			blowfishCoder = new BlowfishCoder();
			blowfishCoder.initCipher(Cipher.DECRYPT_MODE);
			blowfishCoder.initCipher(Cipher.ENCRYPT_MODE);
		}
	}
	
	public static String idCrypt(String text, String mode){
		getInstance();
		String retStr = null;
		if ( 0 == mode.compareTo("ENCRYPT") ){
			retStr = blowfishCoder.cripherEncode(text);
		}
		if ( 0 == mode.compareTo("DECRYPT") ){
			retStr = blowfishCoder.cripherDecode(text);
		}
		return retStr;
	}
	
	public static void main(String args[]){

		String code = idCrypt("54539405", "ENCRYPT");
		
		String id = idCrypt(code, "DECRYPT");
		System.out.println("54539405->"+code);
		System.out.println(code+"->"+id);

	}
}



调试的时候总是异常:
InvalidKeyException: Illegal key size
我把这段代码:
KEY.subSequence(0, 32).toString().getBytes();

改为:
KEY.subSequence(0, 8).toString().getBytes();

成功执行,但这并不是我想要的结果。
Google一下在国内的论坛并没有发现有人问这样的问题,old外的网站论坛上有很多人遇到这个问题,有人提出解决方法是下载jbc安装,我很兴奋,try it。
下载下来发现有两个jar包:local_policy.jar,US_export_policy.jar;
我把他们直接copy到 jre/lib/security/目录下,发现这里面已经有了,不管那么多直接替换掉。
改回代码:
KEY.subSequence(0, 32).toString().getBytes();


然后运行,成功,结果是:
54539405->jmViRJdYx7s=
jmViRJdYx7s=->54539405


javaeye 开博第一篇日志,小小的庆祝一下。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics