成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

Java AES加密和解密教程

瀏覽:2日期:2022-08-19 18:21:46

在本教程中,我們將看到如何使用JDK中的Java密碼體系結構(JCA)來實現AES加密和解密。對稱密鑰塊密碼在數據加密中起重要作用。這意味著同一密鑰可用于加密和解密。高級加密標準(AES)是一種廣泛使用的對稱密鑰加密算法。

AES算法是一種迭代的對稱密鑰塊密碼,它支持128、192和256位的加密密鑰(秘密密鑰),以對128位的塊中的數據進行加密和解密。

在AES中生成密鑰的方法有兩種:從隨機數生成或從給定密碼生成。

在第一種方法中,應該從像SecureRandom類這樣的加密安全(偽)隨機數生成器生成秘密密鑰。為了生成密鑰,我們可以使用KeyGenerator類。讓我們定義一種用于生成大小為n(128、192和256)位的AES密鑰的方法:

public static SecretKey generateKey(int n) throws NoSuchAlgorithmException { KeyGenerator keyGenerator = KeyGenerator.getInstance('AES'); keyGenerator.init(n); SecretKey key = keyGenerator.generateKey(); return key;}

在第二種方法中,可以使用基于密碼的密鑰派生功能(例如PBKDF2)從給定的密碼派生AES秘密密鑰。下面方法可通過65,536次迭代和256位密鑰長度從給定密碼生成AES密鑰:

public static SecretKey getKeyFromPassword(String password, String salt) throws NoSuchAlgorithmException, InvalidKeySpecException {SecretKeyFactory factory = SecretKeyFactory.getInstance('PBKDF2WithHmacSHA256'); KeySpec spec = new PBEKeySpec(password.toCharArray(), salt.getBytes(), 65536, 256); SecretKey secret = new SecretKeySpec(factory.generateSecret(spec).getEncoded(), 'AES'); return secret;}

加密字符串

要實現輸入字符串加密,我們首先需要根據上一節生成密鑰和初始化向量IV:

IV是偽隨機值,其大小與加密的塊相同。我們可以使用SecureRandom類生成隨機IV。

讓我們定義一種生成IV的方法:

public static IvParameterSpec generateIv() { byte[] iv = new byte[16]; new SecureRandom().nextBytes(iv); return new IvParameterSpec(iv);}

下一步,我們使用getInstance()方法從Cipher類創建一個實例。

此外,我們使用帶有秘密密鑰,IV和加密模式的init()方法配置密碼實例。最后,我們通過調用doFinal()方法對輸入字符串進行加密。此方法獲取輸入字節并以字節為單位返回密文:

public static String encrypt(String algorithm, String input, SecretKey key, IvParameterSpec iv) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidAlgorithmParameterException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {Cipher cipher = Cipher.getInstance(algorithm); cipher.init(Cipher.ENCRYPT_MODE, key, iv); byte[] cipherText = cipher.doFinal(input.getBytes()); return Base64.getEncoder().encodeToString(cipherText);}

為了解密輸入字符串,我們可以使用DECRYPT_MODE初始化密碼來解密內容:

public static String decrypt(String algorithm, String cipherText, SecretKey key, IvParameterSpec iv) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidAlgorithmParameterException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {Cipher cipher = Cipher.getInstance(algorithm); cipher.init(Cipher.DECRYPT_MODE, key, iv); byte[] plainText = cipher.doFinal(Base64.getDecoder().decode(cipherText)); return new String(plainText);}

編寫一個用于加密和解密字符串輸入的測試方法:

@Testvoid givenString_whenEncrypt_thenSuccess() throws NoSuchAlgorithmException, IllegalBlockSizeException, InvalidKeyException, BadPaddingException, InvalidAlgorithmParameterException, NoSuchPaddingException { String input = 'baeldung'; SecretKey key = AESUtil.generateKey(128); IvParameterSpec ivParameterSpec = AESUtil.generateIv(); String algorithm = 'AES/CBC/PKCS5Padding'; String cipherText = AESUtil.encrypt(algorithm, input, key, ivParameterSpec); String plainText = AESUtil.decrypt(algorithm, cipherText, key, ivParameterSpec); Assertions.assertEquals(input, plainText);}

加密文件

現在,讓我們使用AES算法加密文件。步驟是相同的​​,但是我們需要一些IO類來處理文件。讓我們加密一個文本文件:

public static void encryptFile(String algorithm, SecretKey key, IvParameterSpec iv, File inputFile, File outputFile) throws IOException, NoSuchPaddingException, NoSuchAlgorithmException, InvalidAlgorithmParameterException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {Cipher cipher = Cipher.getInstance(algorithm); cipher.init(Cipher.ENCRYPT_MODE, key, iv); FileInputStream inputStream = new FileInputStream(inputFile); FileOutputStream outputStream = new FileOutputStream(outputFile); byte[] buffer = new byte[64]; int bytesRead; while ((bytesRead = inputStream.read(buffer)) != -1) {byte[] output = cipher.update(buffer, 0, bytesRead);if (output != null) { outputStream.write(output);} } byte[] outputBytes = cipher.doFinal(); if (outputBytes != null) {outputStream.write(outputBytes); } inputStream.close(); outputStream.close();}

請注意,不建議嘗試將整個文件(尤其是大文件)讀入內存。相反,我們一次加密一個緩沖區。

為了解密文件,我們使用類似的步驟,并使用DECRYPT_MODE初始化密碼,如前所述。

再次,讓我們定義一個用于加密和解密文本文件的測試方法。在這種方法中,我們從測試資源目錄中讀取baeldung.txt文件,將其加密為一個名為baeldung.encrypted的文件,然后將該文件解密為一個新文件:

@Testvoid givenFile_whenEncrypt_thenSuccess() throws NoSuchAlgorithmException, IOException, IllegalBlockSizeException, InvalidKeyException, BadPaddingException, InvalidAlgorithmParameterException, NoSuchPaddingException {SecretKey key = AESUtil.generateKey(128); String algorithm = 'AES/CBC/PKCS5Padding'; IvParameterSpec ivParameterSpec = AESUtil.generateIv(); Resource resource = new ClassPathResource('inputFile/baeldung.txt'); File inputFile = resource.getFile(); File encryptedFile = new File('classpath:baeldung.encrypted'); File decryptedFile = new File('document.decrypted'); AESUtil.encryptFile(algorithm, key, ivParameterSpec, inputFile, encryptedFile); AESUtil.decryptFile( algorithm, key, ivParameterSpec, encryptedFile, decryptedFile); assertThat(inputFile).hasSameTextualContentAs(decryptedFile);}

基于密碼加密解密

我們可以使用從給定密碼派生的密鑰進行AES加密和解密。

為了生成密鑰,我們使用getKeyFromPassword()方法。加密和解密步驟與字符串輸入部分中顯示的步驟相同。然后,我們可以使用實例化的密碼和提供的密鑰來執行加密。

讓我們寫一個測試方法:

@Testvoid givenPassword_whenEncrypt_thenSuccess() throws InvalidKeySpecException, NoSuchAlgorithmException, IllegalBlockSizeException, InvalidKeyException, BadPaddingException, InvalidAlgorithmParameterException, NoSuchPaddingException {String plainText = 'www.baeldung.com'; String password = 'baeldung'; String salt = '12345678'; IvParameterSpec ivParameterSpec = AESUtil.generateIv(); SecretKey key = AESUtil.getKeyFromPassword(password,salt); String cipherText = AESUtil.encryptPasswordBased(plainText, key, ivParameterSpec); String decryptedCipherText = AESUtil.decryptPasswordBased( cipherText, key, ivParameterSpec); Assertions.assertEquals(plainText, decryptedCipherText);}

加密對象

為了加密Java對象,我們需要使用SealedObject類。該對象應可序列化。讓我們從定義學生類開始:

public class Student implements Serializable { private String name; private int age; // standard setters and getters}

接下來,讓我們加密Student對象:

public static SealedObject encryptObject(String algorithm, Serializable object, SecretKey key, IvParameterSpec iv) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidAlgorithmParameterException, InvalidKeyException, IOException, IllegalBlockSizeException {Cipher cipher = Cipher.getInstance(algorithm); cipher.init(Cipher.ENCRYPT_MODE, key, iv); SealedObject sealedObject = new SealedObject(object, cipher); return sealedObject;}

稍后可以使用正確的密碼解密加密的對象:

public static Serializable decryptObject(String algorithm, SealedObject sealedObject, SecretKey key, IvParameterSpec iv) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidAlgorithmParameterException, InvalidKeyException, ClassNotFoundException, BadPaddingException, IllegalBlockSizeException, IOException {Cipher cipher = Cipher.getInstance(algorithm); cipher.init(Cipher.DECRYPT_MODE, key, iv); Serializable unsealObject = (Serializable) sealedObject.getObject(cipher); return unsealObject;}

讓我們寫一個測試用例:

@Testvoid givenObject_whenEncrypt_thenSuccess() throws NoSuchAlgorithmException, IllegalBlockSizeException, InvalidKeyException, InvalidAlgorithmParameterException, NoSuchPaddingException, IOException, BadPaddingException, ClassNotFoundException {Student student = new Student('Baeldung', 20); SecretKey key = AESUtil.generateKey(128); IvParameterSpec ivParameterSpec = AESUtil.generateIv(); String algorithm = 'AES/CBC/PKCS5Padding'; SealedObject sealedObject = AESUtil.encryptObject( algorithm, student, key, ivParameterSpec); Student object = (Student) AESUtil.decryptObject( algorithm, sealedObject, key, ivParameterSpec); assertThat(student).isEqualToComparingFieldByField(object);}

可以在GitHub上獲得本文的完整源代碼 。

以上就是Java AES加密和解密教程的詳細內容,更多關于Java AES加密和解密的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
亚洲天堂免费在线观看视频| 午夜精品在线看| 亚洲国产一区视频| 欧美日韩亚洲免费| 久久日韩粉嫩一区二区三区| 岛国精品在线播放| 欧美精品99久久久**| 亚洲一区在线电影| 亚洲精品日韩精品| 亚洲欧洲av另类| 欧美视频成人| 国产视频一区二区三区在线观看| 成人免费视频国产在线观看| 欧美理论在线播放| 久久 天天综合| 在线电影一区二区三区| 经典三级在线一区| 精品视频在线免费观看| 久久国内精品自在自线400部| 色哦色哦哦色天天综合| 日韩和欧美一区二区三区| 午夜影院日韩| 依依成人精品视频| 日韩视频久久| 一二三四社区欧美黄| 99精品国产在热久久下载| 亚洲婷婷在线视频| 夜夜嗨一区二区三区| 亚洲激情六月丁香| 国产精品伊人日日| 五月开心婷婷久久| 在线亚洲一区观看| 久色婷婷小香蕉久久| 欧美日韩一区成人| 国产成人精品在线看| 日韩欧美国产综合| 91欧美激情一区二区三区成人| 久久人人97超碰com| 91网站在线播放| 国产精品色哟哟| 99精品99| 午夜欧美在线一二页| 久久综合九色综合久99| 久久er99精品| 欧美成人国产一区二区| 97久久精品人人澡人人爽| 久久精品欧美一区二区三区麻豆 | 99视频国产精品| 久久综合999| 欧美午夜影院| 一区二区三区在线观看网站| 亚洲男人影院| 蜜桃视频一区二区| 欧美一区二区高清| 欧美区国产区| 亚洲精品成人天堂一二三| 日本韩国精品一区二区在线观看| 久久99国产精品免费| 欧美一卡2卡3卡4卡| 欧美一区二区三区久久精品| 亚洲人成伊人成综合网小说| 欧美在线综合| 国内成+人亚洲+欧美+综合在线| 精品国产青草久久久久福利| 亚洲欧美一区在线| 亚洲综合在线五月| 美女91精品| 激情五月婷婷综合网| 日韩午夜三级在线| 国产精品二区二区三区| 午夜精品免费在线观看| 欧美精品久久一区二区三区| 午夜精品一区二区三区四区 | 亚洲在线观看免费| 91黄色免费版| av男人天堂一区| 亚洲精品免费在线| 久久精品中文字幕一区二区三区| 国产剧情av麻豆香蕉精品| 精品国内片67194| 99热免费精品| 九九视频精品免费| 国产喷白浆一区二区三区| 免费日韩视频| 成人午夜视频网站| 国产精品白丝在线| 在线观看免费成人| 欧美精品九九| 日韩二区三区四区| 精品国产污污免费网站入口 | 亚洲国产日本| 久久国产精品色婷婷| 久久精品亚洲精品国产欧美| 欧美亚洲在线| 暴力调教一区二区三区| 性欧美疯狂xxxxbbbb| 欧美xxxxx牲另类人与| aa国产精品| 国产激情视频一区二区在线观看| 最近中文字幕一区二区三区| 欧美日韩免费视频| 国模精品娜娜一二三区| 麻豆中文一区二区| 国产精品家庭影院| 91精品久久久久久蜜臀| 亚洲资源在线观看| 精品免费99久久| 美女久久网站| 99riav久久精品riav| 日本成人在线看| 欧美激情一区二区三区不卡| 在线观看国产91| 伊人久久亚洲影院| 国产成人av电影免费在线观看| 亚洲综合在线观看视频| 精品久久人人做人人爰| 亚洲欧美国产不卡| 欧美va天堂在线| 麻豆精品国产传媒mv男同 | 色88888久久久久久影院野外| 欧美91大片| 国产一区二区三区日韩| 一区二区三区91| 久久久久综合网| 欧美挠脚心视频网站| 母乳一区在线观看| 欧美午夜a级限制福利片| 国产美女主播视频一区| 亚洲一区成人在线| 国产日韩欧美精品综合| 91精品中文字幕一区二区三区| 国产精品社区| 午夜欧美精品| 国产二区国产一区在线观看| 亚洲韩国精品一区| 国产精品久久久一区麻豆最新章节| 91精品婷婷国产综合久久性色| 久久综合电影| 中国女人久久久| 女生裸体视频一区二区三区| 国产伦精品一区二区三区免费 | 国产在线一区二区三区四区| 国产成人av自拍| 日本成人在线不卡视频| **性色生活片久久毛片| 久久综合成人精品亚洲另类欧美| 51精品视频一区二区三区| 麻豆成人精品| 一区免费在线| 色综合一个色综合亚洲| 国产精品一级黄| 蜜桃av一区二区三区电影| 一区二区三区精密机械公司| 国产女同互慰高潮91漫画| 日韩视频在线永久播放| 欧美日本一道本在线视频| 色中色一区二区| 国产伦精品一区二区三区四区免费 | 日本不卡的三区四区五区| 夜夜精品浪潮av一区二区三区| 日韩美女精品在线| 国产精品理论在线观看| 国产色91在线| 精品久久国产97色综合| 欧美一区二区日韩一区二区| 欧美日韩色一区| 欧美色窝79yyyycom| 欧洲视频一区二区| 色婷婷一区二区| 国产乱人伦精品一区二区| 999亚洲国产精| 亚洲国产美女| 日韩香蕉视频| 一区二区三区av| 国产一区二区三区黄| 亚洲精品1区2区| 亚洲国产精品久久久久久女王| 国产精品国产三级欧美二区| 韩国在线视频一区| 在线日本高清免费不卡| 日韩视频久久| 亚洲一区二区在线看| 国产精品日韩欧美一区二区三区 | 亚洲视频一区在线观看| 国产精品入口麻豆九色| 国产精品初高中害羞小美女文| 日韩一区日韩二区| 日韩一区在线免费观看| 亚洲精品水蜜桃| 伊人性伊人情综合网| 一片黄亚洲嫩模| 亚洲成人激情av| 天天综合天天综合色| 日韩av一区二| 捆绑紧缚一区二区三区视频| 极品少妇一区二区三区精品视频| 日韩av不卡一区二区| 麻豆免费看一区二区三区| 国产伦精品一区二区三区在线观看 | 美女一区二区久久|