Как зашифровать строку в 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
ПРИМЕЧАНИЕ: код у меня в голове, он вообще не запускается...