Расшифровать AES / OFB / NoPadding - PullRequest
1 голос
/ 19 июня 2019

Мне нужно расшифровать контент, закодированный с помощью комбо AES/OFB/NoPadding в C #.Кажется, это не поддерживается изначально: следующий код не будет делать это как

var aes = new AesManaged
{
   Padding = PaddingMode.None,
   Mode = CipherMode.OFB,
   KeySize = 128,
   BlockSize = 128
};

Производит:

System.Security.Cryptography.CryptographicException:
Указанный режим шифрования недопустим для этого алгоритма.

Самая близкая проблема, которую я мог найти здесь на SO, это эта , которая использует BouncyCastle для выполненияшифрование:

Public Function DoEncryption(ByVal KeyArray() As Byte, ByVal IVArray() As Byte, ByVal Buffer     As Byte()) As Byte()

    Dim ae As New CipherKeyGenerator()
    ae.Init(New KeyGenerationParameters(New SecureRandom(), 256))
    Dim aesKeyParam As KeyParameter = ParameterUtilities.CreateKeyParameter("AES",     KeyArray)
    Dim aesIVKeyParam As ParametersWithIV = New ParametersWithIV(aesKeyParam, IVArray)
    Dim cipher As IBufferedCipher = CipherUtilities.GetCipher("AES/OFB/NoPadding")
    cipher.Init(True, aesIVKeyParam)
    Dim encrypted() As Byte = cipher.DoFinal(Buffer)
    Return encrypted

End Function

Другие проблемы (например, этот ) содержат больше информации, но также и много пользовательского кода - я бы лучше использовал BouncyCastle.Кто-нибудь может мне помочь с расшифровкой или указать мне полезную документацию?

1 Ответ

0 голосов
/ 19 июня 2019

Из кода в настоящем вопросе единственным шагом, необходимым для запуска дешифрования вместо шифрования, было изменение логического параметра в вызове cipher.Init:

cipher.Init(False, aesIVKeyParam) // False == decryption, True == encryption

Последний фрагмент в C # -

private static byte[] DoDecryption(byte[] keyArray, byte[] ivArray, byte[] encoded)
{
    var aesKeyParam = ParameterUtilities.CreateKeyParameter("AES", keyArray);
    var aesIvKeyParam = new ParametersWithIV(aesKeyParam, ivArray);
    var cipher = CipherUtilities.GetCipher("AES/OFB/NOPADDING");
    cipher.Init(false, aesIvKeyParam);
    var decrypted = cipher.DoFinal(encoded);
    return decrypted;
}
...