Bouncy Castle C#でCamelliaを使用する

  • 投稿日:
  • by
  • Category:
128ビットのブロック暗号CamelliaをC#で利用します。

(今回はソースコードを含むので、ちょっと長めです)
続きからどうぞ。
BouncyCastleはJavaで広く使われている暗号ライブラリで、C#版のライブラリも提供されています。

まず、VisualStudioでコンソールアプリケーションでプロジェクト名「BCCamelliaTest」を作成します。.NET Frameworkのバージョンは2.0です。

http://www.bouncycastle.org/csharp/から、「bccrypto-net-1.6.1-bin.zip Compiled assembly only.」をダウンロードします。
展開したdllを、Visual Studioのプロジェクトのディレクトリへコピーして、プロジェクトに含めます。
110205_1.png

BouncyCastleで汎用的にブロック暗号を使用するクラス(BCEngine.cs)を作成します。
using System;
using System.Collections.Generic;
using System.Text;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Paddings;
using Org.BouncyCastle.Crypto.Engines;
using Org.BouncyCastle.Crypto.Parameters;
namespace BCCamelliaTest
{
    class BCEngine
    {
        private readonly IBlockCipher _blockCipher;
        private PaddedBufferedBlockCipher _cipher;
        private IBlockCipherPadding _padding;
        public BCEngine(IBlockCipher blockCipher)
        {
            _blockCipher = blockCipher;
        }
        public void SetPadding(IBlockCipherPadding padding)
        {
            if (padding != null)
            {
                _padding = padding;
            }
        }
        public byte[] Encrypt(byte[] plain, byte[] key)
        {
            return BouncyCastleCrypto(true, plain, key);
        }
        public byte[] Decrypt(byte[] cipher, byte[] key)
        {
            return BouncyCastleCrypto(false, cipher, key);
        }
        private byte[] BouncyCastleCrypto(bool forEncrypt, byte[] input, byte[] key)
        {
            try
            {
                if (_padding == null)
                {
                    _cipher = new PaddedBufferedBlockCipher(_blockCipher);
                }
                else
                {
                    _cipher = new PaddedBufferedBlockCipher(_blockCipher, _padding);
                }
                _cipher.Init(forEncrypt, new KeyParameter(key));
                return _cipher.DoFinal(input);
            }
            catch (CryptoException ex)
            {
                throw new CryptoException(ex.ToString());
            }
        }
    }
}
BCEngine クラスを使用するメインのクラス(Program.cs)に、Camellia暗号化と復号のメソッドを追加します。
using System;
using System.Collections.Generic;
using System.Text;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Paddings;
using Org.BouncyCastle.Crypto.Engines;
using Org.BouncyCastle.Crypto.Parameters;
namespace BCCamelliaTest
{
    class Program
    {
        public static void Main(string[] args)
        {
(省略)
        }
        private static byte[] CamelliaEncryption(byte[] plain, byte[] key)
        {
            BCEngine bcEngine = new BCEngine(new CamelliaEngine());
            bcEngine.SetPadding(new ISO10126d2Padding());
            return bcEngine.Encrypt(plain, key);
        }
        private static byte[] CamelliaDecryption(byte[] cipher, byte[] key)
        {
            BCEngine bcEngine = new BCEngine(new CamelliaEngine());
            bcEngine.SetPadding(new ISO10126d2Padding());
            return bcEngine.Decrypt(cipher, key);
        }
    }
}
BouncyCastleのDLLを除くVisualStudioのソリューションはこちらから:BCCamelliaTest.zip

テストベクトルを出力してみします。
Camellia with 128-bit key
K No.001 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
P No.001 : 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
C No.001 : 07 92 3A 39 EB 0A 81 7D 1C 4D 87 BD B8 2D 1F 1C 87 B9 17 F1 93 8B 23 CB DF A0 42 F3 25 0C 2F 55
(略)
先頭128bitはテストベクトルとあっていますが、何やら後ろに128bitの値がくっついています。なんだろう?よくわかりません。
とりあえずわかっているのは、「パディング(BCEngine.SetPaddingメソッド)の指定でくっつく値が変わる」ことです。
以下JavaDocですが、指定できるパディング一覧です。 この「くっつく謎の128bit」についてご存知の方がいらっしゃいましたら教えてください。

参考:
このエントリーをはてなブックマークに追加

コメントする