Symmetric encryption & Asymmetric encryption

對稱式加密、非對稱式加密

 

加密可保護資料,防止被未授權的人讀到原始資料或者修改其內容。有兩種加密的方式,一個為非對稱式加密、一個為對稱式加密,差別在於對稱式加密使用同一把金鑰加解密,而非對稱式加密使用兩把金鑰加解密。

 

對稱式加密

  • 加解密都用同一把金鑰

  • 比非對稱式加密快

  • 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

 

 

一天一分享,身體好健康。

該追究的不是過去的原因,而是現在的目的。