亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java實現(xiàn)AES加密算法的簡單示例分享

 更新時間:2016年04月07日 08:54:40   作者:匆忙擁擠repeat  
這篇文章主要介紹了Java實現(xiàn)AES加密算法的簡單示例分享,AES算法是基于對密碼值的置換和替代,需要的朋友可以參考下

高級加密標準(英語:Advanced Encryption Standard,縮寫:AES),在密碼學中又稱Rijndael加密法,是美國聯(lián)邦政府采用的一種區(qū)塊加密標準。這個標準用來替代原先的DES,已經(jīng)被多方分析且廣為全世界所使用。
大多數(shù)AES計算是在一個特別的有限域完成的。
AES加密過程是在一個4×4的字節(jié)矩陣上運作,這個矩陣又稱為“狀態(tài)(state)”,其初值就是一個明文區(qū)塊(矩陣中一個元素大小就是明文區(qū)塊中的一個Byte)。(Rijndael加密法因支持更大的區(qū)塊,其矩陣行數(shù)可視情況增加)加密時,各輪AES加密循環(huán)(除最后一輪外)均包含4個步驟:

  • AddRoundKey — 矩陣中的每一個字節(jié)都與該次輪秘鑰(round key)做XOR運算;每個子密鑰由密鑰生成方案產生。
  • SubBytes — 通過個非線性的替換函數(shù),用查找表的方式把每個字節(jié)替換成對應的字節(jié)。
  • ShiftRows — 將矩陣中的每個橫列進行循環(huán)式移位。
  • MixColumns — 為了充分混合矩陣中各個直行的操作。這個步驟使用線性轉換來混合每列的四個字節(jié)。

最后一個加密循環(huán)中省略MixColumns步驟,而以另一個AddRoundKey取代。

Java基本實現(xiàn):

package com.stone.security; 
 
import java.util.Arrays; 
 
import javax.crypto.Cipher; 
import javax.crypto.KeyGenerator; 
import javax.crypto.SecretKey; 
import javax.crypto.spec.IvParameterSpec; 
 
/** 
 * AES 算法 對稱加密,密碼學中的高級加密標準 2005年成為有效標準 
 */ 
public class AES { 
 static Cipher cipher; 
 static final String KEY_ALGORITHM = "AES"; 
 static final String CIPHER_ALGORITHM_ECB = "AES/ECB/PKCS5Padding"; 
 static final String CIPHER_ALGORITHM_CBC = "AES/CBC/PKCS5Padding"; 
/** 
 * AES/CBC/NoPadding 要求 
 * 密鑰必須是16位的;Initialization vector (IV) 必須是16位 
 * 待加密內容的長度必須是16的倍數(shù),如果不是16的倍數(shù),就會出如下異常: 
 * javax.crypto.IllegalBlockSizeException: Input length not multiple of 16 bytes 
 * 
 * 由于固定了位數(shù),所以對于被加密數(shù)據(jù)有中文的, 加、解密不完整 
 * 
 * 可 以看到,在原始數(shù)據(jù)長度為16的整數(shù)n倍時,假如原始數(shù)據(jù)長度等于16*n,則使用NoPadding時加密后數(shù)據(jù)長度等于16*n, 
 * 其它情況下加密數(shù)據(jù)長 度等于16*(n+1)。在不足16的整數(shù)倍的情況下,假如原始數(shù)據(jù)長度等于16*n+m[其中m小于16], 
 * 除了NoPadding填充之外的任何方 式,加密數(shù)據(jù)長度都等于16*(n+1). 
 */ 
 static final String CIPHER_ALGORITHM_CBC_NoPadding = "AES/CBC/NoPadding"; 
 
 static SecretKey secretKey; 
  
 public static void main(String[] args) throws Exception { 
 method1("a*jal)k32J8czx囙國為國寬"); 
 method2("a*jal)k32J8czx囙國為國寬"); 
 method3("a*jal)k32J8czx囙國為國寬"); 
  
 method4("123456781234囙為國寬");// length = 16 
 method4("12345678abcdefgh");// length = 16 
  
 } 
 
 /** 
 * 使用AES 算法 加密,默認模式 AES/ECB 
 */ 
 static void method1(String str) throws Exception { 
 cipher = Cipher.getInstance(KEY_ALGORITHM); 
 //KeyGenerator 生成aes算法密鑰 
 secretKey = KeyGenerator.getInstance(KEY_ALGORITHM).generateKey(); 
 System.out.println("密鑰的長度為:" + secretKey.getEncoded().length); 
  
 cipher.init(Cipher.ENCRYPT_MODE, secretKey);//使用加密模式初始化 密鑰 
 byte[] encrypt = cipher.doFinal(str.getBytes()); //按單部分操作加密或解密數(shù)據(jù),或者結束一個多部分操作。 
  
 System.out.println("method1-加密:" + Arrays.toString(encrypt)); 
 cipher.init(Cipher.DECRYPT_MODE, secretKey);//使用解密模式初始化 密鑰 
 byte[] decrypt = cipher.doFinal(encrypt); 
 System.out.println("method1-解密后:" + new String(decrypt)); 
  
 } 
 
 /** 
 * 使用AES 算法 加密,默認模式 AES/ECB/PKCS5Padding 
 */ 
 static void method2(String str) throws Exception { 
 cipher = Cipher.getInstance(CIPHER_ALGORITHM_ECB); 
 //KeyGenerator 生成aes算法密鑰 
 secretKey = KeyGenerator.getInstance(KEY_ALGORITHM).generateKey(); 
 System.out.println("密鑰的長度為:" + secretKey.getEncoded().length); 
  
 cipher.init(Cipher.ENCRYPT_MODE, secretKey);//使用加密模式初始化 密鑰 
 byte[] encrypt = cipher.doFinal(str.getBytes()); //按單部分操作加密或解密數(shù)據(jù),或者結束一個多部分操作。 
  
 System.out.println("method2-加密:" + Arrays.toString(encrypt)); 
 cipher.init(Cipher.DECRYPT_MODE, secretKey);//使用解密模式初始化 密鑰 
 byte[] decrypt = cipher.doFinal(encrypt); 
 System.out.println("method2-解密后:" + new String(decrypt)); 
  
 } 
 
 static byte[] getIV() { 
 String iv = "1234567812345678"; //IV length: must be 16 bytes long 
 return iv.getBytes(); 
 } 
 
 /** 
 * 使用AES 算法 加密,默認模式 AES/CBC/PKCS5Padding 
 */ 
 static void method3(String str) throws Exception { 
 cipher = Cipher.getInstance(CIPHER_ALGORITHM_CBC); 
 //KeyGenerator 生成aes算法密鑰 
 secretKey = KeyGenerator.getInstance(KEY_ALGORITHM).generateKey(); 
 System.out.println("密鑰的長度為:" + secretKey.getEncoded().length); 
  
 cipher.init(Cipher.ENCRYPT_MODE, secretKey, new IvParameterSpec(getIV()));//使用加密模式初始化 密鑰 
 byte[] encrypt = cipher.doFinal(str.getBytes()); //按單部分操作加密或解密數(shù)據(jù),或者結束一個多部分操作。 
  
 System.out.println("method3-加密:" + Arrays.toString(encrypt)); 
 cipher.init(Cipher.DECRYPT_MODE, secretKey, new IvParameterSpec(getIV()));//使用解密模式初始化 密鑰 
 byte[] decrypt = cipher.doFinal(encrypt); 
 System.out.println("method3-解密后:" + new String(decrypt)); 
  
 } 
 
 /** 
 * 使用AES 算法 加密,默認模式 AES/CBC/NoPadding 參見上面對于這種mode的數(shù)據(jù)限制 
 */ 
 static void method4(String str) throws Exception { 
 cipher = Cipher.getInstance(CIPHER_ALGORITHM_CBC_NoPadding); 
 //KeyGenerator 生成aes算法密鑰 
 secretKey = KeyGenerator.getInstance(KEY_ALGORITHM).generateKey(); 
 System.out.println("密鑰的長度為:" + secretKey.getEncoded().length); 
  
 cipher.init(Cipher.ENCRYPT_MODE, secretKey, new IvParameterSpec(getIV()));//使用加密模式初始化 密鑰 
 byte[] encrypt = cipher.doFinal(str.getBytes(), 0, str.length()); //按單部分操作加密或解密數(shù)據(jù),或者結束一個多部分操作。 
  
 System.out.println("method4-加密:" + Arrays.toString(encrypt)); 
 cipher.init(Cipher.DECRYPT_MODE, secretKey, new IvParameterSpec(getIV()));//使用解密模式初始化 密鑰 
 byte[] decrypt = cipher.doFinal(encrypt); 
  
 System.out.println("method4-解密后:" + new String(decrypt)); 
  
 } 
 
} 

相關文章

  • mybatis 查詢sql中in條件用法詳解(foreach)

    mybatis 查詢sql中in條件用法詳解(foreach)

    這篇文章主要介紹了mybatis 查詢sql中in條件用法詳解(foreach),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • Java設計模式之原型模式詳細解讀

    Java設計模式之原型模式詳細解讀

    這篇文章主要介紹了Java設計模式之原型模式詳細解讀,原型模式屬于創(chuàng)建型設計模式,用于創(chuàng)建重復的對象,且同時又保證了性能,該設計模式的好處是將對象的創(chuàng)建與調用方分離,需要的朋友可以參考下
    2023-12-12
  • java之如何定義USB接口

    java之如何定義USB接口

    這篇文章主要介紹了java之如何定義USB接口問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • 詳解Java設計模式之備忘錄模式的使用

    詳解Java設計模式之備忘錄模式的使用

    這篇文章主要介紹了Java設計模式之備忘錄模式的使用,備忘錄模式中的發(fā)起者和管需要的朋友可以參考下
    2016-02-02
  • springboot整合knife4j全過程

    springboot整合knife4j全過程

    這篇文章主要介紹了springboot整合knife4j全過程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 利用Java實現(xiàn)天氣預報播報功能

    利用Java實現(xiàn)天氣預報播報功能

    這篇文章主要為大家介紹了如何利用Java語言實現(xiàn)天氣預報播報功能,文中的示例代碼講解詳細,對我們學習Java有一定的幫助,需要的可以參考一下
    2022-06-06
  • IntelliJ?IDEA?2022.2.1最新永久激活破解教程(持續(xù)更新)

    IntelliJ?IDEA?2022.2.1最新永久激活破解教程(持續(xù)更新)

    這篇文章主要介紹了IntelliJ?IDEA?2022.2.1最新永久激活破解教程(持續(xù)更新),小編測試這種激活工具也適用idea2022以下所有版本,本篇教程整理的比較詳細,匯總了idea各個版本的激活工具,激活方法多種多樣,大家選擇一種即可,感興趣的朋友跟隨小編一起看看吧
    2022-09-09
  • Spring中的八大模式簡單介紹

    Spring中的八大模式簡單介紹

    這篇文章主要介紹了Spring中的八大模式簡單介紹,結合實例代碼給大家講解的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-06-06
  • springboot2.6.4集成swagger3.0遇到的坑及解決方法

    springboot2.6.4集成swagger3.0遇到的坑及解決方法

    這篇文章主要介紹了springboot2.6.4如何集成swagger3.0,在集成的過程中遇到很多問題,本文給大家分享四種問題及相應的解決方案,需要的朋友可以參考下
    2022-03-03
  • Java中監(jiān)聽器Listener詳解

    Java中監(jiān)聽器Listener詳解

    Listener是由Java編寫的WEB組件,主要完成對內置對象狀態(tài)的變化 (創(chuàng)建、銷毀)和屬性的變化進行監(jiān)聽,做進一步的處理,主要對session和application內置對象監(jiān)聽,這篇文章主要介紹了Java中監(jiān)聽器Listener,需要的朋友可以參考下
    2023-08-08

最新評論