RijndaelManaged CreateEncryptor работает в VB.NET, но ошибки в C # - PullRequest
0 голосов
/ 05 декабря 2018

Я пытаюсь преобразовать класс шифрования из VB.NET Framework в C # .Net Standard, и по какой-то причине я получаю сообщение об ошибке, как показано ниже, при вызове метода CreateEncryptor для экземпляра RijndaelManaged в C #.

Указанный вектор инициализации (IV) не соответствует размеру блока для этого алгоритма.Имя параметра: rgbIV

Это рабочий код VB.NET

Dim password As PasswordDeriveBytes = New PasswordDeriveBytes(passPhrase, saltValueBytes, hashAlgorithm, passwordIterations)

#Disable Warning BC40000 ' Type or member is obsolete
    Dim keyBytes() As Byte = password.GetBytes(keySize / 8)
#Enable Warning BC40000 ' Type or member is obsolete

Dim symmetricKey As RijndaelManaged = New RijndaelManaged

If (initVectorBytes.Length = 0) Then
    symmetricKey.Mode = CipherMode.ECB
Else
    symmetricKey.Mode = CipherMode.CBC
End If

encryptor = symmetricKey.CreateEncryptor(keyBytes, initVectorBytes)

И это ошибочный код C #

PasswordDeriveBytes password = new PasswordDeriveBytes(passPhrase, saltValueBytes, hashAlgorithm, passwordIterations);

byte[] keyBytes = password.GetBytes((int)(keySize / (double)8));

RijndaelManaged symmetricKey = new RijndaelManaged();

if ((initVectorBytes.Length == 0))
    symmetricKey.Mode = CipherMode.ECB;
else
    symmetricKey.Mode = CipherMode.CBC;

encryptor = symmetricKey.CreateEncryptor(keyBytes, initVectorBytes);

В значении C # keyBytesотображается как «byte [32]» и initVectorBytes как «byte [0]»

В VB значение keyBytes отображается как «Length = 32», а initVectorBytes как «Length = 0»

Шагнувчерез код в обеих версиях единственное различие, которое я вижу в данных, заключается в том, что IVValue и KeyValue отсутствуют в объекте symbricKey.

enter image description here

Что мне нужно сделать, чтобы это исправить?

1 Ответ

0 голосов
/ 05 декабря 2018

Похоже, вы пытаетесь создать keyBytes с неправильным типом и размером параметра 'keySize'.Можете ли вы попробовать следующее:

PasswordDeriveBytes password = new PasswordDeriveBytes(passPhrase, saltValueBytes, hashAlgorithm, passwordIterations);

byte[] keyBytes = password.GetBytes(keySize/8);

RijndaelManaged symmetricKey = new RijndaelManaged();

if ((initVectorBytes.Length == 0))
    symmetricKey.Mode = CipherMode.ECB;
else
    symmetricKey.Mode = CipherMode.CBC;

encryptor = symmetricKey.CreateEncryptor(keyBytes, initVectorBytes);
...