【java】AES加密解密|及Base64的使用 [转]今天在网上看到一篇不错的博客,里面讲到加密及解密的信息。其实我在
【java】AES加密解密|及Base64的使用 [转]
今天在网上看到一篇不错的博客,里面讲到加密及解密的信息。其实我在公司里面用到的和这几乎一样,为了涉及保密等东西就把这篇文章分享给大家。
?? 更多交流、更多了解:
?? QQ:444084929 [回钦波]
??? 个人主面: http://www.huiqinbo.com
?
?
?
AES加解密算法,使用Base64做转码以及辅助加密:
package?com.wintv.common;
import?javax.crypto.Cipher;
import?javax.crypto.spec.IvParameterSpec;
import?javax.crypto.spec.SecretKeySpec;
import?sun.misc.BASE64Decoder;
import?sun.misc.BASE64Encoder;
/*******************************************************************************
?*?AES加解密算法
?*?
?*?@author?arix04
?*?
?*/
public?class?AES?{
????//?加密
????public?static?String?Encrypt(String?sSrc,?String?sKey)?throws?Exception?{
????????if?(sKey?==?null)?{
????????????System.out.print("Key为空null");
????????????return?null;
????????}
????????//?判断Key是否为16位
????????if?(sKey.length()?!=?16)?{
????????????System.out.print("Key长度不是16位");
????????????return?null;
????????}
????????byte[]?raw?=?sKey.getBytes();
????????SecretKeySpec?skeySpec?=?new?SecretKeySpec(raw,?"AES");?????????? // 创建一个密钥
????????Cipher?cipher?=?Cipher.getInstance("AES/CBC/PKCS5Padding");//"算法/模式/补码方式"
????????IvParameterSpec?iv?=?new?IvParameterSpec("0102030405060708".getBytes());//使用CBC模式,需要一个向量iv,可增加加密算法的强度
????????cipher.init(Cipher.ENCRYPT_MODE,?skeySpec,?iv);?? //用密钥和一组算法参数初始化此 Cipher
????????byte[]?encrypted?=?cipher.doFinal(sSrc.getBytes());???//按单部分操作加密或解密数据,或者结束一个多部分操作。
????????return?new?BASE64Encoder().encode(encrypted);//此处使用BASE64做转码功能,同时能起到2次加密的作用。
????}
????//?解密
????public?static?String?Decrypt(String?sSrc,?String?sKey)?throws?Exception?{
????????try?{
????????????//?判断Key是否正确
????????????if?(sKey?==?null)?{
????????????????System.out.print("Key为空null");
????????????????return?null;
????????????}
????????????//?判断Key是否为16位
????????????if?(sKey.length()?!=?16)?{
????????????????System.out.print("Key长度不是16位");
????????????????return?null;
????????????}
????????????byte[]?raw?=?sKey.getBytes("ASCII");
????????????SecretKeySpec?skeySpec?=?new?SecretKeySpec(raw,?"AES");
????????????Cipher?cipher?=?Cipher.getInstance("AES/CBC/PKCS5Padding");
????????????IvParameterSpec?iv?=?new?IvParameterSpec("0102030405060708"
????????????????????.getBytes());
????????????cipher.init(Cipher.DECRYPT_MODE,?skeySpec,?iv);
????????????byte[]?encrypted1?=?new?BASE64Decoder().decodeBuffer(sSrc);//先用base64解密
????????????try?{
????????????????byte[]?original?=?cipher.doFinal(encrypted1);
????????????????String?originalString?=?new?String(original);
????????????????return?originalString;
????????????}?catch?(Exception?e)?{
????????????????System.out.println(e.toString());
????????????????return?null;
????????????}
????????}?catch?(Exception?ex)?{
????????????System.out.println(ex.toString());
????????????return?null;
????????}
????}
????public?static?void?main(String[]?args)?throws?Exception?{
????????/*
?????????*?加密用的Key?可以用26个字母和数字组成,最好不要用保留字符,虽然不会错,至于怎么裁决,个人看情况而定
?????????*?此处使用AES-128-CBC加密模式,key需要为16位。
?????????*/
????????String?cKey?=?"1234567890123456";
????????//?需要加密的字串
????????String?cSrc?=?"Email?:?arix04@xxx.com";
????????System.out.println(cSrc);
????????//?加密
????????long?lStart?=?System.currentTimeMillis();
????????String?enString?=?AES.Encrypt(cSrc,?cKey);
????????System.out.println("加密后的字串是:"?+?enString);
????????long?lUseTime?=?System.currentTimeMillis()?-?lStart;
????????System.out.println("加密耗时:"?+?lUseTime?+?"毫秒");
????????//?解密
????????lStart?=?System.currentTimeMillis();
????????String?DeString?=?AES.Decrypt(enString,?cKey);
????????System.out.println("解密后的字串是:"?+?DeString);
????????lUseTime?=?System.currentTimeMillis()?-?lStart;
????????System.out.println("解密耗时:"?+?lUseTime?+?"毫秒");
????}
}复制代码
?
AES加解密算法,使用byte2hex做转码:
package?com.wintv.common;
import?javax.crypto.Cipher;
import?javax.crypto.spec.IvParameterSpec;
import?javax.crypto.spec.SecretKeySpec;
import?sun.misc.BASE64Decoder;
import?sun.misc.BASE64Encoder;
/*******************************************************************************
?*?AES加解密算法
?*?
?*?@author?arix04
?*?
?*/
public?class?AES?{
????//?加密
????public?static?String?Encrypt(String?sSrc,?String?sKey)?throws?Exception?{
????????if?(sKey?==?null)?{
????????????System.out.print("Key为空null");
????????????return?null;
????????}
????????//?判断Key是否为16位
????????if?(sKey.length()?!=?16)?{
????????????System.out.print("Key长度不是16位");
????????????return?null;
????????}
????????byte[]?raw?=?sKey.getBytes();
????????SecretKeySpec?skeySpec?=?new?SecretKeySpec(raw,?"AES");
????????Cipher?cipher?=?Cipher.getInstance("AES/CBC/PKCS5Padding");
????????IvParameterSpec?iv?=?new?IvParameterSpec("0102030405060708".getBytes());
????????cipher.init(Cipher.ENCRYPT_MODE,?skeySpec,?iv);
????????byte[]?encrypted?=?cipher.doFinal(sSrc.getBytes());
????????return?byte2hex(encrypted).toLowerCase();
????}
????//?解密
????public?static?String?Decrypt(String?sSrc,?String?sKey)?throws?Exception?{
????????try?{
????????????//?判断Key是否正确
????????????if?(sKey?==?null)?{
????????????????System.out.print("Key为空null");
????????????????return?null;
????????????}
????????????//?判断Key是否为16位
????????????if?(sKey.length()?!=?16)?{
????????????????System.out.print("Key长度不是16位");
????????????????return?null;
????????????}
????????????byte[]?raw?=?sKey.getBytes("ASCII");
????????????SecretKeySpec?skeySpec?=?new?SecretKeySpec(raw,?"AES");
????????????Cipher?cipher?=?Cipher.getInstance("AES/CBC/PKCS5Padding");
????????????IvParameterSpec?iv?=?new?IvParameterSpec("0102030405060708"
????????????????????.getBytes());
????????????cipher.init(Cipher.DECRYPT_MODE,?skeySpec,?iv);
????????????byte[]?encrypted1?=?hex2byte(sSrc);
????????????try?{
????????????????byte[]?original?=?cipher.doFinal(encrypted1);
????????????????String?originalString?=?new?String(original);
????????????????return?originalString;
????????????}?catch?(Exception?e)?{
????????????????System.out.println(e.toString());
????????????????return?null;
????????????}
????????}?catch?(Exception?ex)?{
????????????System.out.println(ex.toString());
????????????return?null;
????????}
????}
????public?static?byte[]?hex2byte(String?strhex)?{
????????if?(strhex?==?null)?{
????????????return?null;
????????}
????????int?l?=?strhex.length();
????????if?(l?%?2?==?1)?{
????????????return?null;
????????}
????????byte[]?b?=?new?byte[l?/?2];
????????for?(int?i?=?0;?i?!=?l?/?2;?i++)?{
????????????b[i]?=?(byte)?Integer.parseInt(strhex.substring(i?*?2,?i?*?2?+?2),
????????????????????16);
????????}
????????return?b;
????}
????public?static?String?byte2hex(byte[]?b)?{
????????String?hs?=?"";
????????String?stmp?=?"";
????????for?(int?n?=?0;?n?<?b.length;?n++)?{
????????????stmp?=?(java.lang.Integer.toHexString(b[n]?&?0XFF));
????????????if?(stmp.length()?==?1)?{
????????????????hs?=?hs?+?"0"?+?stmp;
????????????}?else?{
????????????????hs?=?hs?+?stmp;
????????????}
????????}
????????return?hs.toUpperCase();
????}
????public?static?void?main(String[]?args)?throws?Exception?{
????????/*
?????????*?加密用的Key?可以用26个字母和数字组成,最好不要用保留字符,虽然不会错,至于怎么裁决,个人看情况而定
?????????*/
????????String?cKey?=?"1234567890123456";
????????//?需要加密的字串
????????String?cSrc?=?"Email?:?arix04@xxx.com";
????????System.out.println(cSrc);
????????//?加密
????????long?lStart?=?System.currentTimeMillis();
????????String?enString?=?AES.Encrypt(cSrc,?cKey);
????????System.out.println("加密后的字串是:"?+?enString);
????????long?lUseTime?=?System.currentTimeMillis()?-?lStart;
????????System.out.println("加密耗时:"?+?lUseTime?+?"毫秒");
????????//?解密
????????lStart?=?System.currentTimeMillis();
????????String?DeString?=?AES.Decrypt(enString,?cKey);
????????System.out.println("解密后的字串是:"?+?DeString);
????????lUseTime?=?System.currentTimeMillis()?-?lStart;
????????System.out.println("解密耗时:"?+?lUseTime?+?"毫秒");
????}
}
复制代码