【C#】共有キー暗号方式 ~暗号化編~

共有キー暗号方式による暗号化

特徴

 * 単一の共有キーを使用してデータの暗号化と複合化を行う
 * 公開キー暗号方式と比較して高速
  ⇒ 大量のデータストリームに対して暗号変換を実行する場合に適している

暗号化アルゴリズム

 * 以下の関連記事を参照のこと。
http://blogs.yahoo.co.jp/dk521123/36417953.html

暗号化の手順

(1) CryptoServiceProvider のインスタンスを生成
(2) (1)で生成したインスタンスのプロパティ Key, IV の設定
(3) (1)で生成したインスタンスの CreateEncryptorメソッドで、ICryptoTransformインスタンスを得る。
(4) ICryptoTransformのTransformFinalBlockで暗号化する

サンプル

Form1.cs

private void button1_Click(object sender, EventArgs e)
{
    this.label1.Text = Encryption.EncryptText(
        Encryption.EncryptAlgorithm.Des,
        this.textBox1.Text,
        new byte[] { 0, 1, 2, 3, 5, 8, 2, 2 },
        new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 });
}

Encryption.cs

public class Encryption
{
    public enum EncryptAlgorithm
    {
        // Advanced Encryption Standard
        Aes,
        // Data Encryption Standard
        Des,
        // Triple DES
        TripleDes,
        // RC2
        RcTwo,
    }

    // encryptionKey 暗号化するためのキー
    // encryptionIv入力ストリームを複数のブロックに分けて暗号化をする
    public static string EncryptText(
        EncryptAlgorithm algorithm,
        string target, byte[] encryptionKeys, byte[] encryptionIvs)
    {        
        switch (algorithm)
        {
            case EncryptAlgorithm.Des:
                using (SymmetricAlgorithm cryptographicServiceProvider
                    = new DESCryptoServiceProvider())
                {
                    return Encryption.EncryptText(
                        cryptographicServiceProvider,
                        target,
                        encryptionKeys,
                        encryptionIvs);
                }
            case EncryptAlgorithm.TripleDes:
                using (SymmetricAlgorithm cryptographicServiceProvider
                    = new TripleDESCryptoServiceProvider())
                {
                    return Encryption.EncryptText(
                        cryptographicServiceProvider,
                        target,
                        encryptionKeys,
                        encryptionIvs);
                }
            case EncryptAlgorithm.RcTwo:
                using (SymmetricAlgorithm cryptographicServiceProvider
                    = new RC2CryptoServiceProvider())
                {
                    return Encryption.EncryptText(
                        cryptographicServiceProvider,
                        target,
                        encryptionKeys,
                        encryptionIvs);
                }
            case EncryptAlgorithm.Aes:
            default:
                using (SymmetricAlgorithm cryptographicServiceProvider
                    = new AesManaged())
                {
                    return Encryption.EncryptText(
                        cryptographicServiceProvider,
                        target,
                        encryptionKeys,
                        encryptionIvs);
                }
        }
    }

    public static string EncryptText(
        SymmetricAlgorithm cryptographicServiceProvider,
        string target, byte[] encryptionKeys, byte[] encryptionIvs)
    {
        cryptographicServiceProvider.Key = encryptionKeys;
        cryptographicServiceProvider.IV = encryptionIvs;
        
        using (ICryptoTransform transform = 
            cryptographicServiceProvider.CreateEncryptor())
        {
            byte[] source = Encoding.UTF8.GetBytes(target);
            byte[] encryptedText =
                transform.TransformFinalBlock(source, 0, source.Length);
            return Convert.ToBase64String(encryptedText);
        }
    }
}


関連記事

Java

暗号化/複合化する ~Apache Commonsを使用した場合~

http://blogs.yahoo.co.jp/dk521123/32780473.html

BouncyCastleライブラリ ~Java暗号ライブラリ~

http://blogs.yahoo.co.jp/dk521123/33256866.html
C#

共有キー暗号方式 ~暗号化編~

http://blogs.yahoo.co.jp/dk521123/30818470.html