【问题标题】:RSA Public and Private keys in string format字符串格式的 RSA 公钥和私钥
【发布时间】:2018-09-01 13:35:00
【问题描述】:

如何使用以字符串形式提供的公钥和私钥进行加密和解密。因为我使用的是 RSACryptoServiceProvider,它需要 XML 格式,所以有没有可能使用提供的字符串。谢谢。

【问题讨论】:

标签: c#


【解决方案1】:

您必须解析初始字符串以分别获取所有向量、公钥、指数。然后将此字符串转换为字节,并以这段代码为例:

RSAParameters parameters = new RSAParameters();

//here you have to set all provided exponents, vectors
parameters.Exponent = myExponent; //...and other properties

//then - create new RSA cryptoservise provider and import parameters
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
RSA.ImportParameters(parameters);

要将字符串转换为字节,请使用此表达式 - 它已经过测试:

public static byte[] String2ByteArray(string Hex, int j = -2) =>
(Hex.StartsWith("0x") ? Hex = Hex.Substring(2) : Hex).Where((x, i) => i % 2 == 0)
.Select(x => byte.Parse(Hex.Substring(j += 2, 2), NumberStyles.HexNumber)).ToArray();
public static Action<string> writeOutput = (x) => Debug.WriteLine(x);

如果你得到这样的 XML:

<RSAKeyValue>
   <Modulus>…</Modulus>
   <Exponent>…</Exponent>
   <P>…</P>
   <Q>…</Q>
   <DP>…</DP>
   <DQ>…</DQ>
   <InverseQ>…</InverseQ>
   <D>…</D>
</RSAKeyValue>

您可以解析此 XML 以检索所有参数。所以将它们分配给

parameters.Modulus
parameters.Exponent
parameters.P
parameters.D
parameters.DP
parameters.DQ
parameters.InverseQ

【讨论】:

  • 感谢您的回复,提供的字符串仅包含加密数据,没有 P、Q 指数等。
  • 这显然意味着,您无法解密只有加密数据而没有私钥的加密数据
  • 亲爱的 Alexey,我的意思是 p,q,指数只存在于 xml 字符串中。我只包含字母和符号的字符串,我尝试了 olnline 转换,它可以正确转换为 xml 公钥,但在提供的 pkcs#1 和 pkcs#8 上给出错误。
  • 我不太明白你的意思。但也许在你回答了这个问题之后,我大概就能理解你了:为什么一定要使用 XML?
  • 因为我使用 .net 加密/解密 RSACryptoService 提供者需要 xml 格式的密钥
【解决方案2】:

使用 Bouncy castle dll,将密钥信息粘贴到文本文件并使用以下代码解决了问题:

public string RSABouncyEncrypt(string content)
        {
            var bytesToEncrypt = Encoding.UTF8.GetBytes(content);
            AsymmetricKeyParameter keyPair;
            using (var reader = File.OpenText(@"E:\......\public.pem"))
            {
                keyPair = (AsymmetricKeyParameter)new Org.BouncyCastle.OpenSsl.PemReader(reader).ReadObject();
            }   

            var engine = new RsaEngine();
            engine.Init(true, keyPair);

            var encrypted = engine.ProcessBlock(bytesToEncrypt, 0, bytesToEncrypt.Length);

            var cryptMessage = Convert.ToBase64String(encrypted);
            //Logs.Log.LogMessage("encrypted: " + cryptMessage);
            //Console.WriteLine(cryptMessage);

            //Decrypt before return statement to check that it has been encrypted correctly
            //RSADecrypt(cryptMessage);
            return cryptMessage;
        }

        public string RSADecrypt(string string64)
        {
            var bytesToDecrypt = Convert.FromBase64String(string64); // string to decrypt, base64 encoded

            AsymmetricCipherKeyPair keyPair;

            using (var reader = File.OpenText(@"E:\.....\private.pem"))
                keyPair = (AsymmetricCipherKeyPair)new Org.BouncyCastle.OpenSsl.PemReader(reader).ReadObject();

            var decryptEngine = new RsaEngine();
            decryptEngine.Init(false, keyPair.Private);

            var decrypted = Encoding.UTF8.GetString(decryptEngine.ProcessBlock(bytesToDecrypt, 0, bytesToDecrypt.Length));
            //Logs.Log.LogMessage("decrypted: " + decrypted);
            //Console.WriteLine(decrypted);
            return decrypted;
        }

【讨论】:

    猜你喜欢
    • 2017-09-08
    • 2018-01-13
    • 1970-01-01
    • 2021-06-07
    • 2015-06-07
    • 1970-01-01
    • 2013-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多