web-dev-qa-db-ja.com

.Net CoreクラスライブラリでRijndael暗号化を使用する方法は? (.Net Frameworkではありません)

.Net CoreクラスライブラリでRijndael暗号化を使用するにはどうすればよいですか? (.Net Frameworkクラスライブラリではありません)複数の​​プロジェクトで使用する共有.Net Coreライブラリを作成し、プロジェクト全体で同じRijndael暗号化を使用するEncryptメソッドとDecryptメソッドを実装する必要があります。

現在使用しているのは:

  • VS Enterprise 2015
  • c#
  • .Net Coreクラスライブラリ
  • .NETStandard、Version = v1.6リファレンス

RijndaelとAESの実装は.Net Core 1.0リリースから欠落しているように見えます...基本クラスのみが含まれているようです。新しい.Net Core Class Libraryプロジェクトへの参照として追加されたRijndaelまたはAES暗号化の.Net Core実装を取得するにはどうすればよいですか?

.Net Framework 4.5.2で機能するEncryptメソッドは次のとおりです。

public static string Encrypt(string valueToEncrypt, string symmetricKey, string initializationVector)
{
    string returnValue = valueToEncrypt;

    var aes = new System.Security.Cryptography.RijndaelManaged();
    try
    {
        aes.Key = ASCIIEncoding.ASCII.GetBytes(symmetricKey);
        aes.IV = ASCIIEncoding.ASCII.GetBytes(initializationVector);
        aes.Mode = CipherMode.CBC;
        aes.Padding = PaddingMode.ISO10126;

        var desEncrypter = aes.CreateEncryptor();
        var buffer = ASCIIEncoding.ASCII.GetBytes(valueToEncrypt);

        returnValue = Convert.ToBase64String(desEncrypter.TransformFinalBlock(buffer, 0, buffer.Length));
    }
    catch (Exception)
    {
        returnValue = string.Empty;
    }

    return returnValue;
}
14
Ensunder

RijndaelとAESの(.NETでの)違いは、Rijndaelではブロックサイズを変更できるが、AESではできないことです。 RijndaelManagedのデフォルトのブロックサイズはAESブロックサイズ(128ビット/ 16バイト)と同じであるため、実際にはAESを使用しています。

名前で実装タイプをインスタンス化する代わりに、ファクトリー(Aes.Create())を使用します。これは、.NET Coreと.NET Frameworkの両方で機能します。

言及する価値がある他のこと:

  • SymmetricAlgorithmインスタンスはすべてIDisposableです。usingステートメントで使用する必要があります。
  • すべてのICryptoTransformインスタンス(間違った名前のdesEncryptorなど)はIDisposableです。usingステートメントで使用する必要があります。
  • ISO10126パディングは、.NET Core 1.0では使用できません。既存のストリームとの互換性が必要な場合は、パディングを自分で適用してPaddingMode.Noneを指定できます。それ以外の場合、PKCS7はより標準です。
  • AESキーは、ASCII文字列(値のロットは無効))から来るため、あまりランダムではありません。
    • Base64には少なくとも完全な値範囲があります
    • Rfc2898DeriveBytesクラスを介したPBKDF2(パスワードベースのキー派生関数2)により、共有文字列の秘密入力、予測可能なノイズ出力が可能になります。
    • KeyAgreementは一般的に優れていますが、ECDHも従来のDHも.NET Core 1.0では使用できません。
  • 通常、エンクリプターはランダムIVを計算させ(複数の操作に同じオブジェクトを使用する場合はaes.GenerateIV()を呼び出し)、暗号文を提示します。したがって、encryptはキーとプレーンテキストを受け取り、暗号テキストとIVを生成します。復号化は(キー、IV、暗号文)を取り、平文を生成します。
23
bartonjs

単に暗号化/復号化する場合は、asp.netコアには使いやすく、デフォルトで適切に保護される可能性が高い優れたラッパーがあるため、Rijndaelを直接使用しないでください。 DataProtectionとして知られています。

using Microsoft.AspNetCore.DataProtection;

// During startup add DP
serviceCollection.AddDataProtection();

...

// the 'provider' parameter is provided by DI
public MyClass(IDataProtectionProvider provider)
{
    _protector = provider.CreateProtector("Contoso.MyClass.v1");
}

...

// protect the payload
string protectedPayload = _protector.Protect(input);
Console.WriteLine($"Protect returned: {protectedPayload}");

...

// unprotect the payload
string unprotectedPayload = _protector.Unprotect(protectedPayload);
Console.WriteLine($"Unprotect returned: {unprotectedPayload}");

詳細については、 data protection docs を参照してください

0
alastairtree