C# 在RSA算法中使用公钥

C# 在RSA算法中使用公钥,c#,cryptography,uwp,win-universal-app,rsa,C#,Cryptography,Uwp,Win Universal App,Rsa,我有桌面C#代码(控制台、wpf等),它从base64字符串生成密钥并通过它进行加密 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(); in

我有桌面C#代码(控制台、wpf等),它从base64字符串生成密钥并通过它进行加密

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项目正确导入密钥


谢谢

首先-我只有正确的模量和所有。我的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);

首先,我只有正确的模量和所有。我的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);

例外情况是什么?您在哪一行获得hem?@rene当我调用“ImportPublicKey”方法时,总是会出现这种情况。有几种例外情况:1。满足ASN1错误标记值。(来自HRESULT的异常:0x8009310B)2。来自HRESULT的异常:0x900005异常是什么?您在哪一行获取hem?@rene在调用“importPublicey”方法时总是发生这种情况。有几种例外情况:1。满足ASN1错误标记值。(来自HRESULT的异常:0x8009310B)2。来自HRESULT的异常:0x90005