128ビットのブロック暗号CamelliaをC#で利用します。
(今回はソースコードを含むので、ちょっと長めです)
続きからどうぞ。
Bouncy Castle C#でCamelliaを使用する
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のプロジェクトのディレクトリへコピーして、プロジェクトに含めます。
BouncyCastleで汎用的にブロック暗号を使用するクラス(BCEngine.cs)を作成します。
テストベクトルを出力してみします。
とりあえずわかっているのは、「パディング(BCEngine.SetPaddingメソッド)の指定でくっつく値が変わる」ことです。
以下JavaDocですが、指定できるパディング一覧です。 この「くっつく謎の128bit」についてご存知の方がいらっしゃいましたら教えてください。
参考:
まず、VisualStudioでコンソールアプリケーションでプロジェクト名「BCCamelliaTest」を作成します。.NET Frameworkのバージョンは2.0です。
http://www.bouncycastle.org/csharp/から、「bccrypto-net-1.6.1-bin.zip Compiled assembly only.」をダウンロードします。
展開したdllを、Visual Studioのプロジェクトのディレクトリへコピーして、プロジェクトに含めます。
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」についてご存知の方がいらっしゃいましたら教えてください。
参考:
コメントする