DES/AES/MD5加密方法
阿新 • • 發佈:2019-02-12
大家好:
今天有空研究了下大家都在喊的AES加密!還以為是什麼深奧的東西呢!終於瞭解了,心中釋然了!跟大家一起分享下吧!DES其實就是:資料加密標準 英文的縮寫!就是個加密的標註而已,AES就是 高階加密標準 英文的縮寫咯,大家都叫縮寫叫慣了,搞得我們這些沒接觸的人一頭霧水!心裡還真憋屈的慌呢!
這是在蒐集資料的時候拿了個例子練手,不過有個問題就是,把這程式碼放到文本里用CMD執行的時候出現了亂碼情況!所幸的是註釋,不影響效果!但是,程式要真遇到這樣的情況的話,就得轉碼了,因為文字的編碼是GBK的,而我所要貼上的程式碼的編碼是UTF-8
import java.util.*; import java.io.*; public class Test { private String encodeResult;//編碼後字串 private String decodeResult;//解碼後字串 public Test() { } //編碼設定 public void setEncodeResult(String encodeResult) { char[] src = encodeResult.toCharArray();//將待編碼字串拆分成字元陣列 StringBuilder sb = new StringBuilder();//儲存編碼後字元 //將待編碼字串拆分成字元陣列 for(int i = 0; i< src.length; i++) { if(Character.isDigit(src[i])) { if(i != src.length-1) {//滿足條件3 char[] temp = new char[Character.getNumericValue(src[i])+1]; Arrays.fill(temp,src[i+1]); sb.append(temp); sb.append("_"); } else {//滿足條件2 sb.append(src[i]); } } else if(src[i] == '_')//滿足條件5 { sb.append("\\UL"); sb.append("_"); } else if(i == src.length-1)//滿足條件1,且到了字串結尾 { sb.append(src[i]); } else//滿足條件1,且未到字串結尾 { sb.append(src[i]); sb.append("_"); } } this.encodeResult = new String(sb);//建立返回編碼後字串 } //獲得編碼後結果 public String getEncodeResult() { return encodeResult; } //解碼設定 public void setDecodeResult(String encodeResult) { String[] temp = encodeResult.split("_"); StringBuilder sb = new StringBuilder(); for(int i = 0; i< temp.length; i++) { if(temp[i].equals("\\UL")) sb.append("_"); else if(temp[i].length()>1) sb.append(temp[i].length()-1); else sb.append(temp[i]); } this.decodeResult = new String(sb); } //獲得解碼後結果 public String getDecodeResult() { return decodeResult; } public static void main(String[] args) { System.out.println("請輸入待編碼字串(以回車鍵結束):"); //此處存在一個亂碼問題,在文字文件中的編碼是GBK而它的編碼是UTF-8,cmd不識別! String source = ""; try { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); source = br.readLine(); } catch (IOException e) { e.printStackTrace(); } Test e = new Test(); e.setEncodeResult(source); System.out.println("編碼後結果:"+e.getEncodeResult()); e.setDecodeResult(e.getEncodeResult()); System.out.println("解碼後結果:"+e.getDecodeResult()); } }
<pre name="code" class="html">請輸入待編碼字串(以回車鍵結束):
abcdc123
編碼後結果:a_b_c_d_c_22_333_3
解碼後結果:abcdc123
【最簡單的加密】1.簡單的概念
明文:加密前的資訊
密文:機密後的資訊
演算法:加密或解密的演算法
金鑰:演算法使用的鑰匙
例子:將123456每位數字都加 1 後得到234567,
其中123456就是明文,
234567就是密文,
加密金鑰就是1,
加密演算法是每位加
<span style="font-size:18px;">import java.security.SecureRandom; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.spec.SecretKeySpec; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; /** * 編碼工具類 * 1.將byte[]轉為各種進位制的字串 * 2.base 64 encode * 3.base 64 decode * 4.獲取byte[]的md5值 * 5.獲取字串md5值 * 6.結合base64實現md5加密 * 7.AES加密 * 8.AES加密為base 64 code * 9.AES解密 * 10.將base 64 code AES解密 * @author uikoo9 * @version 0.0.7.20140601 */ public class Test { public static void main(String[] args) throws Exception { String content = "我愛你,祖國"; System.out.println("加密前:" + content); String key = "123456"; System.out.println("加密金鑰和解密金鑰:" + key); String encrypt = aesEncrypt(content, key); System.out.println("加密後:" + encrypt); String decrypt = aesDecrypt(encrypt, key); System.out.println("解密後:" + decrypt); } /** * AES加密為base 64 code * @param content 待加密的內容 * @param encryptKey 加密金鑰 * @return 加密後的base 64 code * @throws Exception */ public static String aesEncrypt(String content, String encryptKey) throws Exception { return base64Encode(aesEncryptToBytes(content, encryptKey)); } /** * AES加密 * @param content 待加密的內容 * @param encryptKey 加密金鑰 * @return 加密後的byte[] * @throws Exception */ public static byte[] aesEncryptToBytes(String content, String encryptKey) throws Exception { KeyGenerator kgen = KeyGenerator.getInstance("AES"); kgen.init(128, new SecureRandom(encryptKey.getBytes())); Cipher cipher = Cipher.getInstance("AES"); cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(kgen.generateKey().getEncoded(), "AES")); return cipher.doFinal(content.getBytes("utf-8")); } /** * base 64 encode * @param bytes 待編碼的byte[] * @return 編碼後的base 64 code */ public static String base64Encode(byte[] bytes){ return new BASE64Encoder().encode(bytes); } /** * 將base 64 code AES解密 * @param encryptStr 待解密的base 64 code * @param decryptKey 解密金鑰 * @return 解密後的string * @throws Exception */ public static String aesDecrypt(String encryptStr, String decryptKey) throws Exception { return aesDecryptByBytes(base64Decode(encryptStr), decryptKey); } /** * AES解密 * @param encryptBytes 待解密的byte[] * @param decryptKey 解密金鑰 * @return 解密後的String * @throws Exception */ public static String aesDecryptByBytes(byte[] encryptBytes, String decryptKey) throws Exception { KeyGenerator kgen = KeyGenerator.getInstance("AES"); kgen.init(128, new SecureRandom(decryptKey.getBytes())); Cipher cipher = Cipher.getInstance("AES"); cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(kgen.generateKey().getEncoded(), "AES")); byte[] decryptBytes = cipher.doFinal(encryptBytes); return new String(decryptBytes); } /** * base 64 decode * @param base64Code 待解碼的base 64 code * @return 解碼後的byte[] * @throws Exception */ public static byte[] base64Decode(String base64Code) throws Exception{ return new BASE64Decoder().decodeBuffer(base64Code); } }</span><span style="font-size:14px;"> </span>
加密前:我愛你,祖國
加密金鑰和解密金鑰:123456
加密後:DxybZ5Ep/QCXGgORqkqHxMtTuWa7AIUi4zc39ExjtOc=
解密後:我愛你,祖國
下面是MD5加密的方法import java.security.MessageDigest; import sun.misc.BASE64Encoder; /** * 編碼工具類 * 1.將byte[]轉為各種進位制的字串 * 2.base 64 encode * 3.base 64 decode * 4.獲取byte[]的md5值 * 5.獲取字串md5值 * 6.結合base64實現md5加密 * 7.AES加密 * 8.AES加密為base 64 code * 9.AES解密 * 10.將base 64 code AES解密 * @author uikoo9 * @version 0.0.7.20140601 */ public class Test { public static void main(String[] args) throws Exception { String content = "我愛你,祖國"; System.out.println("加密前:" + content); String encrypt = md5Encrypt(content); System.out.println("MD5加密後:" + encrypt); } /** * 結合base64實現md5加密 * @param msg 待加密字串 * @return 獲取md5後轉為base64 * @throws Exception */ public static String md5Encrypt(String msg) throws Exception{ return base64Encode(md5(msg)); } /** * 獲取字串md5值 * @param msg * @return md5 * @throws Exception */ public static byte[] md5(String msg) throws Exception { return md5JiaMi(msg.getBytes()); } /** * base 64 encode * @param bytes 待編碼的byte[] * @return 編碼後的base 64 code */ public static String base64Encode(byte[] bytes){ return new BASE64Encoder().encode(bytes); } /** * 獲取byte[]的md5值 * @param bytes byte[] * @return md5 * @throws Exception */ public static byte[] md5JiaMi(byte[] bytes) throws Exception { MessageDigest md = MessageDigest.getInstance("MD5"); md.update(bytes); return md.digest(); } }
加密前:我愛你,祖國
MD5加密後:56TxRq9EYEbsiKYsSFPRrQ==
就找到這個MD5加密的,解密的方法沒找到!學藝不精啊!還原不了啊!
試驗了幾個小例子,總結一句話,就是,演算法是雙方自己定義的,就是一個準則,按照這個準則來程式設計就可以了!
終於明白什麼是加密了,好開心啊!
就此程式碼 預留的兩個問題還請大家一起幫忙解決一下啊!1.亂碼問題 2.MD5的解密啊!
如果大家還是很有興趣研究的話就去參考下這個文件吧!
http://zh.wikipedia.org/wiki/高階加密標準#AddRoundKey.E6.AD.A5.E9.AA.A4