在Java中调用sun公司提供的3DES加密解密算法时,需要使用到$JAVA_HOME/jre/lib/目录下如下的4个jar包: jce.jar security/US_export_policy.jar security/local_policy.jar ext/sunjce_provider.jar
Java运行时会自动加载这些包,因此对于带main函数的应用程序不需要设置到CLASSPATH环境变量中。对于Web应用,不需要把这些包加到WEB-INF/lib目录下。 以下是java中调用sun公司提供的3DES加密解密算法的样本代码: /*字符串DESede(3DES)加密*/ importjava.security.*; importjavax.crypto.*; importjavax.crypto.spec.SecretKeySpec; publicclassThreeDes{ privatestaticfinalStringAlgorithm="DESede";//定义加密算法,可用DES,DESede,Blowfish //keybyte为加密密钥,长度为24字节 //src为被加密的数据缓冲区(源) publicstaticbyte[]encryptMode(byte[]keybyte,byte[]src){ try{ //生成密钥 SecretKeydeskey=newSecretKeySpec(keybyte,Algorithm); //加密 Cipherc1=Cipher.getInstance(Algorithm); c1.init(Cipher.ENCRYPT_MODE,deskey); returnc1.doFinal(src); } catch(java.security.NoSuchAlgorithmExceptione1){ e1.printStackTrace(); } catch(javax.crypto.NoSuchPaddingExceptione2){ e2.printStackTrace(); } catch(java.lang.Exceptione3){ e3.printStackTrace(); } returnnull; } //keybyte为加密密钥,长度为24字节 //src为加密后的缓冲区 publicstaticbyte[]decryptMode(byte[]keybyte,byte[]src){ try{ //生成密钥 SecretKeydeskey=newSecretKeySpec(keybyte,Algorithm); //解密 Cipherc1=Cipher.getInstance(Algorithm); c1.init(Cipher.DECRYPT_MODE,deskey); returnc1.doFinal(src); } catch(java.security.NoSuchAlgorithmExceptione1){ e1.printStackTrace(); } catch(javax.crypto.NoSuchPaddingExceptione2){ e2.printStackTrace(); } catch(java.lang.Exceptione3){ e3.printStackTrace(); } returnnull; } //转换成十六进制字符串 publicstaticStringbyte2hex(byte[]b){ Stringhs=""< SPAN>; Stringstmp=""; for(intn=0;n<b.length;n++){ stmp=(java.lang.Integer.toHexString(b[n]&0XFF)); if(stmp.length()==1)hs=hs+"0"+stmp; elsehs=hs+stmp; if(n<b.length-1) hs=hs+":"; } returnhs.toUpperCase(); } publicstaticvoidmain(String[]args){ //添加新安全算法,如果用JCE就要把它添加进去 Security.addProvider(newcom.sun.crypto.provider.SunJCE()); finalbyte[]keyBytes={0x11,0x22,0x4F,0x58, (byte)0x88,0x10,0x40,0x38,0x28,0x25,0x79,0x51, (byte)0xCB,(byte)0xDD,0x55,0x66,0x77,0x29,0x74, (byte)0x98,0x30,0x40,0x36,(byte)0xE2 }; //24字节的密钥 StringszSrc="Thisisa3DEStest.测试"; System.out.println("加密前的字符串:"+szSrc); byte[]encoded=encryptMode(keyBytes,szSrc.getBytes()); System.out.println("加密后的字符串:"+newString(encoded)); byte[]srcBytes=decryptMode(keyBytes,encoded); System.out.println("解密后的字符串:"+(newString(srcBytes))); } }
(责任编辑:admin) |