J'essaie de crypter une chaîne avec RijndaelManaged
afin de l'envoyer à un service tiers. J'ai implémenté la procédure dans les anciennes versions du framework .Net (4.5, 4.6.x) comme ci-dessous:
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);
Selon documentation , la classe RijndaelManaged
peut être utilisée avec BlockSize = 256
. Mais, lorsque le code s'exécute dans dotenet core 2.1, une exception est levée:
System.PlatformNotSupportedException: BlockSize doit être 128 dans cette implémentation. à System.Security.Cryptography.RijndaelManaged.set_BlockSize (valeur Int32)
[~ # ~] mise à jour [~ # ~]
Grâce à la réponse de @ Access-Denied, selon this , j'ai remarqué que cela pouvait être une erreur dans la documentation de base dotnet et je ne peux pas utiliser un 256 long BlockSize
avec RijndaelManaged
classe. Comme je l'ai mentionné, les données chiffrées vont être envoyées à un service tiers. Je dois utiliser Rijndael avec un 32 long IV
. Comment puis-je gérer cela?
La meilleure documentation est un code source. Selon leur code source seulement 128 sont pris en charge:
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);
}
}
Utilisez BouncyCastle.NetCore. Un extrait de code est disponible à l'adresse suivante lien :
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);