PCLCrypto非对称加密失败,导致零填充公钥

时间:2015-12-11 12:17:37

标签: encryption rsa public-key-encryption pcl-crypto

运行以下代码失败。当我导入公钥时,其中一个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中的错误还是我使用错误。

0 个答案:

没有答案