1. 程式人生 > >使用AES演算法對檔案進行加密解密(JAVA+Eclipse)

使用AES演算法對檔案進行加密解密(JAVA+Eclipse)

一、專案中引用第三方類庫的方法
    Bouncy Castle類庫的用法(如何在自己的專案中使用第三方類庫)

    1)手動配置

  •     將.jar,src,javadoc拷到專案目錄下
  •    專案名,右鍵選build path-configure build path

    2)使用Maven 或Gradle來配置//線上配置第三方依賴包

  •     http://mvnrepository.com 搜尋 bouncy castle
  •     新建Gradle Project(File->New->other->Gradle->Gradle Project)
  •     找到 bouncy castle最新版本的gradle配置字串將其新增到專案build.gradle配置檔案中的dependencies條目的最後(}前的位置處)。新增完後,儲存build.gradle配置檔案,然後在專案身上右鍵->gradle->refresh gradle project.
二、最終事先效果(沒有設定選擇解密後文件儲存位置的功能,只能存在於加密檔案相同的位置)

三、檔案加密解密程式實現主要程式碼(祕鑰自動生成,不需要使用者輸入祕鑰)
public class MyFileEncryptor {
	@SuppressWarnings("static-access")
	//檔案加密的實現方法
	public static void encryptFile(String fileName,String encryptedFileName){
		try {
			FileInputStream fis = new FileInputStream(fileName);
			FileOutputStream fos = new FileOutputStream(encryptedFileName);
			
			//祕鑰自動生成
			KeyGenerator keyGenerator=KeyGenerator.getInstance("AES");
			keyGenerator.init(128);
			Key key=keyGenerator.generateKey();
			
			
			byte[] keyValue=key.getEncoded();
			
			fos.write(keyValue);//記錄輸入的加密密碼的訊息摘要
			
			SecretKeySpec encryKey= new SecretKeySpec(keyValue,"AES");//加密祕鑰
			
			byte[] ivValue=new byte[16];
			Random random = new Random(System.currentTimeMillis());
			random.nextBytes(ivValue);
			IvParameterSpec iv = new IvParameterSpec(ivValue);//獲取系統時間作為IV
			
			fos.write("MyFileEncryptor".getBytes());//檔案識別符號

			fos.write(ivValue);	//記錄IV
			Cipher cipher = Cipher.getInstance("AES/CFB/PKCS5Padding");
			cipher.init(cipher.ENCRYPT_MODE, encryKey,iv);
			
			CipherInputStream cis=new CipherInputStream(fis, cipher);
			
			byte[] buffer=new byte[1024];
			int n=0;
			while((n=cis.read(buffer))!=-1){
				fos.write(buffer,0,n);		
			}
			cis.close();
			fos.close();
		} catch (InvalidKeyException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NoSuchAlgorithmException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NoSuchPaddingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvalidAlgorithmParameterException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	
	}
	@SuppressWarnings("static-access")
	//檔案解密的實現程式碼
	public static void decryptedFile(String encryptedFileName,String decryptedFileName){
		
			try {
				FileInputStream fis = new FileInputStream(encryptedFileName);
				FileOutputStream fos = new FileOutputStream(decryptedFileName);	
				
				byte[] fileIdentifier=new byte[15];
				
				byte[] keyValue=new byte[16];
				fis.read(keyValue);//讀記錄的檔案加密密碼的訊息摘要
				fis.read(fileIdentifier);				
				if(new String (fileIdentifier).equals("MyFileEncryptor")){
					SecretKeySpec key= new SecretKeySpec(keyValue,"AES");					
					byte[] ivValue= new byte[16];
					fis.read(ivValue);//獲取IV值
					IvParameterSpec iv= new IvParameterSpec(ivValue);
					Cipher cipher = Cipher.getInstance("AES/CFB/PKCS5Padding");
					cipher.init(cipher.DECRYPT_MODE, key,iv);
					CipherInputStream cis= new CipherInputStream(fis, cipher);												
					byte[] buffer=new byte[1024];
					int n=0;
					while((n=cis.read(buffer))!=-1){
						fos.write(buffer,0,n);		
					}
					cis.close();
					fos.close();
					JOptionPane.showMessageDialog(null, "解密成功");	
				}else{
					JOptionPane.showMessageDialog(null, "檔案不是我加密的,愛找誰著誰去");
				}
			} catch (InvalidKeyException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (HeadlessException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (FileNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (NoSuchAlgorithmException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (NoSuchPaddingException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (InvalidAlgorithmParameterException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}	
	}
	public static void main(String[] args) {
		Security.addProvider(new BouncyCastleProvider());
	}
}
圖形介面的實現程式碼:
public class Encryptor extends JFrame {

	private JPanel contentPane;
	private JTextField textFieldSelected;
	private JButton btnEncryptFile;
	private JButton btnDecryptFile;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		Security.addProvider(new BouncyCastleProvider());
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					Encryptor frame = new Encryptor();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public Encryptor() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		btnEncryptFile = new JButton("\u52A0\u5BC6");
		btnEncryptFile.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				String fileName=textFieldSelected.getText();
				String encryptedFileName=fileName+".enc";	
				MyFileEncryptor.encryptFile(fileName, encryptedFileName);								
				JOptionPane.showMessageDialog(null, "加密成功");	
			}
		});
		btnEncryptFile.setBounds(14, 213, 113, 27);
		contentPane.add(btnEncryptFile);
		
		btnDecryptFile = new JButton("\u89E3\u5BC6");
		btnDecryptFile.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				String decryptedFile=textFieldSelected.getText();
				String fileType=".enc";
				String decryptedFileName=decryptedFile.substring(0, decryptedFile.length()-fileType.length());			
				String encryptedFileName=textFieldSelected.getText();
				MyFileEncryptor.decryptedFile(encryptedFileName, decryptedFileName);
			}
		});
		btnDecryptFile.setBounds(292, 213, 113, 27);
		contentPane.add(btnDecryptFile);
		
		textFieldSelected = new JTextField();
		textFieldSelected.setBounds(14, 92, 360, 24);
		contentPane.add(textFieldSelected);
		textFieldSelected.setColumns(10);
		
		JButton buttonSelect = new JButton("......");
		buttonSelect.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				JFileChooser fileChooser=new JFileChooser("D:");
				if(fileChooser.showOpenDialog(null)==JFileChooser.APPROVE_OPTION){
					textFieldSelected.setText(fileChooser.getSelectedFile().getPath());
				}
			}
		});
		buttonSelect.setBounds(378, 91, 40, 27);
		contentPane.add(buttonSelect);
		
		JLabel label = new JLabel("\u9009\u62E9\u6587\u4EF6\uFF1A");
		label.setBounds(14, 74, 97, 18);
		contentPane.add(label);
		
		JLabel lblAes = new JLabel("AES\u52A0\u5BC6\uFF0C\u5BC6\u94A5\u957F\u5EA6128");
		lblAes.setBounds(132, 29, 153, 18);
		contentPane.add(lblAes);
	}
}

相關推薦

使用AES演算法檔案進行加密解密JAVA+Eclipse

一、專案中引用第三方類庫的方法    Bouncy Castle類庫的用法(如何在自己的專案中使用第三方類庫)    1)手動配置    將.jar,src,javadoc拷到專案目錄下   專案名,右鍵選build path-configure build path   

java按行讀取檔案檔案進行加密解密

package com.alibaba.datax.plugin.reader.selfxmlfilereader.util; import java.io.UnsupportedEncodingException; import java.security

Linux下利用openssl檔案進行加密解密

--建立檔案test.txt, 特意寫入中英文 # cd /tmp # echo "test測試" > test.txt--開始加密, 使用aes-128-cbc演算法, 也可以使用其他演算法, 通過檢視openssl的幫助可獲知 # openssl aes-128-

C語言程式設計實現使用AES檔案進行加密

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <openssl/aes.h>int main(int argc,char* argv[]){ 

如何運用OpenSSL 檔案進行加密解密

我們在平時的 Linux 運維管理的時候,經常會進行各種資料備份任務。將資料匯出然後打包。通常在安全性要求比較高的環境下,我們可以藉助 OpenSSL 工具對打包後的資料進行加密,這樣能進一步的保障資料的安全性。OpenSSL 使用密碼方式加密或解密檔案1. 使用 opens

CTR分組模式實現AES加密解密go語言

版權宣告:本文為作者原創,如需轉載,請註明出處 https://blog.csdn.net/weixin_42940826 AES演算法簡介 AES演算法是為了取代DES演算法而生,雖然3DES演算法仍然可以使用,但是效率比較低下,AES演算法是在眾多演算法中選拔

黑馬程式設計師——————使用NIO檔案進行復制2

由於檔案複製到檔案和檔案複製到資料夾的程式碼具有重複性,所以兩者方法可結合在一起。 分析: 1,複製到資料夾程式碼多了一層判斷: f(!targetFile.exists())targetFile.mkdirs(); 2,當targetFile為檔案時,targetFile

android AES加密解密最新版

專案中要用到AES加密,百度上的AES壓根不能用,也不知道是那年的東西了,和後臺不相容,後來,後臺把他的AES程式碼拷給我  通過PHP程式碼找到了對應的Android程式碼 原文地址:http://www.funboxpower.com/php_android_ios_a

潤乾報表V4超連結中引數進行加密解密

眾所周知,潤乾本身自帶的引數模板會將引數統一放到引數池中,通過url傳遞引數池ID來進行引數傳遞,而不是直接將引數直接暴露在位址列中。可是在報表中的超連結功能,我們通常是將拼好的url寫上進行報表的鑽取,這時會發現鑽取中的url是全部展現在外面的,如何對這個url進行安全處

spring下jdbc配置檔案進行加密解密

<div id="cnblogs_post_body"><p>最近做一個專案,安全上有點要求,就是要對資料庫相關的配置進行加密,配置檔案如下:</p> <div class="cnblogs_code"><div cla

微信小程式開放資料解密 AES-128-CBC 解密Java版本

最近朋友在弄微信小程式開發,需要跟微信服務端互動,微信敏感資料都有加密返回,需要在服務端接收進行解密後再返回給客戶端小程式,今天就通過Java進行資料的解密,以下展示是Java程式碼如果你使用的C#,請訪問這個地址(C#版本) https://blog.csdn.net/jasonso

js 實現 base58加密/解密包含中文

1. Base58加密原理:和通常base64編碼一樣,base58編碼的作用也是將非可視字元視覺化(ASCII化)。但不同的是base58編碼去掉了幾個看起來會產生歧義的字元,如 0 (零), O (大寫字母O), I (大寫的字母i) and l (小寫的字母L) ,和幾

通過python呼叫adb命令app進行效能測試6 -1

上篇文章中講述了adb是什麼,以及常用的命令,下面我們來看下通過adb來檢視手機裝置中的效能引數,首先要檢視apk的包名和預設Activity的名字有好幾種方式,下面介紹2種 第一種 1 開啟cmd 切換目錄D:\tool\android-sdk_r24.

深度學習Alexnet網路影象進行分類/預測遷移學習

眾所周知,在MATLAB裡面非常方便對各種演算法和技術進行可行性實驗,前幾個月也很好奇用深度學習對影象進行分類,幸好新版本的MATLAB 2017能夠對深度學習提供支援:D,現在抽空把程式碼分享出來與大家共享~ 本文快速的用MATLAB對自己的影象資料集進行訓練和分類,小

加密解密字串處理

標題:加密解密     Playfair密碼由英國人發明,它使用方便而且可以讓頻度分析法失效,直到一戰中才被破譯。     其一變種方法如下:首先選擇一個金鑰單詞(稱為pair)(剔除重複字母,且都為小寫字母),然後與字母表中其他字母一起填入至一個5x5的方陣中,填入方法如

【OS大作業】用多執行緒統計txt檔案中字元個數Java實現

問題描述 給定一個txt檔案,利用不同個數的執行緒查詢檔案中某字元的個數,探究執行緒個數與查詢時間的關係。 本作業程式碼使用JAVA實現,版本為10.0.2,使用的IDE為Eclipse4.9.0. 結果測試所用的txt檔案內容為英文,編碼格式為UTF-8。 原始碼 第一版程式碼:(

LeetCode演算法題-Excel Sheet Column TitleJava實現

這是悅樂書的第180次更新,第182篇原創 01 看題和準備 今天介紹的是LeetCode演算法題中Easy級別的第39題(順位題號是168)。給定正整數,返回Excel工作表中顯示的相應列標題。例如: 1 - > A. 2 - > B. 3 - > C. 26 - >

LeetCode演算法題-Number of 1 BitsJava實現

這是悅樂書的第186次更新,第188篇原創 01 看題和準備 今天介紹的是LeetCode演算法題中Easy級別的第45題(順位題號是191)。編寫一個帶無符號整數的函式,並返回它所具有的“1”位數。例如: 輸入:11 輸出:3 說明:整數11具有二進位制表示000000000000000000000

LeetCode演算法題-Implement Queue Using StacksJava實現

這是悅樂書的第195次更新,第201篇原創 01 看題和準備 今天介紹的是LeetCode演算法題中Easy級別的第57題(順位題號是232)。使用棧實現佇列的以下操作。 push(x) - 將元素x推送到佇列的後面。 pop() - 從佇列前面刪除元素。 peek() - 獲取前面的元素。 e

【LeetCode-演算法】63. 不同路徑 IIJava實現

題目 一個機器人位於一個 m x n 網格的左上角 (起始點在下圖中標記為“Start” )。機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角(在下圖中標記為“Finish”)。現在考慮網格中有障礙物。那麼從左上角到右下角將會有多少條不同的路徑?