Как использовать алгоритм Rijndael с 256 длинным блоком в ядре dotnet 2.1 - PullRequest
0 голосов
/ 08 октября 2018

Я пытаюсь зашифровать строку с помощью RijndaelManaged, чтобы отправить ее стороннему сервису.Я реализовал процедуру в более старых версиях .Net Framework (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);

В соответствии с документацией , класс RijndaelManaged может использоваться сBlockSize = 256.Но когда код выполняется в ядре dotenet 2.1, возникает исключение:

System.PlatformNotSupportedException: BlockSize должно быть 128 в этой реализации.at System.Security.Cryptography.RijndaelManaged.set_BlockSize (значение Int32)

ОБНОВЛЕНИЕ

Благодаря ответу @ Access-Denied, согласно , это, я заметил, что это может быть ошибкой в ​​документации ядра dotnet, и я не могу использовать длинный BlockSize 256 с классом RijndaelManaged.Как я уже упоминал, зашифрованные данные будут отправлены стороннему сервису.Я должен использовать Rijndael с длиной 32 IV.Как я могу справиться с этим?

1 Ответ

0 голосов
/ 08 октября 2018

Лучшая документация - это исходный код.Согласно их исходному коду поддерживается только 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.Фрагмент кода доступен по следующей ссылке :

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);
...