Как зашифровать строку в vb.net, используя RijndaelManaged и используя заполнение PKCS5? - PullRequest
4 голосов
/ 19 октября 2010

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

 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 ]

6 голосов
/ 19 октября 2010

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

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

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

2 голосов
/ 19 октября 2010

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

Как вы, наверное, знаете, 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

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

...