Исключение PCLCrypto 'Исключение Cryptographic: Плохое заполнение PKCS7. Неверная длина

Я борюсь с библиотекой PCLCryptho, я не могу заставить ее работать без извлечения исключения "CryptographicException: Bad PKCS7 padding. Неверная длина ". Запуск кода один раз работает, но запускать его несколько раз после сбоя друг друга (с разными входными строками). Расшифровка происходит после нового экземпляра программы. Я запускаю этот код на iOS с Xamarin Forms. Вот мой код (я использую один и тот же ВП каждый раз и сохраняю соль в Settinsg сейчас):

public static string EncryptAnswer(string answer, string passWord)
{
    try
    {
        var keyMaterial = CreateKey(passWord);
        var cipherTextBuffer = GetBytes(answer);

        var symmetricAlgorithm = WinRTCrypto.SymmetricKeyAlgorithmProvider.OpenAlgorithm(SymmetricAlgorithm.AesCbcPkcs7);
        var symmetricKey = symmetricAlgorithm.CreateSymmetricKey(keyMaterial);

        using (var encryptor = WinRTCrypto.CryptographicEngine.CreateEncryptor(symmetricKey, GetBytes("vivivivivivivivi")))
        {
            using (var ms = new MemoryStream())
            {
                using (var cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write))
                {
                    using (var bWriter = new BinaryWriter(cs))
                    {
                        bWriter.Write(cipherTextBuffer, 0, cipherTextBuffer.Length);
                        cs.FlushFinalBlock();
                    }
                }
                return GetString(ms.ToArray());
            }
        }
    }
    catch (Exception e)
    {
        return string.Empty;
    }
}

public static string DecryptAnswer(string encryptedAnswer, string passWord)
{
    try
    {
        var cipherTextBuffer = GetBytes(encryptedAnswer);
        var keyMaterial = CreateKey(passWord);

        var symmetricAlgorithm = WinRTCrypto.SymmetricKeyAlgorithmProvider.OpenAlgorithm(SymmetricAlgorithm.AesCbcPkcs7);
        var symmetricKey = symmetricAlgorithm.CreateSymmetricKey(keyMaterial);
        using (var decryptor = WinRTCrypto.CryptographicEngine.CreateDecryptor(symmetricKey, GetBytes("vivivivivivivivi")))
        {
            using (var ms = new MemoryStream())
            {
                using (var cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Write))
                using (var binWriter = new BinaryWriter(cs))
                {
                    binWriter.Write(cipherTextBuffer, 0, cipherTextBuffer.Length);
                }
                return GetString(ms.ToArray());
            }
        }
    }
    catch (Exception e)
    {
    }
    return string.Empty;
}

public static byte[] CreateSalt()
{
    var salt = WinRTCrypto.CryptographicBuffer.GenerateRandom(8);
    CrossSettings.Current.AddOrUpdateValue("Salt", GetString(salt));

    return salt;
}

private static byte[] GetSalt()
{
    var saltString = CrossSettings.Current.GetValueOrDefault<string>("Salt");
    var salt = GetBytes(saltString);

    return salt;
}

private static byte[] CreateKey(string passWord)
{
    var key = NetFxCrypto.DeriveBytes.GetBytes(passWord, GetSalt(), 1000, 32);
    return key;
}

private static byte[] GetBytes(string str)
{
    return Encoding.Unicode.GetBytes(str);
}

private static string GetString(byte[] bytes)
{
    return Encoding.Unicode.GetString(bytes, 0, bytes.Length);
}

Это похоже на ответы и примеры, которые я нашел. Может кто-нибудь сказать мне, что не так?

0 ответов

Другие вопросы по тегам