|
C# 使用 MD5, DES, RSA 演算法加解密 |
|
|
|
在 .NET Framework 中有個 namespace 是專門處理加解密動作 System.Security.Cryptography 針對許多種加解密方式都有對應的類別來處理 列出三種加密法實作 其它加密碼如 SHA1 系列與 MD5 語法相似,AES 與 DES 語法相似 就不另外寫出來了 PS. 以下部份資料取至 維基百科 |
|
|
|
MD5 演算法 |
|
MD5 即 Message-Digest Algorithm 5,是電腦廣泛使用的雜湊演算法之一 其演算法複雜度和不可逆性,通常用於確保資訊傳輸完整一致 因其不可逆性,所以只有加密的函式,沒有解密的函式 |
|
|
|
|
|
/// <summary> |
|
/// 取得 MD5 編碼後的 Hex 字串 |
|
/// 加密後為 32 Bytes Hex String (16 Byte) |
|
/// </summary> |
|
/// <span name="original" class="mceItemParam"></span>原始字串</param> |
|
/// <returns></returns> |
|
public static string GetMD5(string original) |
|
{ |
|
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider(); |
|
byte[] b = md5.ComputeHash(Encoding.UTF8.GetBytes(original)); |
|
return BitConverter.ToString(b).Replace("-", string.Empty); |
|
} |
|
DES 加解密演算法 |
|
DES 加密法於 1977 年被聯邦政府列為數據加密標準 其加解密速度非常快速,但因為 56 位元金鑰過短 很有可能於 24 小時內被破解 如果需要安全一點的加密方式,可以考慮改用 AES 機制 AES 語法與 DES 大致相同,只在加解密的金鑰 KEY 及 IV 長度不同 加密及解碼需使用相同的金鑰 |
|
|
|
|
|
/// <summary> |
|
/// DES 加密字串 |
|
/// </summary> |
|
/// <span name="original" class="mceItemParam"></span>原始字串</param> |
|
/// <span name="key" class="mceItemParam"></span>Key,長度必須為 8 個 ASCII 字元</param> |
|
/// <span name="iv" class="mceItemParam"></span>IV,長度必須為 8 個 ASCII 字元</param> |
|
/// <returns></returns> |
|
public static string EncryptDES(string original, string key, string iv) |
|
{ |
|
try |
|
{ |
|
DESCryptoServiceProvider des = new DESCryptoServiceProvider(); |
|
des.Key = Encoding.ASCII.GetBytes(key); |
|
des.IV = Encoding.ASCII.GetBytes(iv); |
|
byte[] s = Encoding.ASCII.GetBytes(original); |
|
ICryptoTransform desencrypt = des.CreateEncryptor(); |
|
return BitConverter.ToString(desencrypt.TransformFinalBlock(s, 0, s.Length)).Replace("-", string.Empty); |
|
} |
|
catch { return original; } |
|
} |
|
|
|
/// <summary> |
|
/// DES 解密字串 |
|
/// </summary> |
|
/// <span name="hexString" class="mceItemParam"></span>加密後 Hex String</param> |
|
/// <span name="key" class="mceItemParam"></span>Key,長度必須為 8 個 ASCII 字元</param> |
|
/// <span name="iv" class="mceItemParam"></span>IV,長度必須為 8 個 ASCII 字元</param> |
|
/// <returns></returns> |
|
public static string DecryptDES(string hexString, string key, string iv) |
|
{ |
|
try |
|
{ |
|
DESCryptoServiceProvider des = new DESCryptoServiceProvider(); |
|
des.Key = Encoding.ASCII.GetBytes(key); |
|
des.IV = Encoding.ASCII.GetBytes(iv); |
|
|
|
byte[] s = new byte[hexString.Length / 2]; |
|
int j = 0; |
|
for (int i = 0; i < hexString.Length/2; i++) |
|
{ |
|
s[i] = Byte.Parse(hexString[j].ToString() + hexString[j + 1].ToString(), System.Globalization.NumberStyles.HexNumber); |
|
j += 2; |
|
} |
|
ICryptoTransform desencrypt = des.CreateDecryptor(); |
|
return Encoding.ASCII.GetString(desencrypt.TransformFinalBlock(s, 0, s.Length)); |
|
} |
|
catch { return hexString; } |
|
} |
|
|
|
RSA 加解密演算法 |
|
RSA 是一種非對稱性加密演算法,其原理是以公鑰及私鑰來處理加解密 簡單來說,公鑰可以提供給任何需要加密的人,但是私鑰必須妥善保存 加密時以公鑰處理即可,但解密必須有私鑰 |
|
|
|
|
|
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); |
|
// 公鑰 xml 字串 |
|
publicXml = rsa.ToXmlString(false); |
|
// 私鑰 xml 字串 |
|
privateXml = rsa.ToXmlString(true); |
|
// 公鑰 |
|
publicParameter = rsa.ExportParameters(false); |
|
// 私鑰 |
|
privateParameter = rsa.ExportParameters(true); |
|
在 .NET Framework 中公私鑰可以 xml 及 RSAParameters 類別型態存在 而金鑰產生最簡單的方式是由 RSACryptoServiceProvider 類別來產生 每次初始化 RSACryptoServiceProvider 類別時即會亂數產生一組金鑰 |
|
|
|
|
|
|
|
加解密時只要使用同一組金鑰 (公私鑰) 即可 |
|
|
|
view plaincopy to clipboardprint? |
|
/// <summary> |
|
/// RSA 加密字串 |
|
/// </summary> |
|
/// <span name="original" class="mceItemParam"></span>原始字串</param> |
|
/// <span name="xmlString" class="mceItemParam"></span>公鑰 xml 字串</param> |
|
/// <returns></returns> |
|
public static string EncryptRSA(string original, string xmlString) |
|
{ |
|
try |
|
{ |
|
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); |
|
rsa.FromXmlString(xmlString); |
|
byte[] s = Encoding.ASCII.GetBytes(original); |
|
return BitConverter.ToString(rsa.Encrypt(s, false)).Replace("-", string.Empty); |
|
} |
|
catch { return original; } |
|
} |
|
|
|
/// <summary> |
|
/// RSA 加密字串 |
|
/// 加密後為 256 Bytes Hex String (128 Byte) |
|
/// </summary> |
|
/// <span name="original" class="mceItemParam"></span>原始字串</param> |
|
/// <span name="parameters" class="mceItemParam"></span>公鑰 RSAParameters 類別</param> |
|
/// <returns></returns> |
|
public static string EncryptRSA(string original, RSAParameters parameters) |
|
{ |
|
try |
|
{ |
|
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); |
|
rsa.ImportParameters(parameters); |
|
byte[] s = Encoding.ASCII.GetBytes(original); |
|
return BitConverter.ToString(rsa.Encrypt(s, false)).Replace("-", string.Empty); |
|
} |
|
catch { return original; } |
|
} |
|
|
|
/// <summary> |
|
/// RSA 解密字串 |
|
/// </summary> |
|
/// <span name="hexString" class="mceItemParam"></span>加密後 Hex String</param> |
|
/// <span name="xmlString" class="mceItemParam"></span>私鑰 xml 字串</param> |
|
/// <returns></returns> |
|
public static string DecryptRSA(string hexString, string xmlString) |
|
{ |
|
try |
|
{ |
|
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); |
|
rsa.FromXmlString(xmlString); |
|
byte[] s = new byte[hexString.Length / 2]; |
|
int j = 0; |
|
for (int i = 0; i < hexString.Length/2; i++) |
|
{ |
|
s[i] = Byte.Parse(hexString[j].ToString() + hexString[j + 1].ToString(), System.Globalization.NumberStyles.HexNumber); |
|
j += 2; |
|
} |
|
return Encoding.ASCII.GetString(rsa.Decrypt(s, false)); |
|
} |
|
catch { return hexString; } |
|
} |
|
|
|
/// <summary> |
|
/// RSA 解密字串 |
|
/// </summary> |
|
/// <span name="hexString" class="mceItemParam"></span>加密後 Hex String</param> |
|
/// <span name="parameters" class="mceItemParam"></span>私鑰 RSAParameters 類別</param> |
|
/// <returns></returns> |
|
public static string DecryptRSA(string hexString, RSAParameters parameters) |
|
{ |
|
try |
|
{ |
|
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); |
|
rsa.ImportParameters(parameters); |
|
byte[] s = new byte[hexString.Length / 2]; |
|
int j = 0; |
|
for (int i = 0; i < hexString.Length/2; i++) |
|
{ |
|
s[i] = Byte.Parse(hexString[j].ToString() + hexString[j + 1].ToString(), System.Globalization.NumberStyles.HexNumber); |
|
j += 2; |
|
} |
|
return Encoding.ASCII.GetString(rsa.Decrypt(s, false)); |
|
} |
|
catch { return hexString; } |
|
} |
|
原文 http://carllee413.pixnet.net/blog/post/3202781-c%23-%E4%BD%BF%E7%94%A8-md5,-des,-rsa-%E6%BC%94%E7%AE%97%E6%B3%95%E5%8A%A0%E8%A7%A3%E5%AF%86- |