java加密之AES/CBC/PKCS5Padding
2017-07-27 20:55
507 查看
和上一篇原理一样,只是多一个偏移量
本事例中偏移量直接使用密钥,但是为了安全起见,最好不要这么做
1.加密
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("utf-8"); SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");//"算法/模式/补码方式" IvParameterSpec iv = new IvParameterSpec(cKey.getBytes());//使用CBC模式,需要一个向量iv,可增加加密算法的强度 cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv); byte[] encrypted = cipher.doFinal(sSrc.getBytes()); return new Base64().encode(encrypted);//此处使用BASE64做转码功能,同时能起到2次加密的作用。 }
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("utf-8"); SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); IvParameterSpec iv = new IvParameterSpec(cKey.getBytes()); cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv); byte[] encrypted1 = new Base64().decode(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; } }
3.测试
public static void main(String[] args) throws Exception { /* * 加密用的Key 可以用26个字母和数字组成,最好不要用保留字符,虽然不会错,至于怎么裁决,个人看情况而定 * 此处使用AES-128-CBC加密模式,key需要为16位。 */ // 需要加密的字串 String cSrc = "{data:[{'name':'你好','age':20},{'name':'zd','age':18}]}"; 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 + "毫秒"); }
4.结果
{data:[{'name':'你好','age':20},{'name':'zd','age':18}]} 加密后的字串是:NYVX44VBZP9890WYjeJC7lOnpXCR/Z/B+kbc+nu432KrcegOS08U+lA6clLoP92bHblcBcYf1dced25iNLTTIA== 加密耗时:413毫秒 解密后的字串是:{data:[{'name':'你好','age':20},{'name':'zd','age':18}]} 解密耗时:0毫秒
本事例中偏移量直接使用密钥,但是为了安全起见,最好不要这么做
相关文章推荐
- JS 和 JAVA 实现 aes(AES/CBC/PKCS5Padding) 加密
- java/php对应的AES/CBC/PKCS5Padding模式 加密解密
- java PKCS7Padding 加密Cannot find any provider supporting AES/CBC/PKCS7Padding 解决办法
- AES加密解密 AES/CBC/PKCS5Padding
- java PKCS7Padding 加密Cannot find any provider supporting AES/CBC/PKCS7Padding 解决办法
- Javascript与java相同的3des加密(使用etdesede/CBC/PKCS5Padding )
- java加密之AES/ECB/PKCS5Padding
- OC的DES加密,使与java的Cipher类用DES/CBC/PKCS5Padding方式的加密结果同样
- PHP对接java的AES/ECB/PKCS5Padding加密方式
- OC的DES加密,使与java的Cipher类用DES/CBC/PKCS5Padding方式的加密结果相同
- php AES/CBC/PKCS5Padding 与java对接
- java 小程序开发PKCS7Padding 解密方法实现,以及错误Cannot find any provider supporting AES/CBC/PKCS7Padding 解决办法
- AES - 关于C++和JAVA,AES/ECB/PKCS5Padding 互相通信的问题
- android加密DESede/CBC/PKCS5Padding
- java.security.NoSuchAlgorithmException: Cannot find any provider supporting DESede/CBC/PKCS5Padding
- 关于C++和JAVA,AES/ECB/PKCS5Padding 互相通信的问题
- AES/CBC/PKCS5Padding的PHP实现
- AES/CBC/PKCS5Padding 对称算法加解密
- JAVA DES加密(DES/ECB/PKCS5Padding)和C#加密对应设置
- Java利用 AES/ECB/PKCS5Padding 算法加解密