У меня проблемы с выяснением того, с какой строкой следует дополнять перед шифрованием, чтобы заполнение было PKCS # 7. Насколько мне известно, значение каждого дополненного блока должно быть равно количеству дополненных блоков.
Однако, когда я пытаюсь сделать это в C #, эта формула не работает. В приведенном ниже примере data byte [] имеет 10 элементов и требует 6 отступов, однако заполнение не будет должным образом удалено, если вы не используете 7 в качестве значения каждого дополненного блока.
Однако, если я расширяю содержимое в данных до 14 байтов (таким образом, два должны быть дополнены), для каждого блока требуется значение 0 для правильного удаления заполнения.
Как таковой, кто-то может сказать мне, если я неправильно реализовал функции или неправильно понял, как должен быть реализован отступ.
Я включил функции ниже:
static string testFunc()
{
byte[] IV = new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
byte[] key = new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };
//presumably this should need padding by 6 bytes
byte[] data = Encoding.ASCII.GetBytes("1234567890");
byte[] padded = new byte[16];
Array.Copy(data, 0, padded, 0, data.Length);
for (int a = data.Length; a < padded.Length; a++)
{
padded[a] = 7;
}
byte[] encrypted = CbcEncrypt(padded, key, IV);
string base64 = Convert.ToBase64String(CbcDecrypt(encrypted, key, IV));
Console.WriteLine(Encoding.UTF8.GetString(Convert.FromBase64String(base64)));
return "";
}
public static byte[] CbcEncrypt(byte[] data, byte[] key, byte[] IVector)
{
var a = new AesManaged();
a.Key = key;
a.IV = IVector;
a.Mode = CipherMode.CBC;
var encryptor = a.CreateEncryptor();
byte[] result = encryptor.TransformFinalBlock(data, 0, data.Length);
return result;
}
public static byte[] CbcDecrypt(byte[] data, byte[] key, byte[] IVector)
{
var a = new AesManaged();
a.Key = key;
a.IV = IVector;
a.Mode = CipherMode.CBC;
var decryptor = a.CreateDecryptor();
byte[] result = decryptor.TransformFinalBlock(data, 0, data.Length);
return result;