DES(Data Encryption Standard)的加密與MD5不同,DES可以解密,而MD5的加密是不可逆的;用於數字簽名和數據加密,對稱加密-即加密秘鑰和解密秘鑰相同。標準的DES密鑰長度為64bit,密鑰每個字元占7bit,外加1bit的奇偶校驗,64/(7+1)=8;所以必須是8個字 ...
DES(Data Encryption Standard)的加密與MD5不同,DES可以解密,而MD5的加密是不可逆的;用於數字簽名和數據加密,對稱加密-即加密秘鑰和解密秘鑰相同。
標準的DES密鑰長度為64bit,密鑰每個字元占7bit,外加1bit的奇偶校驗,64/(7+1)=8;所以必須是8個字元也只能是8個字元,但 .NET 里 DESCryptoServiceProvider 這個類是微軟已經封裝好的了,如果密鑰長度不足,會以 PKCS7Padding 方式補足位。
加密:
首先我們先定義好key和iv
private static string key = "abcd1234";//密文 加密解密是都需要密文且保持一致 private static string iv = "12345678";//加密解密時key 、 iv 中傳入的key、iv值一致
註意:
-
- 加密時:Key中傳key變數. IV傳iv變數 。
- 解密時:Key中傳 key變數 IV傳iv變數。
- 加密時的key必須是同一個key 、IV向量也必須保持一致否則會報錯(可將key分別傳給Key和IV,就不會存在此問題)。
- key值傳入的不同加密結果不同。
public string Des(string encryptString) { DESCryptoServiceProvider des=new DESCryptoServiceProvider(); byte[] sor = Encoding.UTF8.GetBytes(encryptString); //傳入key、iv des.Key = UTF8Encoding.UTF8.GetBytes(key); des.IV = UTF8Encoding.UTF8.GetBytes(iv); MemoryStream ms = new MemoryStream(); CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write); cs.Write(sor, 0, sor.Length); cs.FlushFinalBlock(); StringBuilder sb = new StringBuilder(); foreach (byte b in ms.ToArray()) { sb.AppendFormat("{0:X2}", b); } return sb.ToString(); }
幾個必要的對象:
-
- DESCryptoServiceProvider 沒有它怎麼des?
- MemoryStream 存儲在記憶體的流對象
- CryptoStream 定義將數據流鏈接到加密轉換流。通過它寫入MemoryStream對象當中
- 最後轉換成String
解密:
public string DecryptString(string pToDecrypt) { DESCryptoServiceProvider des = new DESCryptoServiceProvider(); byte[] inputByteArray = new byte[pToDecrypt.Length / 2]; for (int x = 0; x < pToDecrypt.Length / 2; x++) { int i = (Convert.ToInt32(pToDecrypt.Substring(x * 2, 2), 16)); inputByteArray[x] = (byte)i; }
des.Key = UTF8Encoding.UTF8.GetBytes(key);//***************key與加密時的Key保持一致 des.IV = UTF8Encoding.UTF8.GetBytes(iv);//*****************skey與加密時的IV保持一致 MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write); cs.Write(inputByteArray, 0, inputByteArray.Length); cs.FlushFinalBlock(); StringBuilder ret = new StringBuilder(); return Encoding.UTF8.GetString(ms.ToArray()); }