JAVA实现AES加密算法代码Word下载.docx
《JAVA实现AES加密算法代码Word下载.docx》由会员分享,可在线阅读,更多相关《JAVA实现AES加密算法代码Word下载.docx(4页珍藏版)》请在冰豆网上搜索。
kgen.init(128,newSecureRandom(password.getBytes()));
SecretKeysecretKey=kgen.generateKey();
byte[]enCodeFormat=secretKey.getEncoded();
SecretKeySpeckey=newSecretKeySpec(enCodeFormat,"
Ciphercipher=Cipher.getInstance("
//创建密码器 byte[]byteContent=content.getBytes("
utf-8"
cipher.init(Cipher.ENCRYPT_MODE,key);
//初始化 byte[]result=cipher.doFinal(byteContent);
returnresult;
//加密 }catch(NoSuchAlgorithmExceptione){ e.printStackTrace();
}catch(NoSuchPaddingExceptione){ e.printStackTrace();
}catch(InvalidKeyExceptione){ e.printStackTrace();
}catch(UnsupportedEncodingExceptione){ e.printStackTrace();
}catch(IllegalBlockSizeExceptione){ e.printStackTrace();
}catch(BadPaddingExceptione){ e.printStackTrace();
} returnnull;
} /** *加密 * *@paramcontent需要加密的内容 *@parampassword加密密码 *@return */ publicstaticbyte[]encrypt(Stringcontent,Stringpassword){ try{ KeyGeneratorkgen=KeyGenerator.getInstance("
} 2.2解密 代码有详细注释,不多废话 注意:
解密的时候要传入byte数组 viewplaincopytoclipboardprint?
/**解密 *@paramcontent待解密内容 *@parampassword解密密钥 *@return */ publicstaticbyte[]decrypt(byte[]content,Stringpassword){ try{ KeyGeneratorkgen=KeyGenerator.getInstance("
//创建密码器 cipher.init(Cipher.DECRYPT_MODE,key);
//初始化 byte[]result=cipher.doFinal(content);
} /**解密 *@paramcontent待解密内容 *@parampassword解密密钥 *@return */ publicstaticbyte[]decrypt(byte[]content,Stringpassword){ try{ KeyGeneratorkgen=KeyGenerator.getInstance("
}
2.3测试代码 Stringcontent="
test"
;
Stringpassword="
12345678"
//加密 System.out.println("
加密前:
"
+content);
byte[]encryptResult=encrypt(content,password);
//解密 byte[]decryptResult=decrypt(encryptResult,password);
System.out.println("
解密后:
+newString(decryptResult));
Stringcontent="
输出结果如下:
加密前:
test 解密后:
test 2.4容易出错的地方 但是如果我们将测试代码修改一下,如下:
try{ StringencryptResultStr=newString(encryptResult,"
//解密 byte[]decryptResult=decrypt(encryptResultStr.getBytes("
),password);
} Stringcontent="
} 则,系统会报出如下异常:
javax.crypto.IllegalBlockSizeException:
Inputlengthmustbemultipleof16whendecryptingwithpaddedcipher atcom.sun.crypto.provider.SunJCE_f.b(DashoA13*..) atcom.sun.crypto.provider.SunJCE_f.b(DashoA13*..) atcom.sun.crypto.provider.AESCipher.engineDoFinal(DashoA13*..) atjavax.crypto.Cipher.doFinal(DashoA13*..) 这主要是因为加密后的byte数组是不能强制转换成字符串的,换言之:
字符串和byte数组在这种情况下不是互逆的;
要避免这种情况,我们需要做一些修订,可以考虑将二进制数据转换成十六进制表示,主要有如下两个方法:
2.4.1将二进制转换成16进制 /**将二进制转换成16进制 *@parambuf *@return */ publicstaticStringparseByte2HexStr(bytebuf[]){ StringBuffersb=newStringBuffer();
for(inti=0;
i Stringhex=Integer.toHexString(buf[i]&
0xFF);
if(hex.length()==1){ hex='
0'
+hex;
} sb.append(hex.toUpperCase());
} returnsb.toString();
} /**将二进制转换成16进制 *@parambuf *@return */ publicstaticStringparseByte2HexStr(bytebuf[]){ StringBuffersb=newStringBuffer();
} 2.4.2将16进制转换为二进制 /**将16进制转换为二进制 *@paramhexStr *@return */ publicstaticbyte[]parseHexStr2Byte(StringhexStr){ if(hexStr.length() returnnull;
byte[]result=newbyte[hexStr.length()/2];
i inthigh=Integer.parseInt(hexStr.substring(i*2,i*2+1),16);
intlow=Integer.parseInt(hexStr.substring(i*2+1,i*2+2),16);
result[i]=(byte)(high*16+low);
} returnresult;
/**将16进制转换为二进制 *@paramhexStr *@return */ publicstaticbyte[]parseHexStr2Byte(StringhexStr){ if(hexStr.length() returnnull;
} 然后,我们再修订以上测试代码,如下:
StringencryptResultStr=parseByte2HexStr(encryptResult);
加密后:
+encryptResultStr);
//解密 byte[]decryptFrom=parseHexStr2Byte(encryptResultStr);
byte[]decryptResult=decrypt(decryptFrom,password);
测试结果如下:
test 加密后:
73C58BAFE578C59366D8C995CD0B9D6D 解密后:
test 2.5另外一种加密方式 还有一种加密方式,大家可以参考如下:
/** *加密 * *@paramcontent需要加密的内容 *@parampassword加密密码 *@return */ publicstaticbyte[]encrypt2(Stringcontent,Stringpassword){ try{ SecretKeySpeckey=newSecretKeySpec(password.getBytes(),"
AES/ECB/NoPadding"
byte[]byteContent=content.getBytes("
} /** *加密 * *@paramcontent需要加密的内容 *@parampassword加密密码 *@return */ publicstaticbyte[]encrypt2(Stringcontent,Stringpassword){ try{ SecretKeySpeckey=newSecretKeySpec(password.getBytes(),"
}catch(UnsupportedEncodingExceptione){ e.print