当前位置: 代码迷 >> Web前端 >> 【java】AES加密解密|及Base64的施用 [转]
  详细解决方案

【java】AES加密解密|及Base64的施用 [转]

热度:659   发布时间:2012-11-17 11:14:15.0
【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?+?"毫秒");
????}
}
复制代码
  相关解决方案