日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Java AES加密和解密教程

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

在本教程中,我們將看到如何使用JDK中的Java密碼體系結(jié)構(gòu)(JCA)來實(shí)現(xiàn)AES加密和解密。對稱密鑰塊密碼在數(shù)據(jù)加密中起重要作用。這意味著同一密鑰可用于加密和解密。高級加密標(biāo)準(zhǔn)(AES)是一種廣泛使用的對稱密鑰加密算法。

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

在AES中生成密鑰的方法有兩種:從隨機(jī)數(shù)生成或從給定密碼生成。

在第一種方法中,應(yīng)該從像SecureRandom類這樣的加密安全(偽)隨機(jī)數(shù)生成器生成秘密密鑰。為了生成密鑰,我們可以使用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;}

加密字符串

要實(shí)現(xiàn)輸入字符串加密,我們首先需要根據(jù)上一節(jié)生成密鑰和初始化向量IV:

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

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

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

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

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

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初始化密碼來解密內(nèi)容:

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);}

加密文件

現(xiàn)在,讓我們使用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();}

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

為了解密文件,我們使用類似的步驟,并使用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);}

基于密碼加密解密

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

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

讓我們寫一個測試方法:

@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類。該對象應(yīng)可序列化。讓我們從定義學(xué)生類開始:

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加密和解密教程的詳細(xì)內(nèi)容,更多關(guān)于Java AES加密和解密的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲少妇诱惑| 蜜桃视频在线观看一区| 中文字幕日本一区| 欧美日韩国产亚洲一区| 在线国产精品一区| 亚洲精品美女| 国产精品亚洲片在线播放| 免费在线观看一区| 欧美性感美女一区二区| 三级精品视频| 麻豆91精品| 美女视频一区在线观看| 欧美片第1页| 在线视频亚洲欧美中文| 国产精品巨作av| 国产日韩电影| 亚洲毛片一区| 欧美国产偷国产精品三区| 久久精品国产99久久| 亚洲我射av| 欧美日韩亚洲一区二区三区在线| 亚洲黄色中文字幕| 影视先锋久久| 亚洲无线观看| 97精品国产| 日韩中文一区二区| av中文字幕在线观看第一页 | 精品国产网站| 欧美午夜精彩| 麻豆精品久久| 日韩在线卡一卡二| 免费观看亚洲| 国产亚洲欧美日韩在线观看一区二区 | 国产精品日本| 美腿丝袜亚洲一区| 香蕉久久国产| 国产真实久久| 欧美日本二区| 蜜臀久久久99精品久久久久久| 日韩精品永久网址| 久久99国产精品视频| 亚洲欧洲另类| 日韩亚洲一区在线| 国产一区二区三区视频在线| 精品欧美日韩精品| 水蜜桃久久夜色精品一区的特点| 97精品一区二区| 免费在线观看一区二区三区| 精品亚洲美女网站| 91亚洲一区| 国产精品1luya在线播放| 日韩久久一区| 亚洲免费福利一区| 欧美国产极品| 亚洲精品三级| 91九色综合| 中文在线资源| 欧美激情麻豆| 你懂的国产精品| 欧美aa在线视频| 久久精品国产免费| 日本在线精品| 国产精品mm| 精品国产亚洲日本| a日韩av网址| 日本精品不卡| 久久久久国产精品一区三寸| 亚洲经典在线| 国精品一区二区| 国产午夜久久| 亚洲伊人影院| 欧美日韩中文| 最近高清中文在线字幕在线观看1| 日韩精品欧美| 国产亚洲永久域名| 亚洲精品日本| 久久久久亚洲精品中文字幕| 麻豆一区在线| 欧美成a人免费观看久久| 国产模特精品视频久久久久| 自拍自偷一区二区三区| 国产毛片久久久| 国产成人精品福利| 午夜久久福利| 欧美亚洲三级| 日韩av福利| 国产一精品一av一免费爽爽| 日韩欧美另类一区二区| 亚洲欧美日韩在线观看a三区 | 国产乱码精品一区二区亚洲| 国产日韩一区二区三免费高清| 久久久五月天| 伊人久久亚洲| 精品久久免费| 国产精品试看| 欧美激情久久久久久久久久久| 成人免费电影网址| 日韩美女国产精品| 欧美日韩精品免费观看视完整| 免费国产自线拍一欧美视频| 日韩福利视频一区| 五月天激情综合网| 麻豆传媒一区二区三区| 亚洲开心激情| 国产精品久久久久av电视剧| 国产精品一级在线观看| re久久精品视频| 成人国产精品一区二区网站| 亚洲欧洲专区| 日韩午夜一区| 亚洲特级毛片| 欧美日韩一区二区三区视频播放| 国产69精品久久| 亚州av一区| 首页欧美精品中文字幕| 一区二区小说| 日韩在线短视频| 黄色网一区二区| 麻豆精品国产91久久久久久| 香蕉久久久久久久av网站| 天堂资源在线亚洲| 国产一区久久| 999精品色在线播放| 天堂а√在线最新版中文在线| 国产精品二区不卡| 国产精品igao视频网网址不卡日韩 | 香蕉久久一区| 日韩三区四区| 中文视频一区| 亚洲精品影视| 国产精品入口久久| 美女视频黄久久| 麻豆国产欧美日韩综合精品二区| 精品亚洲a∨一区二区三区18| 国产一区二区视频在线看| 久久av免费| 成人欧美一区二区三区的电影| 久草免费在线视频| 成人污污视频| 蜜臀a∨国产成人精品| 天堂成人国产精品一区| 麻豆国产精品777777在线| 久久国际精品| 国产96在线亚洲| 亚洲夜间福利| 亚洲免费福利一区| 国产精品流白浆在线观看| 日本午夜精品一区二区三区电影| 精品久久97| 久久夜夜操妹子| 日韩在线电影| 女生影院久久| 四虎在线精品| 亚洲一级影院| 日韩av中文字幕一区二区| 日本免费久久| 亚洲精品无播放器在线播放| 国产精品22p| 国产一区白浆| 蜜桃精品视频| 热久久国产精品| 91精品婷婷色在线观看| 18国产精品| 欧美特黄一区| 久久免费精品| 国产精品欧美一区二区三区不卡 | 老鸭窝毛片一区二区三区| 91精品国产自产在线观看永久∴| 久久福利影视| 午夜欧美精品久久久久久久| 黄色亚洲精品| 亚洲欧美在线综合| 亚洲精品九九| 欧美日韩在线精品一区二区三区激情综合 | 亚洲精品日本| 在线精品视频一区| 欧美亚洲在线日韩| 女同性一区二区三区人了人一| 亚洲激情不卡| 久久国产小视频| 午夜电影亚洲| 丝袜美腿亚洲色图| 亚洲欧美日韩在线观看a三区| 日韩中文字幕亚洲一区二区va在线| 国产精品试看| 蜜臀av性久久久久蜜臀aⅴ四虎| 国产欧美综合一区二区三区| 日本va欧美va瓶| 国产不卡人人| 国产精品久久久久av电视剧| 亚洲综合精品四区| 日韩精品免费视频一区二区三区 | 高清日韩中文字幕| 国产精品xx| 黑丝一区二区| 欧美亚洲三区| 久久九九精品| 免费观看久久久4p| 国产精品v亚洲精品v日韩精品| 99久久久久久中文字幕一区|