Сбой PCLCrypto асимметричного шифрования с открытым открытым ключом с нулевым заполнением
Запуск следующего кода завершается ошибкой. Когда я импортирую открытый ключ, кажется, что один из параметров RSA дополняется начальным нулем, вызывая publickKey
быть 520 бит вместо 512 бит privateKey
,
public static void Test()
{
var algorithm = WinRTCrypto.AsymmetricKeyAlgorithmProvider.OpenAlgorithm(AsymmetricAlgorithm.RsaPkcs1);
ICryptographicKey privateKey = algorithm.CreateKeyPair(512);
byte[] publicKeyBytes = privateKey.ExportPublicKey(CryptographicPublicKeyBlobType.X509SubjectPublicKeyInfo);
ICryptographicKey publicKey = algorithm.ImportPublicKey(publickKeyBytes, CryptographicPublicKeyBlobType.X509SubjectPublicKeyInfo);
var encryptedValue = WinRTCrypto.CryptographicEngine.Encrypt(publicKey, Encoding.UTF8.GetBytes("test"));
var decryptedValue = WinRTCrypto.CryptographicEngine.Decrypt(privateKey, encryptedValue);
}
Проблема, кажется, заключается в следующем:
algorithm.ImportPublicKey(publickKeyBytes, CryptographicPublicKeyBlobType.X509SubjectPublicKeyInfo);
publicKeyBytes
кажется правильным. Он работает против другого сервиса, который использует его для шифрования некоторых данных, которые я могу успешно расшифровать. Эта проблема возникает, когда я пытаюсь создать фиктивные зашифрованные данные для модульного тестирования.
Я запускаю этот код в Portable Class Library, используя.Net Framework 4.5.
Приведенный выше код выдает строку, в которой он пытается расшифровать System.Security.Cryptography.CryptographicException
со следующим сообщением:
Данные для дешифрования превышают максимум для этого модуля в 64 байта.
Следующее утверждение не выполняется:
Assert.Equals(privateKey.KeySize, publicKey.KeySize)
Выполнение следующего удаления удаленного нуля из модуля исправляет открытый ключ, и все работает нормально.
RSAParameters rsaPublicParameters = publicKey.ExportParameters(false);
rsaPublicParameters.Modulus = rsaPublicParameters.Modulus.Skip(1).ToArray();
ICryptographicKey workingPublicKey = algorithm.ImportParameters(rsaPublicParameters);
Это ошибка в PCLCrypto или я использую это неправильно.