C# UWP[通用windows平台]RSA AsymmetricKeyAlgorithmProvider导入公钥

C# UWP[通用windows平台]RSA AsymmetricKeyAlgorithmProvider导入公钥,c#,encryption,win-universal-app,rsa,C#,Encryption,Win Universal App,Rsa,当我试图在UWP中使用Windows.Security.Cryptography.Core时,从AsymmetricKeyAlgorithmProvider导入公钥时总是会出错。我尝试了各种组合,但都没有成功。我总是检查输入字符串是否处于UTF8模式 try { var bytes = Encoding.UTF8.GetBytes(publicKeyString); publicKeyString = Encoding.UTF8.GetString(bytes); Debug.Wr

当我试图在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 = "2D2D2D2D2D424547494E205055424C4943204B45592D2D2D2D2D0A4D494942496A414E42676B71686B6947397730424151454641414F43415138414D49494243674B434151454172336767514744726E5645562B786A4F484F2B390A4B72595541547166756935666F364D65736E53466C6B797937482F4775327135667273724B305246383933507A584F664371414A6753534D58673330793463720A594E3742617838467979314C58744E2B5A35576B43436D644F597438704F636D7A75494D6A636E4E733063486B767859576B336658516D513255535A685063700A51595761382F4469392B344462745464587A643263346F717A4E4A4A4A4B66437A647731796E72776F4A755A4245563547747363396F48782F6D7231725434420A386F377635473553706D543368687661396762617034436C4231745677434B584F41636A2F71782F49416A505A35566E4B7A363669325534706A6F43764A79590A564E53497A3557346276726A6E622B76775848626B506D62316E6655503864526D33683767644F314D7330766B72715A4567714746416953343475686974576B0A65514944415141420A2D2D2D2D2D454E44205055424C4943204B45592D2D2D2D2D0A";

  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加密核心无法从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形式,因此uwp加密核心无法从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);

我遇到了同样的问题: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);

hex
格式的解码文本是
X.509
格式的公钥。您可以尝试将
X509SubjectPublicKeyInfo
作为第二个参数传递,但我不确定这些函数是否需要二进制或文本格式。我尝试了十六进制和Base64字符串编码,两次都在X.509和上失败。我得到ANS1错误,我在使用Pkcs1RsaPublicKey和BcryptPublicKey时也得到这个错误一切正常,但我得到了一个异常0x0900001类似的东西,它只是没有任何想法吗?
hex
格式的解码文本是
X.509
格式的公钥。您可以尝试将
X509SubjectPublicKeyInfo
作为第二个参数传递,但我不确定这些函数是否需要二进制或文本格式。我尝试了十六进制和Base64字符串编码,两次都在X.509和上失败。我得到了ANS1错误,我在使用Pkcs1RsaPublicKey和BcryptPublicKey时也得到了这个错误一切正常,但我得到了一个类似于0x0900001的异常,它只是失败了,有什么想法吗?