Development 更新

Blazor wasm で System.Security.Cryptography API の代わりに使えそうな暗号ライブラリ

.NET 5 から Blazor WebAssembly では System.Security.Cryptography API がサポートされません。代わりに使えそうな暗号ライブラリを試してみました。

Bouncy Castle

Bouncy Castle は、Java と C# で提供されている暗号ライブラリ。GitHub リポジトリ bcgit/bc-csharp を fork して、個人が NuGet BouncyCastle.NetCore を公開されています。

※ Blazor で下記の AES・HMAC のコードを動作確認済み

CryptographyHelpers (CryptHash.NET)

CryptHash.NET は、Windows/Linux/Mac で動作するよう設計された .NET Standard 2.0/2.1 の暗号ライブラリ。現在、.NET 5 ライブラリ CryptographyHelpers として移行しています。NuGet でも公開されています。

※ Blazor で動作未確認です

比較: AES

必要だったのが AES と HMAC-SHA 関連のみだったので、それ以外は調べていません。

System.Security.Cryptography

まずは、Blazor WebAssembly で使うには、移行が必要なコードサンプル。Aes コンストラクター (System.Security.Cryptography) | Microsoft Docs のサンプルコードを元にしたコード。

Aes.cs
<span class=pl-c>// Encrypt</span>
<span class=pl-k><span class=pl-k>static</span></span> <span class=pl-smi>byte</span><span class=pl-kos>[</span><span class=pl-kos>]</span> <span class=pl-en>EncryptStringToBytes_Aes</span><span class=pl-kos>(</span><span class=pl-smi>string</span> <span class=pl-s1>plainText</span><span class=pl-kos>,</span> <span class=pl-smi>byte</span><span class=pl-kos>[</span><span class=pl-kos>]</span> <span class=pl-s1>key</span><span class=pl-kos>,</span> <span class=pl-smi>byte</span><span class=pl-kos>[</span><span class=pl-kos>]</span> <span class=pl-s1>iv</span><span class=pl-kos>)</span>
<span class=pl-kos>{</span>
    <span class=pl-c>// Create an Aes object</span>
    <span class=pl-c>// with the specified key and IV.</span>
    <span class=pl-k>using</span> <span class=pl-k>var</span> <span class=pl-s1>aesAlg</span> <span class=pl-c1>=</span> <span class=pl-s1>Aes</span><span class=pl-kos>.</span><span class=pl-en>Create</span><span class=pl-kos>(</span><span class=pl-kos>)</span><span class=pl-kos>;</span>
    <span class=pl-s1>aesAlg</span><span class=pl-kos>.</span><span class=pl-s1>Key</span> <span class=pl-c1>=</span> <span class=pl-s1>key</span><span class=pl-kos>;</span>
    <span class=pl-s1>aesAlg</span><span class=pl-kos>.</span><span class=pl-s1>IV</span> <span class=pl-c1>=</span> <span class=pl-s1>iv</span><span class=pl-kos>;</span>

    <span class=pl-c>// Create an encryptor to perform the stream transform.</span>
    <span class=pl-k>var</span> <span class=pl-s1>encryptor</span> <span class=pl-c1>=</span> <span class=pl-s1>aesAlg</span><span class=pl-kos>.</span><span class=pl-en>CreateEncryptor</span><span class=pl-kos>(</span><span class=pl-s1>aesAlg</span><span class=pl-kos>.</span><span class=pl-s1>Key</span><span class=pl-kos>,</span> <span class=pl-s1>aesAlg</span><span class=pl-kos>.</span><span class=pl-s1>IV</span><span class=pl-kos>)</span><span class=pl-kos>;</span>

    <span class=pl-c>// Create the streams used for encryption.</span>
    <span class=pl-k>using</span> <span class=pl-k>var</span> <span class=pl-s1>msEncrypt</span> <span class=pl-c1>=</span> <span class=pl-k>new</span> <span class=pl-smi>MemoryStream</span><span class=pl-kos>(</span><span class=pl-kos>)</span><span class=pl-kos>;</span>
    <span class=pl-k>using</span> <span class=pl-k>var</span> <span class=pl-s1>csEncrypt</span> <span class=pl-c1>=</span> <span class=pl-k>new</span> <span class=pl-smi>CryptoStream</span><span class=pl-kos>(</span><span class=pl-s1>msEncrypt</span><span class=pl-kos>,</span> <span class=pl-s1>encryptor</span><span class=pl-kos>,</span> <span class=pl-s1>CryptoStreamMode</span><span class=pl-kos>.</span><span class=pl-s1>Write</span><span class=pl-kos>)</span><span class=pl-kos>;</span>
    <span class=pl-k>using</span> <span class=pl-kos>(</span><span class=pl-k>var</span> <span class=pl-s1>swEncrypt</span> <span class=pl-c1>=</span> <span class=pl-k>new</span> <span class=pl-smi>StreamWriter</span><span class=pl-kos>(</span><span class=pl-s1>csEncrypt</span><span class=pl-kos>)</span><span class=pl-kos>)</span>
    <span class=pl-kos>{</span>
        <span class=pl-c>//Write all data to the stream.</span>
        <span class=pl-s1>swEncrypt</span><span class=pl-kos>.</span><span class=pl-en>Write</span><span class=pl-kos>(</span><span class=pl-s1>plainText</span><span class=pl-kos>)</span><span class=pl-kos>;</span>
    <span class=pl-kos>}</span>
    <span class=pl-k>var</span> <span class=pl-s1>encrypted</span> <span class=pl-c1>=</span> <span class=pl-s1>msEncrypt</span><span class=pl-kos>.</span><span class=pl-en>ToArray</span><span class=pl-kos>(</span><span class=pl-kos>)</span><span class=pl-kos>;</span>

    <span class=pl-c>// Return the encrypted bytes from the memory stream.</span>
    <span class=pl-k>return</span> <span class=pl-s1>encrypted</span><span class=pl-kos>;</span>
<span class=pl-kos>}</span>

<span class=pl-c>// Decrypt</span>
<span class=pl-k><span class=pl-k>static</span></span> <span class=pl-smi>string</span> <span class=pl-en>DecryptStringFromBytes_Aes</span><span class=pl-kos>(</span><span class=pl-smi>byte</span><span class=pl-kos>[</span><span class=pl-kos>]</span> <span class=pl-s1>cipherText</span><span class=pl-kos>,</span> <span class=pl-smi>byte</span><span class=pl-kos>[</span><span class=pl-kos>]</span> <span class=pl-s1>key</span><span class=pl-kos>,</span> <span class=pl-smi>byte</span><span class=pl-kos>[</span><span class=pl-kos>]</span> <span class=pl-s1>iv</span><span class=pl-kos>)</span>
<span class=pl-kos>{</span>
    <span class=pl-c>// Declare the string used to hold</span>
    <span class=pl-c>// the decrypted text.</span>
    <span class=pl-smi>string</span> <span class=pl-s1>plaintext</span> <span class=pl-c1>=</span> <span class=pl-c1>null</span><span class=pl-kos>;</span>

    <span class=pl-c>// Create an Aes object</span>
    <span class=pl-c>// with the specified key and IV.</span>
    <span class=pl-k>using</span> <span class=pl-k>var</span> <span class=pl-s1>aesAlg</span> <span class=pl-c1>=</span> <span class=pl-s1>Aes</span><span class=pl-kos>.</span><span class=pl-en>Create</span><span class=pl-kos>(</span><span class=pl-kos>)</span><span class=pl-kos>;</span>
    <span class=pl-s1>aesAlg</span><span class=pl-kos>.</span><span class=pl-s1>Key</span> <span class=pl-c1>=</span> <span class=pl-s1>key</span><span class=pl-kos>;</span>
    <span class=pl-s1>aesAlg</span><span class=pl-kos>.</span><span class=pl-s1>IV</span> <span class=pl-c1>=</span> <span class=pl-s1>iv</span><span class=pl-kos>;</span>

    <span class=pl-c>// Create a decryptor to perform the stream transform.</span>
    <span class=pl-k>var</span> <span class=pl-s1>decryptor</span> <span class=pl-c1>=</span> <span class=pl-s1>aesAlg</span><span class=pl-kos>.</span><span class=pl-en>CreateDecryptor</span><span class=pl-kos>(</span><span class=pl-s1>aesAlg</span><span class=pl-kos>.</span><span class=pl-s1>Key</span><span class=pl-kos>,</span> <span class=pl-s1>aesAlg</span><span class=pl-kos>.</span><span class=pl-s1>IV</span><span class=pl-kos>)</span><span class=pl-kos>;</span>

    <span class=pl-c>// Create the streams used for decryption.</span>
    <span class=pl-k>using</span> <span class=pl-k>var</span> <span class=pl-s1>msDecrypt</span> <span class=pl-c1>=</span> <span class=pl-k>new</span> <span class=pl-smi>MemoryStream</span><span class=pl-kos>(</span><span class=pl-s1>cipherText</span><span class=pl-kos>)</span><span class=pl-kos>;</span>
    <span class=pl-k>using</span> <span class=pl-k>var</span> <span class=pl-s1>csDecrypt</span> <span class=pl-c1>=</span> <span class=pl-k>new</span> <span class=pl-smi>CryptoStream</span><span class=pl-kos>(</span><span class=pl-s1>msDecrypt</span><span class=pl-kos>,</span> <span class=pl-s1>decryptor</span><span class=pl-kos>,</span> <span class=pl-s1>CryptoStreamMode</span><span class=pl-kos>.</span><span class=pl-s1>Read</span><span class=pl-kos>)</span><span class=pl-kos>;</span>
    <span class=pl-k>using</span> <span class=pl-k>var</span> <span class=pl-s1>srDecrypt</span> <span class=pl-c1>=</span> <span class=pl-k>new</span> <span class=pl-smi>StreamReader</span><span class=pl-kos>(</span><span class=pl-s1>csDecrypt</span><span class=pl-kos>)</span><span class=pl-kos>;</span>
    <span class=pl-c>// Read the decrypted bytes from the decrypting stream</span>
    <span class=pl-c>// and place them in a string.</span>
    <span class=pl-s1>plaintext</span> <span class=pl-c1>=</span> <span class=pl-s1>srDecrypt</span><span class=pl-kos>.</span><span class=pl-en>ReadToEnd</span><span class=pl-kos>(</span><span class=pl-kos>)</span><span class=pl-kos>;</span>

    <span class=pl-k>return</span> <span class=pl-s1>plaintext</span><span class=pl-kos>;</span>
<span class=pl-kos>}</span>

Bouncy Castle

Bouncy Castle を用いたコード。c# - Encrypt string with Bouncy Castle AES/CBC/PKCS7 - Stack Overflow を参考にしています。

Aes.cs
<span class=pl-c>// Encrypt</span>
<span class=pl-k><span class=pl-k>static</span></span> <span class=pl-smi>byte</span><span class=pl-kos>[</span><span class=pl-kos>]</span> <span class=pl-en>EncryptStringToBytes_Aes_BouncyCastle</span><span class=pl-kos>(</span><span class=pl-smi>string</span> <span class=pl-s1>plainText</span><span class=pl-kos>,</span> <span class=pl-smi>byte</span><span class=pl-kos>[</span><span class=pl-kos>]</span> <span class=pl-s1>key</span><span class=pl-kos>,</span> <span class=pl-smi>byte</span><span class=pl-kos>[</span><span class=pl-kos>]</span> <span class=pl-s1>iv</span><span class=pl-kos>)</span>
<span class=pl-kos>{</span>
    <span class=pl-k>var</span> <span class=pl-s1>input</span> <span class=pl-c1>=</span> <span class=pl-s1>Encoding</span><span class=pl-kos>.</span><span class=pl-s1>UTF8</span><span class=pl-kos>.</span><span class=pl-en>GetBytes</span><span class=pl-kos>(</span><span class=pl-s1>plainText</span><span class=pl-kos>)</span><span class=pl-kos>;</span>

    <span class=pl-k>var</span> <span class=pl-s1>engine</span> <span class=pl-c1>=</span> <span class=pl-k>new</span> <span class=pl-smi>AesEngine</span><span class=pl-kos>(</span><span class=pl-kos>)</span><span class=pl-kos>;</span>
    <span class=pl-k>var</span> <span class=pl-s1>blockCipher</span> <span class=pl-c1>=</span> <span class=pl-k>new</span> <span class=pl-smi>CbcBlockCipher</span><span class=pl-kos>(</span><span class=pl-s1>engine</span><span class=pl-kos>)</span><span class=pl-kos>;</span>
    <span class=pl-k>var</span> <span class=pl-s1>cipher</span> <span class=pl-c1>=</span> <span class=pl-k>new</span> <span class=pl-smi>PaddedBufferedBlockCipher</span><span class=pl-kos>(</span><span class=pl-s1>blockCipher</span><span class=pl-kos>)</span><span class=pl-kos>;</span> <span class=pl-c>// PKCS5/7 padding</span>
    <span class=pl-k>var</span> <span class=pl-s1>keyParam</span> <span class=pl-c1>=</span> <span class=pl-k>new</span> <span class=pl-smi>KeyParameter</span><span class=pl-kos>(</span><span class=pl-s1>key</span><span class=pl-kos>)</span><span class=pl-kos>;</span>
    <span class=pl-k>var</span> <span class=pl-s1>keyParamWithIV</span> <span class=pl-c1>=</span> <span class=pl-k>new</span> <span class=pl-smi>ParametersWithIV</span><span class=pl-kos>(</span><span class=pl-s1>keyParam</span><span class=pl-kos>,</span> <span class=pl-s1>iv</span><span class=pl-kos>)</span><span class=pl-kos>;</span>

    <span class=pl-c>// Encrypt</span>
    <span class=pl-s1>cipher</span><span class=pl-kos>.</span><span class=pl-en>Init</span><span class=pl-kos>(</span><span class=pl-c1>true</span><span class=pl-kos>,</span> <span class=pl-s1>keyParamWithIV</span><span class=pl-kos>)</span><span class=pl-kos>;</span>
    <span class=pl-k>var</span> <span class=pl-s1>encrypted</span> <span class=pl-c1>=</span> <span class=pl-k>new</span> <span class=pl-smi>byte</span><span class=pl-kos>[</span><span class=pl-s1>cipher</span><span class=pl-kos>.</span><span class=pl-en>GetOutputSize</span><span class=pl-kos>(</span><span class=pl-s1>input</span><span class=pl-kos>.</span><span class=pl-s1>Length</span><span class=pl-kos>)</span><span class=pl-kos>]</span><span class=pl-kos>;</span>
    <span class=pl-k>var</span> <span class=pl-s1>length</span> <span class=pl-c1>=</span> <span class=pl-s1>cipher</span><span class=pl-kos>.</span><span class=pl-en>ProcessBytes</span><span class=pl-kos>(</span><span class=pl-s1>input</span><span class=pl-kos>,</span> <span class=pl-s1>encrypted</span><span class=pl-kos>,</span> <span class=pl-c1>0</span><span class=pl-kos>)</span><span class=pl-kos>;</span>
    <span class=pl-s1>cipher</span><span class=pl-kos>.</span><span class=pl-en>DoFinal</span><span class=pl-kos>(</span><span class=pl-s1>encrypted</span><span class=pl-kos>,</span> <span class=pl-s1>length</span><span class=pl-kos>)</span><span class=pl-kos>;</span>

    <span class=pl-k>return</span> <span class=pl-s1>encrypted</span><span class=pl-kos>;</span>
<span class=pl-kos>}</span>

<span class=pl-c>// Decrypt</span>
<span class=pl-k><span class=pl-k>static</span></span> <span class=pl-smi>string</span> <span class=pl-en>DecryptStringFromBytes_Aes_BouncyCastle</span><span class=pl-kos>(</span><span class=pl-smi>byte</span><span class=pl-kos>[</span><span class=pl-kos>]</span> <span class=pl-s1>cipherText</span><span class=pl-kos>,</span> <span class=pl-smi>byte</span><span class=pl-kos>[</span><span class=pl-kos>]</span> <span class=pl-s1>key</span><span class=pl-kos>,</span> <span class=pl-smi>byte</span><span class=pl-kos>[</span><span class=pl-kos>]</span> <span class=pl-s1>iv</span><span class=pl-kos>)</span>
<span class=pl-kos>{</span>
    <span class=pl-k>var</span> <span class=pl-s1>engine</span> <span class=pl-c1>=</span> <span class=pl-k>new</span> <span class=pl-smi>AesEngine</span><span class=pl-kos>(</span><span class=pl-kos>)</span><span class=pl-kos>;</span>
    <span class=pl-k>var</span> <span class=pl-s1>blockCipher</span> <span class=pl-c1>=</span> <span class=pl-k>new</span> <span class=pl-smi>CbcBlockCipher</span><span class=pl-kos>(</span><span class=pl-s1>engine</span><span class=pl-kos>)</span><span class=pl-kos>;</span>
    <span class=pl-k>var</span> <span class=pl-s1>cipher</span> <span class=pl-c1>=</span> <span class=pl-k>new</span> <span class=pl-smi>PaddedBufferedBlockCipher</span><span class=pl-kos>(</span><span class=pl-s1>blockCipher</span><span class=pl-kos>)</span><span class=pl-kos>;</span> <span class=pl-c>// PKCS5/7 padding</span>
    <span class=pl-k>var</span> <span class=pl-s1>keyParam</span> <span class=pl-c1>=</span> <span class=pl-k>new</span> <span class=pl-smi>KeyParameter</span><span class=pl-kos>(</span><span class=pl-s1>key</span><span class=pl-kos>)</span><span class=pl-kos>;</span>
    <span class=pl-k>var</span> <span class=pl-s1>keyParamWithIV</span> <span class=pl-c1>=</span> <span class=pl-k>new</span> <span class=pl-smi>ParametersWithIV</span><span class=pl-kos>(</span><span class=pl-s1>keyParam</span><span class=pl-kos>,</span> <span class=pl-s1>iv</span><span class=pl-kos>)</span><span class=pl-kos>;</span>

    <span class=pl-c>// Decrypt</span>
    <span class=pl-s1>cipher</span><span class=pl-kos>.</span><span class=pl-en>Init</span><span class=pl-kos>(</span><span class=pl-c1>false</span><span class=pl-kos>,</span> <span class=pl-s1>keyParamWithIV</span><span class=pl-kos>)</span><span class=pl-kos>;</span>
    <span class=pl-k>var</span> <span class=pl-s1>decrypted</span> <span class=pl-c1>=</span> <span class=pl-k>new</span> <span class=pl-smi>byte</span><span class=pl-kos>[</span><span class=pl-s1>cipher</span><span class=pl-kos>.</span><span class=pl-en>GetOutputSize</span><span class=pl-kos>(</span><span class=pl-s1>cipherText</span><span class=pl-kos>.</span><span class=pl-s1>Length</span><span class=pl-kos>)</span><span class=pl-kos>]</span><span class=pl-kos>;</span>
    <span class=pl-k>var</span> <span class=pl-s1>length</span> <span class=pl-c1>=</span> <span class=pl-s1>cipher</span><span class=pl-kos>.</span><span class=pl-en>ProcessBytes</span><span class=pl-kos>(</span><span class=pl-s1>cipherText</span><span class=pl-kos>,</span> <span class=pl-s1>decrypted</span><span class=pl-kos>,</span> <span class=pl-c1>0</span><span class=pl-kos>)</span><span class=pl-kos>;</span>
    <span class=pl-s1>cipher</span><span class=pl-kos>.</span><span class=pl-en>DoFinal</span><span class=pl-kos>(</span><span class=pl-s1>decrypted</span><span class=pl-kos>,</span> <span class=pl-s1>length</span><span class=pl-kos>)</span><span class=pl-kos>;</span>

    <span class=pl-k>return</span> <span class=pl-s1>Encoding</span><span class=pl-kos>.</span><span class=pl-s1>UTF8</span><span class=pl-kos>.</span><span class=pl-en>GetString</span><span class=pl-kos>(</span><span class=pl-s1>decrypted</span><span class=pl-kos>)</span><span class=pl-kos>.</span><span class=pl-en>TrimEnd</span><span class=pl-kos>(</span><span class=pl-s>'<span class=pl-cce>\0</span>'</span><span class=pl-kos>)</span><span class=pl-kos>;</span>
<span class=pl-kos>}</span>

CryptHash.NET

CryptHash.NET は、AES の基本の暗号化・複合処理は、抽象クラスの internal メソッドのため全く同じことはできません。パスワードの暗号化や簡潔に書ける便利そうなオーバーロードが、いろいろあるのでオリジナルのコードを読んでみてください。

Aes.cs
<span class=pl-k><span class=pl-k>static</span></span> <span class=pl-smi>byte</span><span class=pl-kos>[</span><span class=pl-kos>]</span> <span class=pl-en>EncryptStringToBytes_Aes_CryptHashNet</span><span class=pl-kos>(</span><span class=pl-smi>string</span> <span class=pl-s1>plainText</span><span class=pl-kos>,</span> <span class=pl-smi>byte</span><span class=pl-kos>[</span><span class=pl-kos>]</span> <span class=pl-s1>key</span><span class=pl-kos>,</span> <span class=pl-smi>byte</span><span class=pl-kos>[</span><span class=pl-kos>]</span> <span class=pl-s1>iv</span><span class=pl-kos>,</span> <span class=pl-k>out</span> <span class=pl-smi>byte</span><span class=pl-kos>[</span><span class=pl-kos>]</span> <span class=pl-s1>authenticationKey</span><span class=pl-kos>,</span> <span class=pl-k>out</span> <span class=pl-smi>byte</span><span class=pl-kos>[</span><span class=pl-kos>]</span> <span class=pl-s1>tag</span><span class=pl-kos>)</span>
<span class=pl-kos>{</span>
    <span class=pl-k>var</span> <span class=pl-s1>aes</span> <span class=pl-c1>=</span> <span class=pl-k>new</span> <span class=pl-smi>AE_AES_128_CBC_HMAC_SHA_256</span><span class=pl-kos>(</span><span class=pl-kos>)</span><span class=pl-kos>;</span>
    <span class=pl-k>var</span> <span class=pl-s1>result</span> <span class=pl-c1>=</span> <span class=pl-s1>aes</span><span class=pl-kos>.</span><span class=pl-en>EncryptString</span><span class=pl-kos>(</span><span class=pl-s1>Encoding</span><span class=pl-kos>.</span><span class=pl-s1>UTF8</span><span class=pl-kos>.</span><span class=pl-en>GetBytes</span><span class=pl-kos>(</span><span class=pl-s1>plainText</span><span class=pl-kos>)</span><span class=pl-kos>,</span> <span class=pl-s1>key</span><span class=pl-kos>,</span> <span class=pl-s1>iv</span><span class=pl-kos>)</span><span class=pl-kos>;</span>

    <span class=pl-s1>authenticationKey</span> <span class=pl-c1>=</span> <span class=pl-s1>result</span><span class=pl-kos>.</span><span class=pl-s1>AuthenticationKey</span><span class=pl-kos>;</span>
    <span class=pl-s1>tag</span> <span class=pl-c1>=</span> <span class=pl-s1>result</span><span class=pl-kos>.</span><span class=pl-s1>Tag</span><span class=pl-kos>;</span>

    <span class=pl-k>return</span> <span class=pl-s1>result</span><span class=pl-kos>.</span><span class=pl-s1>EncryptedDataBytes</span><span class=pl-kos>;</span>
<span class=pl-kos>}</span>

<span class=pl-k><span class=pl-k>static</span></span> <span class=pl-smi>string</span> <span class=pl-en>DecryptStringFromBytes_Aes_CryptHashNet</span><span class=pl-kos>(</span><span class=pl-smi>byte</span><span class=pl-kos>[</span><span class=pl-kos>]</span> <span class=pl-s1>cipherText</span><span class=pl-kos>,</span> <span class=pl-smi>byte</span><span class=pl-kos>[</span><span class=pl-kos>]</span> <span class=pl-s1>key</span><span class=pl-kos>,</span> <span class=pl-smi>byte</span><span class=pl-kos>[</span><span class=pl-kos>]</span> <span class=pl-s1>iv</span><span class=pl-kos>,</span> <span class=pl-smi>byte</span><span class=pl-kos>[</span><span class=pl-kos>]</span> <span class=pl-s1>authenticationKey</span><span class=pl-kos>,</span> <span class=pl-smi>byte</span><span class=pl-kos>[</span><span class=pl-kos>]</span> <span class=pl-s1>sentTag</span><span class=pl-kos>)</span>
<span class=pl-kos>{</span>
    <span class=pl-k>var</span> <span class=pl-s1>aes</span> <span class=pl-c1>=</span> <span class=pl-k>new</span> <span class=pl-smi>AE_AES_128_CBC_HMAC_SHA_256</span><span class=pl-kos>(</span><span class=pl-kos>)</span><span class=pl-kos>;</span>
    <span class=pl-k>var</span> <span class=pl-s1>result</span> <span class=pl-c1>=</span> <span class=pl-s1>aes</span><span class=pl-kos>.</span><span class=pl-en>DecryptString</span><span class=pl-kos>(</span><span class=pl-s1>cipherText</span><span class=pl-kos>,</span> <span class=pl-s1>key</span><span class=pl-kos>,</span> <span class=pl-s1>iv</span><span class=pl-kos>,</span> <span class=pl-s1>authenticationKey</span><span class=pl-kos>,</span> <span class=pl-s1>sentTag</span><span class=pl-kos>)</span><span class=pl-kos>;</span>
    <span class=pl-k>return</span> <span class=pl-s1>result</span><span class=pl-kos>.</span><span class=pl-s1>DecryptedDataString</span><span class=pl-kos>;</span>
<span class=pl-kos>}</span>

呼び出しサンプル

上記メソッドを呼び出す部分のコードです。

Program.cs
<span class=pl-k><span class=pl-k>static</span></span> <span class=pl-smi>void</span> <span class=pl-en>Main</span><span class=pl-kos>(</span><span class=pl-smi>string</span><span class=pl-kos>[</span><span class=pl-kos>]</span> <span class=pl-s1>args</span><span class=pl-kos>)</span>
<span class=pl-kos>{</span>
    <span class=pl-k>var</span> <span class=pl-s1>text</span> <span class=pl-c1>=</span> <span class=pl-s>"山路を登りながら、こう考えた。"</span><span class=pl-kos>;</span>
    <span class=pl-k>var</span> <span class=pl-s1>key</span> <span class=pl-c1>=</span> <span class=pl-s1>Encoding</span><span class=pl-kos>.</span><span class=pl-s1>UTF8</span><span class=pl-kos>.</span><span class=pl-en>GetBytes</span><span class=pl-kos>(</span><span class=pl-s>"xxxxxxxxxxxxxxxx"</span><span class=pl-kos>)</span><span class=pl-kos>;</span>
    <span class=pl-k>var</span> <span class=pl-s1>iv</span> <span class=pl-c1>=</span> <span class=pl-s1>Encoding</span><span class=pl-kos>.</span><span class=pl-s1>UTF8</span><span class=pl-kos>.</span><span class=pl-en>GetBytes</span><span class=pl-kos>(</span><span class=pl-s>"0123456789abcdef"</span><span class=pl-kos>)</span><span class=pl-kos>;</span>

    <span class=pl-c>// System.Security.Cryptography</span>
    <span class=pl-kos>{</span>
        <span class=pl-k>var</span> <span class=pl-s1>cipherText</span> <span class=pl-c1>=</span> <span class=pl-s1>EncryptStringToBytes_Aes</span><span class=pl-kos>(</span><span class=pl-s1>text</span><span class=pl-kos>,</span> <span class=pl-s1>key</span><span class=pl-kos>,</span> <span class=pl-s1>iv</span><span class=pl-kos>)</span><span class=pl-kos>;</span>
        <span class=pl-s1>Console</span><span class=pl-kos>.</span><span class=pl-en>WriteLine</span><span class=pl-kos>(</span><span class=pl-s><span class=pl-s>\$</span>"cipherText: <span class=pl-kos>{</span><span class=pl-s1>Convert</span><span class=pl-kos>.</span><span class=pl-en>ToBase64String</span><span class=pl-kos>(</span><span class=pl-s1>cipherText</span><span class=pl-kos>)</span><span class=pl-kos>}</span>"</span><span class=pl-kos>)</span><span class=pl-kos>;</span>

        <span class=pl-k>var</span> <span class=pl-s1>plainText</span> <span class=pl-c1>=</span> <span class=pl-s1>DecryptStringFromBytes_Aes</span><span class=pl-kos>(</span><span class=pl-s1>cipherText</span><span class=pl-kos>,</span> <span class=pl-s1>key</span><span class=pl-kos>,</span> <span class=pl-s1>iv</span><span class=pl-kos>)</span><span class=pl-kos>;</span>
        <span class=pl-s1>Console</span><span class=pl-kos>.</span><span class=pl-en>WriteLine</span><span class=pl-kos>(</span><span class=pl-s><span class=pl-s>\$</span>"plainText: <span class=pl-kos>{</span><span class=pl-s1>plainText</span><span class=pl-kos>}</span>"</span><span class=pl-kos>)</span><span class=pl-kos>;</span>
    <span class=pl-kos>}</span>

    <span class=pl-c>// Bouncy Castle</span>
    <span class=pl-kos>{</span>
        <span class=pl-k>var</span> <span class=pl-s1>cipherText</span> <span class=pl-c1>=</span> <span class=pl-s1>EncryptStringToBytes_Aes_BouncyCastle</span><span class=pl-kos>(</span><span class=pl-s1>text</span><span class=pl-kos>,</span> <span class=pl-s1>key</span><span class=pl-kos>,</span> <span class=pl-s1>iv</span><span class=pl-kos>)</span><span class=pl-kos>;</span>
        <span class=pl-s1>Console</span><span class=pl-kos>.</span><span class=pl-en>WriteLine</span><span class=pl-kos>(</span><span class=pl-s><span class=pl-s>\$</span>"cipherText: <span class=pl-kos>{</span><span class=pl-s1>Convert</span><span class=pl-kos>.</span><span class=pl-en>ToBase64String</span><span class=pl-kos>(</span><span class=pl-s1>cipherText</span><span class=pl-kos>)</span><span class=pl-kos>}</span>"</span><span class=pl-kos>)</span><span class=pl-kos>;</span>

        <span class=pl-k>var</span> <span class=pl-s1>plainText</span> <span class=pl-c1>=</span> <span class=pl-s1>DecryptStringFromBytes_Aes_BouncyCastle</span><span class=pl-kos>(</span><span class=pl-s1>cipherText</span><span class=pl-kos>,</span> <span class=pl-s1>key</span><span class=pl-kos>,</span> <span class=pl-s1>iv</span><span class=pl-kos>)</span><span class=pl-kos>;</span>
        <span class=pl-s1>Console</span><span class=pl-kos>.</span><span class=pl-en>WriteLine</span><span class=pl-kos>(</span><span class=pl-s><span class=pl-s>\$</span>"plainText: <span class=pl-kos>{</span><span class=pl-s1>plainText</span><span class=pl-kos>}</span>"</span><span class=pl-kos>)</span><span class=pl-kos>;</span>
    <span class=pl-kos>}</span>

    <span class=pl-c>// CryptHash.Net</span>
    <span class=pl-kos>{</span>
        <span class=pl-k>var</span> <span class=pl-s1>cipherText</span> <span class=pl-c1>=</span> <span class=pl-s1>EncryptStringToBytes_Aes_CryptHashNet</span><span class=pl-kos>(</span><span class=pl-s1>text</span><span class=pl-kos>,</span> <span class=pl-s1>key</span><span class=pl-kos>,</span> <span class=pl-s1>iv</span><span class=pl-kos>,</span> <span class=pl-k>out</span> <span class=pl-k>var</span> <span class=pl-s1>authenticationKey</span><span class=pl-kos>,</span> <span class=pl-k>out</span> <span class=pl-k>var</span> <span class=pl-s1>tag</span><span class=pl-kos>)</span><span class=pl-kos>;</span>
        <span class=pl-s1>Console</span><span class=pl-kos>.</span><span class=pl-en>WriteLine</span><span class=pl-kos>(</span><span class=pl-s><span class=pl-s>\$</span>"cipherText: <span class=pl-kos>{</span><span class=pl-s1>Convert</span><span class=pl-kos>.</span><span class=pl-en>ToBase64String</span><span class=pl-kos>(</span><span class=pl-s1>cipherText</span><span class=pl-kos>)</span><span class=pl-kos>}</span>"</span><span class=pl-kos>)</span><span class=pl-kos>;</span>

        <span class=pl-k>var</span> <span class=pl-s1>plainText</span> <span class=pl-c1>=</span> <span class=pl-s1>DecryptStringFromBytes_Aes_CryptHashNet</span><span class=pl-kos>(</span><span class=pl-s1>cipherText</span><span class=pl-kos>,</span> <span class=pl-s1>key</span><span class=pl-kos>,</span> <span class=pl-s1>iv</span><span class=pl-kos>,</span> <span class=pl-s1>authenticationKey</span><span class=pl-kos>,</span> <span class=pl-s1>tag</span><span class=pl-kos>)</span><span class=pl-kos>;</span>
        <span class=pl-s1>Console</span><span class=pl-kos>.</span><span class=pl-en>WriteLine</span><span class=pl-kos>(</span><span class=pl-s><span class=pl-s>\$</span>"plainText: <span class=pl-kos>{</span><span class=pl-s1>plainText</span><span class=pl-kos>}</span>"</span><span class=pl-kos>)</span><span class=pl-kos>;</span>
    <span class=pl-kos>}</span>
<span class=pl-kos>}</span>

比較: HMAC

HMAC-SHA-1 の処理比較です。

Hmac.cs
<span class=pl-k><span class=pl-k>static</span></span> <span class=pl-smi>void</span> <span class=pl-en>Main</span><span class=pl-kos>(</span><span class=pl-smi>string</span><span class=pl-kos>[</span><span class=pl-kos>]</span> <span class=pl-s1>args</span><span class=pl-kos>)</span>
<span class=pl-kos>{</span>
    <span class=pl-k>var</span> <span class=pl-s1>text</span> <span class=pl-c1>=</span> <span class=pl-s>"山路を登りながら、こう考えた。"</span><span class=pl-kos>;</span>
    <span class=pl-k>var</span> <span class=pl-s1>key</span> <span class=pl-c1>=</span> <span class=pl-s1>Encoding</span><span class=pl-kos>.</span><span class=pl-s1>UTF8</span><span class=pl-kos>.</span><span class=pl-en>GetBytes</span><span class=pl-kos>(</span><span class=pl-s>"xxxxxxxxxxxxxxxx"</span><span class=pl-kos>)</span><span class=pl-kos>;</span>

    <span class=pl-kos>{</span>
        <span class=pl-k>var</span> <span class=pl-s1>hash</span> <span class=pl-c1>=</span> <span class=pl-s1>HmacSha1</span><span class=pl-kos>(</span><span class=pl-s1>key</span><span class=pl-kos>,</span> <span class=pl-s1>Encoding</span><span class=pl-kos>.</span><span class=pl-s1>UTF8</span><span class=pl-kos>.</span><span class=pl-en>GetBytes</span><span class=pl-kos>(</span><span class=pl-s1>text</span><span class=pl-kos>)</span><span class=pl-kos>)</span><span class=pl-kos>;</span>
        <span class=pl-s1>Console</span><span class=pl-kos>.</span><span class=pl-en>WriteLine</span><span class=pl-kos>(</span><span class=pl-s><span class=pl-s>\$</span>"hash: <span class=pl-kos>{</span><span class=pl-s1>Convert</span><span class=pl-kos>.</span><span class=pl-en>ToBase64String</span><span class=pl-kos>(</span><span class=pl-s1>hash</span><span class=pl-kos>)</span><span class=pl-kos>}</span>"</span><span class=pl-kos>)</span><span class=pl-kos>;</span>
    <span class=pl-kos>}</span>
    <span class=pl-kos>{</span>
        <span class=pl-k>var</span> <span class=pl-s1>hash</span> <span class=pl-c1>=</span> <span class=pl-s1>HmacSha1_BouncyCastle</span><span class=pl-kos>(</span><span class=pl-s1>key</span><span class=pl-kos>,</span> <span class=pl-s1>Encoding</span><span class=pl-kos>.</span><span class=pl-s1>UTF8</span><span class=pl-kos>.</span><span class=pl-en>GetBytes</span><span class=pl-kos>(</span><span class=pl-s1>text</span><span class=pl-kos>)</span><span class=pl-kos>)</span><span class=pl-kos>;</span>
        <span class=pl-s1>Console</span><span class=pl-kos>.</span><span class=pl-en>WriteLine</span><span class=pl-kos>(</span><span class=pl-s><span class=pl-s>\$</span>"hash(BouncyCastle): <span class=pl-kos>{</span><span class=pl-s1>Convert</span><span class=pl-kos>.</span><span class=pl-en>ToBase64String</span><span class=pl-kos>(</span><span class=pl-s1>hash</span><span class=pl-kos>)</span><span class=pl-kos>}</span>"</span><span class=pl-kos>)</span><span class=pl-kos>;</span>
    <span class=pl-kos>}</span>
    <span class=pl-kos>{</span>
        <span class=pl-k>var</span> <span class=pl-s1>hash</span> <span class=pl-c1>=</span> <span class=pl-s1>HmacSha1_CryptHashNet</span><span class=pl-kos>(</span><span class=pl-s1>key</span><span class=pl-kos>,</span> <span class=pl-s1>Encoding</span><span class=pl-kos>.</span><span class=pl-s1>UTF8</span><span class=pl-kos>.</span><span class=pl-en>GetBytes</span><span class=pl-kos>(</span><span class=pl-s1>text</span><span class=pl-kos>)</span><span class=pl-kos>)</span><span class=pl-kos>;</span>
        <span class=pl-s1>Console</span><span class=pl-kos>.</span><span class=pl-en>WriteLine</span><span class=pl-kos>(</span><span class=pl-s><span class=pl-s>\$</span>"hash(CryptHashNet): <span class=pl-kos>{</span><span class=pl-s1>Convert</span><span class=pl-kos>.</span><span class=pl-en>ToBase64String</span><span class=pl-kos>(</span><span class=pl-s1>hash</span><span class=pl-kos>)</span><span class=pl-kos>}</span>"</span><span class=pl-kos>)</span><span class=pl-kos>;</span>
    <span class=pl-kos>}</span>
<span class=pl-kos>}</span>

<span class=pl-c>// System.Security.Cryptography</span>
<span class=pl-k><span class=pl-k>static</span></span> <span class=pl-smi>byte</span><span class=pl-kos>[</span><span class=pl-kos>]</span> <span class=pl-en>HmacSha1</span><span class=pl-kos>(</span><span class=pl-smi>byte</span><span class=pl-kos>[</span><span class=pl-kos>]</span> <span class=pl-s1>key</span><span class=pl-kos>,</span> <span class=pl-smi>byte</span><span class=pl-kos>[</span><span class=pl-kos>]</span> <span class=pl-s1>message</span><span class=pl-kos>)</span>
<span class=pl-kos>{</span>
    <span class=pl-k>using</span> <span class=pl-k>var</span> <span class=pl-s1>hmac</span> <span class=pl-c1>=</span> <span class=pl-k>new</span> <span class=pl-smi>HMACSHA1</span><span class=pl-kos>(</span><span class=pl-s1>key</span><span class=pl-kos>)</span><span class=pl-kos>;</span>
    <span class=pl-k>return</span> <span class=pl-s1>hmac</span><span class=pl-kos>.</span><span class=pl-en>ComputeHash</span><span class=pl-kos>(</span><span class=pl-s1>message</span><span class=pl-kos>)</span><span class=pl-kos>;</span>
<span class=pl-kos>}</span>

<span class=pl-c>// Bouncy Castle</span>
<span class=pl-k><span class=pl-k>static</span></span> <span class=pl-smi>byte</span><span class=pl-kos>[</span><span class=pl-kos>]</span> <span class=pl-en>HmacSha1_BouncyCastle</span><span class=pl-kos>(</span><span class=pl-smi>byte</span><span class=pl-kos>[</span><span class=pl-kos>]</span> <span class=pl-s1>key</span><span class=pl-kos>,</span> <span class=pl-smi>byte</span><span class=pl-kos>[</span><span class=pl-kos>]</span> <span class=pl-s1>message</span><span class=pl-kos>)</span>
<span class=pl-kos>{</span>
    <span class=pl-k>var</span> <span class=pl-s1>hmac</span> <span class=pl-c1>=</span> <span class=pl-k>new</span> <span class=pl-smi>HMac</span><span class=pl-kos>(</span><span class=pl-k>new</span> <span class=pl-smi>Sha1Digest</span><span class=pl-kos>(</span><span class=pl-kos>)</span><span class=pl-kos>)</span><span class=pl-kos>;</span>
    <span class=pl-k>var</span> <span class=pl-s1>output</span> <span class=pl-c1>=</span> <span class=pl-k>new</span> <span class=pl-smi>byte</span><span class=pl-kos>[</span><span class=pl-s1>hmac</span><span class=pl-kos>.</span><span class=pl-en>GetMacSize</span><span class=pl-kos>(</span><span class=pl-kos>)</span><span class=pl-kos>]</span><span class=pl-kos>;</span>

    <span class=pl-s1>hmac</span><span class=pl-kos>.</span><span class=pl-en>Init</span><span class=pl-kos>(</span><span class=pl-k>new</span> <span class=pl-smi>KeyParameter</span><span class=pl-kos>(</span><span class=pl-s1>key</span><span class=pl-kos>)</span><span class=pl-kos>)</span><span class=pl-kos>;</span>
    <span class=pl-s1>hmac</span><span class=pl-kos>.</span><span class=pl-en>BlockUpdate</span><span class=pl-kos>(</span><span class=pl-s1>message</span><span class=pl-kos>,</span> <span class=pl-c1>0</span><span class=pl-kos>,</span> <span class=pl-s1>message</span><span class=pl-kos>.</span><span class=pl-s1>Length</span><span class=pl-kos>)</span><span class=pl-kos>;</span>
    <span class=pl-s1>hmac</span><span class=pl-kos>.</span><span class=pl-en>DoFinal</span><span class=pl-kos>(</span><span class=pl-s1>output</span><span class=pl-kos>,</span> <span class=pl-c1>0</span><span class=pl-kos>)</span><span class=pl-kos>;</span>
    <span class=pl-k>return</span> <span class=pl-s1>output</span><span class=pl-kos>;</span>
<span class=pl-kos>}</span>

<span class=pl-c>// CryptHash.Net</span>
<span class=pl-k><span class=pl-k>static</span></span> <span class=pl-smi>byte</span><span class=pl-kos>[</span><span class=pl-kos>]</span> <span class=pl-en>HmacSha1_CryptHashNet</span><span class=pl-kos>(</span><span class=pl-smi>byte</span><span class=pl-kos>[</span><span class=pl-kos>]</span> <span class=pl-s1>key</span><span class=pl-kos>,</span> <span class=pl-smi>byte</span><span class=pl-kos>[</span><span class=pl-kos>]</span> <span class=pl-s1>message</span><span class=pl-kos>)</span>
<span class=pl-kos>{</span>
    <span class=pl-k>var</span> <span class=pl-s1>hmac</span> <span class=pl-c1>=</span> <span class=pl-k>new</span> <span class=pl-smi>HMAC_SHA_1</span><span class=pl-kos>(</span><span class=pl-kos>)</span><span class=pl-kos>;</span>
    <span class=pl-k>var</span> <span class=pl-s1>result</span> <span class=pl-c1>=</span> <span class=pl-s1>hmac</span><span class=pl-kos>.</span><span class=pl-en>ComputeHMAC</span><span class=pl-kos>(</span><span class=pl-s1>message</span><span class=pl-kos>,</span> <span class=pl-s1>key</span><span class=pl-kos>)</span><span class=pl-kos>;</span>
    <span class=pl-k>return</span> <span class=pl-s1>result</span><span class=pl-kos>.</span><span class=pl-s1>HashBytes</span><span class=pl-kos>;</span>
<span class=pl-kos>}</span>