簡體   English   中英

在RSA算法中使用公鑰

[英]Use public key in RSA algorithm

我有桌面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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM