【加密技术】对称加密算法(3):AES

一.AES:AES加密算法即密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院 (NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。该算法为比利时密码学家Joan DaemenVincent Rijmen所设计,结合两位作者的名字,以Rijndael之命名之,投稿高级加密标准的甄选流程。(Rijdael的发音近于 "Rhinedoll"。)


二.优缺点:AES在软件及硬件上都能快速地加解密,相对来说较易于实作,且只需要很少的存储器


三.原理:AES算法基于排列和置换运算。排列是对数据重新进行安排,置换是将一个数据单元替换为另一个。AES 使用几种不同的方法来执行排列和置换运算。AES是一个迭代的、对称密钥分组的密码,它可以使用128、192 和 256 位密钥,并且用 128 位(16字节)分组加密和解密数据。与公共密钥密码使用密钥对不同,对称密钥密码使用相同的密钥加密和解密数据。通过分组密码返回的加密数据的位数与输入数据相同。迭代加密使用一个循环结构,在该循环中重复置换和替换输入数据。


四.实现方式(java):

注意!!!:如果是自定义的秘钥,必须指定秘钥的长度,DES,3DES,AES 都一样 

[java]  view plain  copy
  1. <span style="color:#333333;">   /** 
  2.      *  AES 生成秘钥 ,系统生成默认的秘钥,自定义长度 
  3.      * @return 
  4.      * @throws Exception 
  5.      */  
  6.     public static byte [] JDK_AES_GetSecretKey() throws Exception{  
  7.         KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");  
  8.         keyGenerator.init(128);   // new SecureRandom() 默认长度   
  9.         Key secretKey = keyGenerator.generateKey();  
  10.         return secretKey.getEncoded();  
  11.     }  
  12.       
  13.     /** 
  14.      * AES 生成秘钥 ,自定义的秘钥,生成默认的秘钥长度 
  15.      * @param key 
  16.      * @return 
  17.      * @throws Exception 
  18.      */  
  19.     public static byte [] JDK_AES_GetSecretKey(String key) throws Exception{  
  20.         KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");  
  21.         keyGenerator.init(128,new SecureRandom(key.getBytes())); 
  22.         Key secretKey = keyGenerator.generateKey();  
  23.         return secretKey.getEncoded();  
  24.     }  
  25.       
  26.     /** 
  27.      * 使用 AES 加密算法,对数据进行加密    
  28.      * @param src     
  29.      * @param encryptKey 
  30.      * @return 
  31.      * @throws Exception 
  32.      */  
  33.     public static byte [] JDK_AES_Encrypt(String src,byte [] encryptKey) throws Exception{  
  34.         // 秘钥的转换   
  35.         Key key = new SecretKeySpec(encryptKey, "AES");  
  36.           
  37.         //数据加密  
  38.         Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");  
  39.         cipher.init(Cipher.ENCRYPT_MODE, key);  
  40.         byte [] result = cipher.doFinal(src.getBytes());  
  41.         return result;  
  42.     }  
  43.       
  44.     /** 
  45.      * 使用 AES 加密算法,对数据进行解密    
  46.      * @param encryptBytes 
  47.      * @param encryptKey 
  48.      * @return 
  49.      * @throws Exception 
  50.      */  
  51.     public static String JDK_AES_Decrypt(byte [] encryptBytes ,byte [] encryptKey) throws Exception{  
  52.         //key  的转换   
  53.         Key key = new SecretKeySpec(encryptKey, "AES");  
  54.           
  55.         //解密  
  56.         Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");  
  57.         cipher.init(Cipher.DECRYPT_MODE, key);  
  58.         String result = new String(cipher.doFinal(encryptBytes));  
  59.         return result;  
  60.     }  
  61.       
  62.     /** 
  63.      *  jdk   AES 生成秘钥 ,系统生成默认的秘钥,自定义长度 
  64.      * @return 
  65.      * @throws Exception 
  66.      */  
  67.     public static byte [] BC_AES_GetSecretKey() throws Exception{  
  68.         Security.addProvider(new BouncyCastleProvider());  
  69.         KeyGenerator keyGenerator = KeyGenerator.getInstance("AES","BC");  
  70.         keyGenerator.init(128);   // new SecureRandom() 默认长度   
  71.         Key secretKey = keyGenerator.generateKey();  
  72.         return secretKey.getEncoded();  
  73.     }  
  74.       
  75.     /** 
  76.      * bc   AES 生成秘钥 ,自定义的秘钥,生成默认的秘钥长度 
  77.      * @param key 
  78.      * @return 
  79.      * @throws Exception 
  80.      */  
  81.     public static byte [] BC_AES_GetSecretKey(String key) throws Exception{  
  82.         Security.addProvider(new BouncyCastleProvider());  
  83.         KeyGenerator keyGenerator = KeyGenerator.getInstance("AES","BC");  
  84.         keyGenerator.init(128,new SecureRandom(key.getBytes()));  
  85.         Key secretKey = keyGenerator.generateKey();  
  86.         return secretKey.getEncoded();  
  87.     }  
  88.       
  89.     /** 
  90.      * bc   使用 AES 加密算法,对数据进行加密    
  91.      * @param src     
  92.      * @param encryptKey 
  93.      * @return 
  94.      * @throws Exception 
  95.      */  
  96.     public static byte [] BC_AES_Encrypt(String src,byte [] encryptKey) throws Exception{  
  97.         // 秘钥的转换   
  98.         Key key = new SecretKeySpec(encryptKey, "AES");  
  99.           
  100.         //数据加密  
  101.         Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");  
  102.         cipher.init(Cipher.ENCRYPT_MODE, key);  
  103.         byte [] result = cipher.doFinal(src.getBytes());  
  104.         return result;  
  105.     }  
  106.       
  107.     /** 
  108.      * bc  使用 AES 加密算法,对数据进行解密    
  109.      * @param encryptBytes 
  110.      * @param encryptKey 
  111.      * @return 
  112.      * @throws Exception 
  113.      */  
  114.     public static String BC_AES_Decrypt(byte [] encryptBytes ,byte [] encryptKey) throws Exception{  
  115.         //key  的转换   
  116.         Key key = new SecretKeySpec(encryptKey, "AES");  
  117.           
  118.         //解密  
  119.         Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");  
  120.         cipher.init(Cipher.DECRYPT_MODE, key);  
  121.         String result = new String(cipher.doFinal(encryptBytes));  
  122.         return result;  
  123.     }</span>  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值