Rijndael и Crypto Js совместимость - PullRequest
0 голосов
/ 14 апреля 2020

У нас есть C# библиотека, которая шифрует и дешифрует с использованием Rijndael

 _algorithm = new RijndaelManaged() { Mode = CipherMode.CBC, Padding = PaddingMode.ISO10126 };

   public override byte[] Encrypt(byte[] bytes)
    {
        // a new iv must be generated every time
        _algorithm.GenerateIV();
        var iv = _algorithm.IV;
        var memoryStream = new MemoryStream();
        using (var encryptor = _algorithm.CreateEncryptor(_key, iv))
        using (var cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write))
        {
            memoryStream.Write(iv, 0, iv.Length);
            cryptoStream.Write(bytes, 0, bytes.Length);
            cryptoStream.FlushFinalBlock();
            return memoryStream.ToArray();
        }
    }

В C# существует соответствующий метод дешифрования, который дешифрует то, что зашифровано с помощью вышеуказанного кода. Теперь возникает необходимость, чтобы приложение узла отправляло зашифрованные данные, используя точно такой же алгоритм. Тем не менее, я считаю, что из-за iv код C# не может его расшифровать. Любая идея

 CryptoJS.AES.encrypt(
       value,
        key,
        {
            mode: CryptoJS.mode.CBC,
            padding: CryptoJS.pad.Iso10126,
        }
    );

const decryptedString= CryptoJS.enc.Base64.stringify(result.ciphertext);

1 Ответ

1 голос
/ 14 апреля 2020

Библиотека C# генерирует случайный IV. Поскольку этот IV имеет размер 128 бит, невозможно создать идентичный с использованием Crypto JS. И вам не нужно: для расшифровки вы просто отправляете IV вместе с зашифрованным текстом. Затем вы можете напрямую установить его вместо дешифрования.

Вы можете сделать то же самое при переходе другим путем: создать случайный IV на сайте Crypto JS, отправить IV вместе с зашифрованным текстом на C# side и отправьте его в реализацию C#.

Как правило, IV просто добавляется к зашифрованному тексту. Для режима CB C размер IV всегда ровно один блок: 128 бит / 16 байт для AES. Таким образом, размер известен, что позволяет легко извлечь его из начала зашифрованного текста.


Обратите внимание, что:

  • с использованием CB C без HMA C совершенно небезопасен для безопасности в транспортном режиме - злоумышленник не только может заставить вас получить недопустимый открытый текст, CB C также уязвим к открытому тексту / атакам oracle атакам;
  • CB C требует непредсказуемого IV который отличается для каждого открытого текста при использовании одного и того же ключа - как правило, это означает создание случайного IV;
  • ISO / IEC 10126 совместимые отступы в значительной степени устарели, теперь все используют совместимые дополнения PKCS # 7 , для CB C в любом случае: большинство других режимов вообще не требуют заполнения (но. NET имеет довольно плохую поддержку для других режимов работы).
...