web-dev-qa-db-ja.com

dotnetコア2.1で256の長いブロックサイズのRijndaelアルゴリズムを使用する方法

文字列をRijndaelManagedで暗号化して、サードパーティのサービスに送信しようとしています。以下のような古いバージョンの.Netフレームワーク(4.5、4.6.x)に手順を実装しました。

RijndaelManaged rm= new RijndaelManaged();
rm.KeySize = 256;
rm.BlockSize = 256;//causes exception in dotnet core 2.1
rm.Padding = PaddingMode.PKCS7;
rm.Key = Convert.FromBase64String(this.Key);
rm.IV = Convert.FromBase64String(this.IV);

var encrypt = rm.CreateEncryptor(rm.Key, rm.IV);

documentation によると、RijndaelManagedクラスはBlockSize = 256で使用できます。しかし、コードがdotenetコア2.1で実行されている場合、例外がスローされます。

System.PlatformNotSupportedException:この実装では、BlockSizeは128でなければなりません。 System.Security.Cryptography.RijndaelManaged.set_BlockSize(Int32 value)で

[〜#〜]更新[〜#〜]

this によると、@ Access-Deniedの応答のおかげで、dotnetコアのドキュメントに誤りがある可能性があり、256の長いBlockSizeRijndaelManagedクラスを使用できないことに気付きました。前述のとおり、暗号化されたデータはサードパーティのサービスに送信されます。 32の長いIVでRijndaelを使用する必要があります。どうすればそれを処理できますか?

8
thirdDeveloper

最良のドキュメントはソースコードです。彼らの ソースコード によると128だけがサポートされています:

public override int BlockSize
{
    get { return _impl.BlockSize; }
    set
    {
        Debug.Assert(BlockSizeValue == 128);

        //Values which were legal in desktop RijndaelManaged but not here in this wrapper type
        if (value == 192 || value == 256)
            throw new PlatformNotSupportedException(SR.Cryptography_Rijndael_BlockSize);

        // Any other invalid block size will get the normal "invalid block size" exception.
        if (value != 128)
            throw new CryptographicException(SR.Cryptography_Rijndael_BlockSize);
    }
}

BouncyCastle.NetCoreを使用します。次の link にコードスニペットがあります。

var keyBytes = password.GetBytes(Keysize / 8);
var engine = new RijndaelEngine(256);
var blockCipher = new CbcBlockCipher(engine);
var cipher = new PaddedBufferedBlockCipher(blockCipher, new Pkcs7Padding());
var keyParam = new KeyParameter(keyBytes);
var keyParamWithIV = new ParametersWithIV(keyParam, ivStringBytes, 0, 32);

cipher.Init(true, keyParamWithIV);
var comparisonBytes = new byte[cipher.GetOutputSize(cipherTextBytes.Length)];
var length = cipher.ProcessBytes(cipherTextBytes, comparisonBytes, 0);
cipher.DoFinal(comparisonBytes, length);
6
Access Denied