在RSA算法中使用公钥

问题描述:

我有桌面C#代码(控制台,WPF等),它从base64字符串生成密钥并由其加密。在RSA算法中使用公钥

string b64Key = ""; 
byte[] decoded = Convert.FromBase64String(b64Key); 
int modLength = BitConverter.ToInt32(decoded.Take(4).Reverse().ToArray(), 0); 
byte[] mod = decoded.Skip(4).Take(modLength).ToArray(); 
int expLength = BitConverter.ToInt32(decoded.Skip(modLength + 4).Take(4).Reverse().ToArray(), 0); 
byte[] exponent = decoded.Skip(modLength + 8).Take(expLength).ToArray(); 

RSAParameters key = new RSAParameters(); 
key.Modulus = mod; 
key.Exponent = exponent; 

var provider = new RSACryptoServiceProvider(); 
provider.ImportParameters(key); 
var encrypted = provider.Encrypt(Encoding.UTF8.GetBytes("string"), true); 

我必须在UWP项目中重用这部分代码。

我尝试过很多方法,但每一次我赶上当我试图导入公钥异常:

// try to use DESKTOP key for understanding 
byte[] mod = key.Modulus; 
byte[] exponent = key.Exponent; 
// this method concat arrays 
var buf = this.Combine(mod, exponent); 

// try to create key buffer from array 
IBuffer keyBuffer = CryptographicBuffer.CreateFromByteArray(buf); 
// try to create key buffer from base64 string 
keyBuffer = CryptographicBuffer.DecodeFromBase64String("base64 string"); 

var provider = AsymmetricKeyAlgorithmProvider.OpenAlgorithm(AsymmetricAlgorithmNames.RsaPkcs1); 
var publicKey = provider.ImportPublicKey(keyBuffer, CryptographicPublicKeyBlobType.Pkcs1RsaPublicKey); 
// I tried all values in 'CryptographicPublicKeyBlobType' enum 

var encryptData = CryptographicEngine.Encrypt(publicKey, CryptographicBuffer.ConvertStringToBinary("string", BinaryStringEncoding.Utf8), null); 

我怎样才能正确导入密钥的UWP项目?

谢谢!

+0

什么是例外情况,并在哪条线上下摆? – rene

+0

@rene它总是在我调用'ImportPublicKey'方法时发生。有几种例外情况: 1.符合ASN1错误标记值。 (来自HRESULT的异常:0x8009310B) 2.异常来自HRESULT:0x90090005 –

在第一个 - 我只有正确的模数和所有。我的base64字符串是不正确的公钥(在这个字符串中的键,但有很多其他项目)。 之后,我发现只有一个从模数和指数生成公钥的正确方法 - >将它们组合起来。但我仍然有例外。之后,我尝试生成默认密钥并更改其中的模数部分 - >并且它工作正常!

  var provider = AsymmetricKeyAlgorithmProvider.OpenAlgorithm(AsymmetricAlgorithmNames.RsaOaepSha1); 
      // create custom (random) key with size '1024' 
      var standardKeyPair = provider.CreateKeyPair(1024); 
      // export publick key to this default key 
      var standardBuffer = standardKeyPair.ExportPublicKey(CryptographicPublicKeyBlobType.Pkcs1RsaPublicKey); 
      // copy it to bytes array 
      byte[] standardKey; 
      CryptographicBuffer.CopyToByteArray(standardBuffer, out standardKey); 

      // change part of the key to our modules 
      // I DON'T KNOW WHY, but starndart key has 7 bytes in prefix and 5 in suffix (nail) 
      // we have 128 bytes in modulus and 140 in default key -> so we must make 140 bytes from our modulus 
      Array.Copy(modulus, 0, standardKey, 7, modulus.Length);