2010-10-18 5 views
3

Я использую следующий код для инициализации шифрования ...Как зашифровать строку в 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
  • None
  • pkcs7
  • Нули

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

ответ

5

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

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

PKCS # 7 обивка описана в PKCS#7 spec в разделе 10.3. Заполнение PKCS # 5 описано в разделе PKCS#5 spec в пункте 6.1.1 раздела 6.1.1. Как вы можете видеть на экзамене, алгоритмы заполнения идентичны.

+0

Фактически это действительно так :) –

+0

Есть ли источник? – digiguru

2

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

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

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

Ну, у вас есть информация - закодируйте строку в байт [], расширьте ее так, чтобы она выровнялась до 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 

Примечание: код из моей головы, это не runable вообще ...

+0

Позвольте мне просто подтвердить 100% - вы просто добавляете его в строку, которую вы шифруете, прежде чем шифровать ее? Откуда вы знаете, сколько дополнений нужно добавить? EG - если вы использовали до 124 символов, вам нужно расширить его до 128? Что, если у вас есть 129 символов, вы обходите до 256? – digiguru

+0

НЕТ, вы сначала кодируете байт [], затем нажмите. Я расширю свой ответ здесь. –

+0

Если я кодирую текст, прежде чем делать его дольше, тогда он говорит: «Длина данных для шифрования недействительна». Я предполагаю, что это означает, что мне нужно вырастить его до того, как я зашифрую? – digiguru