我不是高手,我只是一個普通的程序員,我特別願意大家留言討論,批評指正,您給我指正了,我就去查資料,去做實驗,我技術就能得到提高,我認為這是一個程序員的基本素養。
接上一篇
前面兩篇介紹了一下摘要演算法MD5和SHA,這一篇介紹一下對稱加密演算法AES,這就是真正的加密演算法了,前面介紹的摘要演算法只能用來提取摘要信息,來對比文件的一致性,是不可逆的,並不能對加密的數據進行還原。
還是前面那句話,只聊用法,不聊具體的原理,因為我不懂。
簡言之,提供一個密鑰,對一段明文數據通過演算法進行一個加密,密鑰長度越長越安全。
加密以後的數據,通過同一個密鑰進行解密就能拿到加密前的明文數據,因為加密和解密用的是同一個密鑰,所以又叫對稱加密,後面我會在介紹一個加密和解密用不同的密鑰就叫做非對稱加密。
對稱加密常用的演算法有DES(全稱 Data Encryption Standard),3DES(稱為 Triple DES)就是DES的增強版用DES加密3次,還有就是今天要介紹的AES,比DES和3DES安全性更高。
下面是加密和解密的代碼。
首先,java里的AES默認的密鑰長度是128位,如果需要再加長也是可以的,其實128位已經足夠了。怎麼才能設置一個128位元組的密碼呢,不能每次都記住128個byte,這就用到了我們前面提到的散列演算法,比如MD5就是把任何數據都能轉換成128個byte,而且只要你數據不變,轉換出來的這128個byte就不變,這樣你的密碼如果設置為123456,那麼你AES加密的密鑰就是123456通過MD5散列到的128個byte,當你解密的時候,你就可以同樣用123456散列到同樣的128個byte作為密鑰去解密,記住123456總比記住128個byte要簡單的多。當然AES的密鑰並不是通過MD5來的,我只是用大家更熟悉的MD5舉例子來說明這個思路。
下面是我整理並使用的java的AES的加密解密代碼,c#跟python也都有成熟的代碼,思路也是一樣的。
/**
* 通過對任意密碼進行散列運算得到128位密鑰
* @param password
* @return
* @throws NoSuchAlgorithmException
*/
public static SecretKeySpec getSecretKey(String password) throws NoSuchAlgorithmException {
KeyGenerator kgen = KeyGenerator.getInstance("AES");// 創建AES的Key生產者
SecureRandom ramdom = SecureRandom.getInstance("SHA1PRNG");
ramdom.setSeed(password.getBytes());
kgen.init(128, ramdom);
SecretKey secretKey = kgen.generateKey();// 根據用戶密碼,生成一個密鑰
byte[] enCodeFormat = secretKey.getEncoded();// 返回基本編碼格式的密鑰
System.out.println(enCodeFormat.length);
SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");// 轉換為AES專用密鑰
return key;
}
/**
* AES加密字元串
*
* @param data 需要被加密的數據
* @param password 加密需要的密碼
* @return 密文
*/
public static byte[] encrypt(byte[] data, String password) {
try {
Cipher cipher = Cipher.getInstance("AES");// 創建密碼器
cipher.init(Cipher.ENCRYPT_MODE, getSecretKey(password));// 初始化為加密模式的密碼器
byte[] result = cipher.doFinal(data);// 加密
return result;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 解密AES加密過的字元串
*
* @param content
* AES加密過過的內容
* @param password
* 加密時的密碼
* @return 明文
*/
public static byte[] decrypt(byte[] content, String password) {
try {
Cipher cipher = Cipher.getInstance("AES");// 創建密碼器
cipher.init(Cipher.DECRYPT_MODE, getSecretKey(password));// 初始化為解密模式的密碼器
byte[] result = cipher.doFinal(content);
return result; // 明文
} catch (Exception e) {
e.printStackTrace();
}
return null;
}原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/227907.html
微信掃一掃
支付寶掃一掃