Как зашифровать строку в vb.net, используя RijndaelManaged и используя заполнение PKCS5?

Я использую следующий код для инициализации шифрования...

 Dim symmetricKey As New System.Security.Cryptography.RijndaelManaged()
 With symmetricKey
   .Key = Encoding.ASCII.GetBytes(Key)
   .IV = Encoding.ASCII.GetBytes(IV)
   .Mode = CipherMode.CBC
   .BlockSize = 128 
   .KeySize = 128 
   .Padding = PaddingMode.PKCS7
End With

Требование заключается в использовании PKCS5. Режимы заполнения в vb.net включают только

  • ANSIX923
  • ISO10126
  • Никто
  • PKCS7
  • нули

Поэтому я не думаю, что есть метод для PKCS5. Есть ли способ добавить его, или мне нужно самому написать метод шифрования? Если так - как мне это написать? Есть ли надежная DLL, которая будет поддерживать его?

2 ответа

Решение

Заполнение PKCS7 и дополнение PKCS5 - это одно и то же. В этом контексте они являются синонимами.

РЕДАКТИРОВАТЬ:

Заполнение PKCS#7 описано в спецификации PKCS#7 в разделе 10.3. Заполнение PKCS#5 описано в спецификации PKCS#5 в разделе 6.1.1, шаг 4. Как видно из проверки, алгоритмы заполнения идентичны.

Я предполагаю, что вам нужен кто-то еще, чтобы прочитать ваши зашифрованные данные, а затем понять только такой тип заполнения.

Как вы, вероятно, знаете, PKCS5 объясняется как:

Заполнение PKCS#5 работает следующим образом: байты, остающиеся для заполнения блока, назначаются числом, которое является количеством байтов, которые были добавлены для заполнения блока. Например, если у нас есть 16-байтовый блок, и только 11 байтов заполнены, то у нас есть 5 байтов для заполнения. Всем этим 5 байтам присваивается значение 5 для 5 байтов заполнения.

Ну, у вас есть информация - закодируйте строку в byte[], расширите ее так, чтобы она была выровнена до 16 байтов, и заполните остальные в соответствии с рецептом. Затем зашифруйте с помощью Padding.None.

Думаю, это не должно быть так хлопотно. В любом случае, строковое шифрование отсутствует, так как вы все равно кодируете материал в byte[],...

string message="lorem ipsum and stuff";
byte[] result=Text.Encode(message);
int packets=result.Length/16;
int paddingSize=16-(result.Length-(packets*16));
if (paddingSize!=16) 
{
    byte[] newbuffer=new byte[result.Length+paddingSize];
    packets.CopyTo(newbuffer);
    for (int n=result.Length;n<newbuffer.Length;n++)
    {
        newbuffer[n]=16-paddingsize;
    }
}
//  then, encrypt result or newbuffer, depending on if padding is 16 or not

ПРИМЕЧАНИЕ: код у меня в голове, он вообще не запускается...

Другие вопросы по тегам