UWP RSA AsymmetricKeyAlgorithmProvider导入公钥

当我尝试在UWP中使用Windows.Security.Cryptography.Core时,我总是从AsymmetricKeyAlgorithmProvider导入公钥时出错。 我尝试了所有组合而没有成功。 我总是检查输入字符串是否为UTF8模式。

 try { var bytes = Encoding.UTF8.GetBytes(publicKeyString); publicKeyString = Encoding.UTF8.GetString(bytes); Debug.WriteLine(publicKeyString); IBuffer keyBuffer = CryptographicBuffer.DecodeFromBase64String(publicKeyString); byte[] bytes = Convert.FromBase64String(publicKeyString); string hex = ""; Debug.WriteLine(hex); AsymmetricKeyAlgorithmProvider provider = AsymmetricKeyAlgorithmProvider.OpenAlgorithm(AsymmetricAlgorithmNames.RsaPkcs1); CryptographicKey publicKey = provider.ImportPublicKey(CryptographicBuffer.DecodeFromHexString(hex), CryptographicPublicKeyBlobType.BCryptPublicKey); IBuffer dataBuffer = CryptographicBuffer.CreateFromByteArray(Encoding.UTF8.GetBytes(plainText)); var encryptedData = CryptographicEngine.Encrypt(publicKey, dataBuffer, null); return CryptographicBuffer.EncodeToBase64String(encryptedData); } catch (Exception e) { throw; return "Error in Encryption:With RSA "; } 

我找到了解决我问题的方法,问题是我试图导入的公钥不是ASN1格式,因此uwp Cryptography Core无法从DER转换为ASN1,新代码是:

 byte[] bytes = Encoding.UTF8.GetBytes(publicKeyString); IBuffer keyBuffer = CryptographicBuffer.DecodeFromBase64String(publicKeyString); AsymmetricKeyAlgorithmProvider provider = AsymmetricKeyAlgorithmProvider.OpenAlgorithm(AsymmetricAlgorithmNames.RsaPkcs1); CryptographicKey publicKey = provider.ImportPublicKey(keyBuffer,CryptographicPublicKeyBlobType.Pkcs1RsaPublicKey);` 

我遇到了同样的问题:遇到ASN1坏标签值。 我发现ImportKeyPair(IBuffer)对我的情况是正确的。 示例代码:

 var loginPBK = "";//your public key,such as "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCp0wHYbg......." var provider = AsymmetricKeyAlgorithmProvider.OpenAlgorithm(AsymmetricAlgorithmNames.RsaPkcs1); var publicKey = provider.ImportPublicKey(CryptographicBuffer.DecodeFromBase64String(loginPBK)); var encryptData = CryptographicEngine.Encrypt(publicKey, CryptographicBuffer.ConvertStringToBinary(password, BinaryStringEncoding.Utf8), null); var pwd2 = CryptographicBuffer.EncodeToBase64String(encryptData);