對稱式加密、非對稱式加密
加密可保護資料,防止被未授權的人讀到原始資料或者修改其內容。有兩種加密的方式,一個為非對稱式加密、一個為對稱式加密,差別在於對稱式加密使用同一把金鑰加解密,而非對稱式加密使用兩把金鑰加解密。
對稱式加密
-
加解密都用同一把金鑰
-
比非對稱式加密快
-
Cryptography namespace 包含五種對稱式加密演算法
-
AES(建議)
-
DES
-
RC2
-
Rijndael
-
TripleDES
-
使用AES加密基本程式範例
static void Main(string[] args)
{
SymmetricSample ss = new SymmetricSample();
string text = "SensitiveData";
// 指定演算法
AesCryptoServiceProvider key = new AesCryptoServiceProvider();
// 加密
byte[] encryptedText = ss.Encrypt(text, key);
Console.WriteLine(Convert.ToBase64String(encryptedText));
// 解密
string decryptedText = ss.Decrypt(encryptedText, key);
Console.WriteLine(decryptedText);
}
public class SymmetricSample
{
public byte[] Encrypt(string plainText, SymmetricAlgorithm key)
{
// 建立MemoryStream,要傳入CryptoStream使用
using (MemoryStream ms = new MemoryStream())
{
// 建立 CryptoStream ,建構式需傳入 1.Stream 2.指定演算法的加密方法 3.指定密碼編譯資料流的模式
using (CryptoStream cs = new CryptoStream(ms, key.CreateEncryptor(), CryptoStreamMode.Write))
{
// 將字串寫入stream,交給CryptoStream 加密
StreamWriter sw = new StreamWriter(cs);
sw.WriteLine(plainText);
sw.Close();
}
// 輸出加密後資料
return ms.ToArray();
}
}
public string Decrypt(byte[] buffer, SymmetricAlgorithm key)
{
// 建立MemoryStream,要傳入CryptoStream使用
using (MemoryStream ms = new MemoryStream(buffer))
{
// 建立 CryptoStream ,建構式需傳入 1.Stream 2.指定演算法的解密方法 3.指定密碼編譯資料流的模式
using (CryptoStream crypstream = new CryptoStream(ms, key.CreateDecryptor(), CryptoStreamMode.Read))
{
// 使用StreamReader讀取CryptoStream資料
using (StreamReader sr = new StreamReader(crypstream))
{
// 解密後輸出
return sr.ReadLine();
}
}
}
}
}
非對稱式加密
使用兩把金鑰加解密,其中一把為公開的金鑰(Public Key)加密用,其中一把解密的私鑰(Private Key),公鑰可公開給別人使用,而私鑰為自己留著,不能公開。
-
通常用於數位簽章
-
Cryptography namespace 包含四種非對稱式加密演算法
-
DSA
-
ECDiffieHellman
-
ECDsa
-
RSA(最多人使用)
-
使用RSA加密基本程式範例
static void Main(string[] args)
{
UnicodeEncoding ByteConverter = new UnicodeEncoding();
string text = "SensitiveData";
AsymmetricSample ays = new AsymmetricSample();
//指定演算法
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
byte[] plaintext = ByteConverter.GetBytes(text);
// 加密
// 傳入 1.要被加密的資料 2.傳入公鑰
byte[] encryptedtext = ays.RSAEncrypt(plaintext, RSA.ExportParameters(false));
Console.WriteLine(ByteConverter.GetString(encryptedtext));
// 解密
// 傳入 1.要被解密的資料 2.傳入私鑰
byte[] decryptedtex = ays.RSADecrypt(encryptedtext, RSA.ExportParameters(true));
Console.WriteLine(ByteConverter.GetString(decryptedtex));
}
public class AsymmetricSample
{
public byte[] RSAEncrypt(byte[] DataToEncrypt, RSAParameters RSAKeyInfo)
{
byte[] encryptedData;
// 建立RSACryptoServiceProvider
using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider())
{
// 傳入公鑰加密
RSA.ImportParameters(RSAKeyInfo);
// 執行加密
// 參數一:傳入要被加密的資料
// 參數二:如果使用 OAEP 填補 (只適用於執行 Microsoft Windows XP 或更新版本的電腦) 執行直接 System.Security.Cryptography.RSA
// 加密,則為 true,如果使用 PKCS#1 v1.5 填補,則為 false。
encryptedData = RSA.Encrypt(DataToEncrypt, false);
}
// 回傳用 公鑰 加密後的資料
return encryptedData;
}
public byte[] RSADecrypt(byte[] DataToDecrypt, RSAParameters RSAKeyInfo)
{
byte[] decryptedData;
// 建立RSACryptoServiceProvider
using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider())
{
// 傳入私鑰解密
RSA.ImportParameters(RSAKeyInfo);
// 執行解密
// 參數一:傳入要被解密的資料
// 參數二:如果使用 OAEP 填補 (只適用於執行 Microsoft Windows XP 或更新版本的電腦) 執行直接 System.Security.Cryptography.RSA
// 加密,則為 true,如果使用 PKCS#1 v1.5 填補,則為 false。
decryptedData = RSA.Decrypt(DataToDecrypt, false);
}
// 回傳解密後的資料
return decryptedData;
}
}
參考
http://www.codeproject.com/Articles/448719/Cryptography-Asymmetric-Encryption-by-using-Asymme
http://www.codeproject.com/Articles/442523/Cryptography-Symmetric-Encryption-by-Symmetric-A
http://www.codeproject.com/Articles/442522/Cryptography-Symmetric-Encryption-by-Symmetric-Alg
一天一分享,身體好健康。
該追究的不是過去的原因,而是現在的目的。