Java加密算法 AES

[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. package com.stone.security;  
  2.   
  3. import java.util.Arrays;  
  4.   
  5. import javax.crypto.Cipher;  
  6. import javax.crypto.KeyGenerator;  
  7. import javax.crypto.SecretKey;  
  8. import javax.crypto.spec.IvParameterSpec;  
  9.   
  10. /** 
  11.  * AES 算法 对称加密,密码学中的高级加密标准 2005年成为有效标准  
  12.  * @author stone 
  13.  * @date 2014-03-10 06:49:19 
  14.  */  
  15. public class AES {  
  16.     static Cipher cipher;  
  17.     static final String KEY_ALGORITHM = "AES";  
  18.     static final String CIPHER_ALGORITHM_ECB = "AES/ECB/PKCS5Padding";  
  19.     /* 
  20.      *  
  21.      */  
  22.     static final String CIPHER_ALGORITHM_CBC = "AES/CBC/PKCS5Padding";  
  23.     /*  
  24.      * AES/CBC/NoPadding 要求 
  25.      * 密钥必须是16位的;Initialization vector (IV) 必须是16位 
  26.      * 待加密内容的长度必须是16的倍数,如果不是16的倍数,就会出如下异常: 
  27.      * javax.crypto.IllegalBlockSizeException: Input length not multiple of 16 bytes 
  28.      *  
  29.      *  由于固定了位数,所以对于被加密数据有中文的, 加、解密不完整 
  30.      *   
  31.      *  可 以看到,在原始数据长度为16的整数n倍时,假如原始数据长度等于16*n,则使用NoPadding时加密后数据长度等于16*n, 
  32.      *  其它情况下加密数据长 度等于16*(n+1)。在不足16的整数倍的情况下,假如原始数据长度等于16*n+m[其中m小于16], 
  33.      *  除了NoPadding填充之外的任何方 式,加密数据长度都等于16*(n+1). 
  34.      */  
  35.     static final String CIPHER_ALGORITHM_CBC_NoPadding = "AES/CBC/NoPadding";   
  36.       
  37.     static SecretKey secretKey;  
  38.           
  39.     public static void main(String[] args) throws Exception {  
  40.         method1("a*jal)k32J8czx囙国为国宽");  
  41.         method2("a*jal)k32J8czx囙国为国宽");  
  42.         method3("a*jal)k32J8czx囙国为国宽");  
  43.           
  44.         method4("123456781234囙为国宽");// length = 16  
  45.         method4("12345678abcdefgh");// length = 16  
  46.           
  47.     }  
  48.       
  49.     /** 
  50.      * 使用AES 算法 加密,默认模式  AES/ECB 
  51.      */  
  52.     static void method1(String str) throws Exception {  
  53.         cipher = Cipher.getInstance(KEY_ALGORITHM);  
  54.         //KeyGenerator 生成aes算法密钥  
  55.         secretKey = KeyGenerator.getInstance(KEY_ALGORITHM).generateKey();  
  56.         System.out.println("密钥的长度为:" + secretKey.getEncoded().length);  
  57.           
  58.         cipher.init(Cipher.ENCRYPT_MODE, secretKey);//使用加密模式初始化 密钥  
  59.         byte[] encrypt = cipher.doFinal(str.getBytes()); //按单部分操作加密或解密数据,或者结束一个多部分操作。  
  60.           
  61.         System.out.println("method1-加密:" + Arrays.toString(encrypt));  
  62.         cipher.init(Cipher.DECRYPT_MODE, secretKey);//使用解密模式初始化 密钥  
  63.         byte[] decrypt = cipher.doFinal(encrypt);  
  64.         System.out.println("method1-解密后:" + new String(decrypt));  
  65.           
  66.     }  
  67.       
  68.     /** 
  69.      * 使用AES 算法 加密,默认模式 AES/ECB/PKCS5Padding 
  70.      */  
  71.     static void method2(String str) throws Exception {  
  72.         cipher = Cipher.getInstance(CIPHER_ALGORITHM_ECB);  
  73.         //KeyGenerator 生成aes算法密钥  
  74.         secretKey = KeyGenerator.getInstance(KEY_ALGORITHM).generateKey();  
  75.         System.out.println("密钥的长度为:" + secretKey.getEncoded().length);  
  76.           
  77.         cipher.init(Cipher.ENCRYPT_MODE, secretKey);//使用加密模式初始化 密钥  
  78.         byte[] encrypt = cipher.doFinal(str.getBytes()); //按单部分操作加密或解密数据,或者结束一个多部分操作。  
  79.           
  80.         System.out.println("method2-加密:" + Arrays.toString(encrypt));  
  81.         cipher.init(Cipher.DECRYPT_MODE, secretKey);//使用解密模式初始化 密钥  
  82.         byte[] decrypt = cipher.doFinal(encrypt);  
  83.         System.out.println("method2-解密后:" + new String(decrypt));  
  84.           
  85.     }  
  86.       
  87.     static byte[] getIV() {  
  88.         String iv = "1234567812345678"//IV length: must be 16 bytes long  
  89.         return iv.getBytes();  
  90.     }  
  91.       
  92.     /** 
  93.      * 使用AES 算法 加密,默认模式 AES/CBC/PKCS5Padding 
  94.      */  
  95.     static void method3(String str) throws Exception {  
  96.         cipher = Cipher.getInstance(CIPHER_ALGORITHM_CBC);  
  97.         //KeyGenerator 生成aes算法密钥  
  98.         secretKey = KeyGenerator.getInstance(KEY_ALGORITHM).generateKey();  
  99.         System.out.println("密钥的长度为:" + secretKey.getEncoded().length);  
  100.           
  101.         cipher.init(Cipher.ENCRYPT_MODE, secretKey, new IvParameterSpec(getIV()));//使用加密模式初始化 密钥  
  102.         byte[] encrypt = cipher.doFinal(str.getBytes()); //按单部分操作加密或解密数据,或者结束一个多部分操作。  
  103.           
  104.         System.out.println("method3-加密:" + Arrays.toString(encrypt));  
  105.         cipher.init(Cipher.DECRYPT_MODE, secretKey, new IvParameterSpec(getIV()));//使用解密模式初始化 密钥  
  106.         byte[] decrypt = cipher.doFinal(encrypt);  
  107.         System.out.println("method3-解密后:" + new String(decrypt));  
  108.           
  109.     }  
  110.       
  111.     /** 
  112.      * 使用AES 算法 加密,默认模式 AES/CBC/NoPadding  参见上面对于这种mode的数据限制 
  113.      */  
  114.     static void method4(String str) throws Exception {  
  115.         cipher = Cipher.getInstance(CIPHER_ALGORITHM_CBC_NoPadding);  
  116.         //KeyGenerator 生成aes算法密钥  
  117.         secretKey = KeyGenerator.getInstance(KEY_ALGORITHM).generateKey();  
  118.         System.out.println("密钥的长度为:" + secretKey.getEncoded().length);  
  119.           
  120.         cipher.init(Cipher.ENCRYPT_MODE, secretKey, new IvParameterSpec(getIV()));//使用加密模式初始化 密钥  
  121.         byte[] encrypt = cipher.doFinal(str.getBytes(), 0, str.length()); //按单部分操作加密或解密数据,或者结束一个多部分操作。  
  122.           
  123.         System.out.println("method4-加密:" + Arrays.toString(encrypt));  
  124.         cipher.init(Cipher.DECRYPT_MODE, secretKey, new IvParameterSpec(getIV()));//使用解密模式初始化 密钥  
  125.         byte[] decrypt = cipher.doFinal(encrypt);  
  126.           
  127.         System.out.println("method4-解密后:" + new String(decrypt));  
  128.           
  129.     }  
  130.       
  131. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值