文章插圖

文章插圖
我不是高手,我只是一個普通的程序員,我特別愿意大家留言討論,批評指正,您給我指正了,我就去查資料,去做實驗,我技術就能得到提高,我認為這是一個程序員的基本素養 。接上一篇
前面兩篇介紹了一下摘要算法MD5和SHA,這一篇介紹一下對稱加密算法AES,這就是真正的加密算法了,前面介紹的摘要算法只能用來提取摘要信息,來對比文件的一致性,是不可逆的,并不能對加密的數據進行還原 。
【3DES算法的加密過程 3des加密原理】還是前面那句話,只聊用法,不聊具體的原理,因為我不懂 。
簡言之,提供一個密鑰,對一段明文數據通過算法進行一個加密,密鑰長度越長越安全 。
加密以后的數據,通過同一個密鑰進行解密就能拿到加密前的明文數據,因為加密和解密用的是同一個密鑰,所以又叫對稱加密,后面我會在介紹一個加密和解密用不同的密鑰就叫做非對稱加密 。
對稱加密常用的算法有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;}
- URL參數加密解密 url的加密解密方法
- 二次函數判別式的由來 二次函數的判斷式
- 兒童喜歡吃的菜
- 哺乳可以吃辣嗎
- 醬豆角的做法
- 魚頭的熱量是多少?
- 維他命d的作用
- 前男友的這些舉動 前男友躲著我的原因
- 靠譜的網戀是怎樣的 網戀多久可以確定關系
- 如何聊天才能高效挽回前任 重新加回前任的第一句話說什么
