C # PKCS # 7 проблемы с добавлением соответствующих отступов в строки - PullRequest
0 голосов
/ 27 октября 2018

У меня проблемы с выяснением того, с какой строкой следует дополнять перед шифрованием, чтобы заполнение было 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;
...