当前位置: 首页 > 知识库问答 >
问题:

字符串格式的RSA公钥和私钥

田嘉澍
2023-03-14

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

共有2个答案

沈乐邦
2023-03-14

使用了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;
        }
霍财
2023-03-14

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

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
 类似资料:
  • 出于明显的安全原因,我需要用RSA私钥和公钥加密和解密用户的PIN码,我找到了工作解决方案,看起来像: 一切正常,但在本例中,键对不是静态的,每次都会生成新值,但我需要使用相同的键,它们表示为字符串变量: 有没有办法将这些变量强制转换为PublicKey和PrivateKey类?

  • 我想得到一个文件内容的公钥,这是一个文件内容看起来像什么的例子(用生成): 如果我是对的,这不是公钥,但是可以从这个字符串中获取公钥。 这个答案回答了我的问题https://stackoverflow.com/a/19387517/2735398 但答案似乎不起作用。我有个例外: 当看到答案的评论时,我不是唯一有问题的人... 如何修复异常?或者有没有其他方法可以从字符串中获取公钥?

  • 我有一个公钥和一个私钥,还有一个字符串,我想要解密。 公钥的格式如下: 私钥的格式如下: 我要解密的字符串已经使用公钥加密,然后我需要使用私钥解密它。

  • 我试图从已经生成的密钥对(两个s)中提取1024位RSA公钥,以便通过网络发送。我只需要一个普通的对,它应该正好占用131字节(模128字节,指数3字节)。 但是,当我以对象的形式获取密钥信息时,我得到的是140位,而不是131位。下面是一个示例结果: 在多次重试密钥生成并比较生成的对象后,所有密钥保持不变的字节是前7个: 最后三个字节看起来像指数(65537,一个公共值)。模数和指数之间还有两个

  • 我可以直接从文件中读取公钥和私钥,因为文件流将其转换为PublicKey和PrivateKey对象。但如果以字符串形式加载,则失败。 工作代码 线程“main”java.security.spec.invalidkeyspection:java.security.invalidkeyexception:sun.security.rsa.rsakeyfactory.engineGeneratePub

  • 我一直在阅读一些RSA文献和堆栈溢出问题,但我没有得到明确的答案。 仅给定一个RSA私钥模和私钥指数,这是我所拥有的全部(也足够用于所有密码相关操作),我能得到相关的公钥模和公钥指数吗? 另外,我是否可以仅用这两个参数获得私钥的编码形式?我在java中尝试了以下方法(java不是实际的请求),但是支持它的OpenSSL引擎失败,错误为:04000090:RSA例程:openSSL_internal