运行以下代码失败。当我导入公钥时,其中一个RSA参数似乎填充了前导零,导致publickKey
为520位而不是privateKey
的512位。
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
似乎是正确的。它适用于另一个使用它来加密我可以成功解密的数据的服务。这个问题是当我尝试为单元测试创建一些虚拟加密数据时。
我使用.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中的错误还是我使用错误。