【问题标题】:rsacryptoserviceprovider using x509 certificates c#rsacryptoserviceprovider 使用 x509 证书 c#
【发布时间】:2010-12-10 00:57:52
【问题描述】:

我正在使用由 makecert 生成的证书,该证书具有私钥和公钥。 Java 端使用此公钥加密数据,.net 将其解密。

我正在尝试解密 Java 的加密 64 位编码字符串并获取错误数据。

为了查看.Net 端是否一切正常,我首先尝试使用公钥加密,然后使用相同的证书使用私钥解密。我的代码如下所示。

X509Certificate2 cert = GetCert(key, StoreName.My, StoreLocation.LocalMachine);
RSACryptoServiceProvider provider =  (RSACryptoServiceProvider)cert.PrivateKey;

RSACryptoServiceProvider publicprovider = (RSACryptoServiceProvider)cert.PublicKey.Key;

if (cert.HasPrivateKey)
    MessageBox.Show("Got private key");

byte[] encrypted = publicprovider.Encrypt(Encoding.UTF8.GetBytes(text), false);
byte[] decryptedBytes = provider.Decrypt(encrypted, false); 

即使在这里我也遇到了错误。我错过了什么吗?

证书看起来对公钥和私钥都有效。

【问题讨论】:

  • 什么错误?在哪一行?
  • 异常:错误数据.. 当 byte[] decryptedBytes = provider.Decrypt(encrypted, false); 时没有进一步的内部异常;被称为

标签: .net security cryptography encryption-asymmetric


【解决方案1】:

以下代码对我来说很好用:

        RSACryptoServiceProvider privateKey = new RSACryptoServiceProvider();
        privateKey.FromXmlString("<RSAKeyValue><Modulus>wL8s+C8SnnlaaqR+VsyijmxOJOARNa4o7ZNsqfy3+9J9Ol2JNSjjMfQWoUnFtClzJBlZhU5KtuazQe8ZKXTX9YvKoJdRhlsonZkC04qiTMdO/FZIH00GrCRxeQ7XDnQnvPB9Bdsvs//7zrY3f7eLIkpIyK9cQHU+5jjJd5IT0eE=</Modulus><Exponent>AQAB</Exponent><P>83xxN7jvpg5z16pxz2tIQIdqd/EfmikR9Q2TjG2tosWkUSvtyx0xHZ9EqdTUbSGZZ+jgrabzkafYc7Mplylwew==</P><Q>yqcnYSZEXHwJvRWi2V09PNEENTozQZywcFptUUGar9TciaQvoNv3lpnfzUKNBRdhzq4lImxkamajZlTWE5buUw==</Q><DP>37HqilkbwyHwB6mOGhPkM3S1ujAK6qTk3JB2iEOTjMGrru9+7maJYz+Z47Wm3ARMXgyzrpZ9m8nqsJFfmoL11Q==</DP><DQ>v285tv8kMs2FkZYfuP/oOkwkkneBNejjj68Md2bmzlThZDCyQV2pvB1tmgPVHUsiPNCrCaKlFRISJzfa5rR8Ow==</DQ><InverseQ>fgJE2TRe/SS+YqW0/I+FtHrdfbbao0/R3pHD4r4oceZQUemlBgZ7DxOAetebHKthlOdjGkmfWYB8EU4XoWggqw==</InverseQ><D>FMLCwjy3wbAKiCANp6XFAJgz1o7365NFv0k41BpvasViTa4TgFFWH2ROJ7M9g0lPqJy+YrhrHcY9mqV5TVjTheQp0JeckrgO2B39XngPMAMMdne3rWGpf0Pfbj3FLfchMk6XYDXSZzCS2CmSeRA4aBMb+4R3YurixyJLrnGRMH0=</D></RSAKeyValue>");
        RSACryptoServiceProvider publicKey = new RSACryptoServiceProvider();
        publicKey.FromXmlString("<RSAKeyValue><Modulus>wL8s+C8SnnlaaqR+VsyijmxOJOARNa4o7ZNsqfy3+9J9Ol2JNSjjMfQWoUnFtClzJBlZhU5KtuazQe8ZKXTX9YvKoJdRhlsonZkC04qiTMdO/FZIH00GrCRxeQ7XDnQnvPB9Bdsvs//7zrY3f7eLIkpIyK9cQHU+5jjJd5IT0eE=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>");

        {
            string text = "foo";
            byte[] encrypted = publicKey.Encrypt(Encoding.UTF8.GetBytes(text), false);
            byte[] decryptedBytes = privateKey.Decrypt(encrypted, false);
        }

您能否仔细检查导出的私钥是否来自 cert.PrivateKey 和公钥是否来自 cert.PublicKey.Key?

【讨论】:

  • 当证书返回时,它已经生成了 aes 对称密钥。我没有使用我们必须首先创建公钥并基于此生成提供程序的实现。这使用makecert。上面的代码没有给出错误,但是有 128 个字符模数...
  • "当证书返回时,它已经生成了 aes 对称密钥。"我真的不明白那是什么意思。 AES 密钥在哪里生成?我在您的代码示例中的任何地方都看不到它。
  • 如果您使用 makecert 工具制作证书。它里面有私钥和公钥。所以,你可以去商店获取私钥。我没有输入代码来获取私钥和​​公钥
  • 但我说的是使用 AES 对称密钥,RSA 非对称密钥对应该加密而不是直接加密文本。我意识到 makecert 工具会生成 RSA 密钥。
【解决方案2】:

我终于找到了问题所在。我没有把 makecert 的密钥定义为 RSA 加密密钥。

【讨论】:

    【解决方案3】:

    我在使用自签名证书时遇到了同样的问题,问题是我使用开关 -sky signature 而不是 -sky exchange 生成证书(您使用签名进行签名并交换加密/解密)

    这是我制作有效的完整命令:

    makecert -r -pe -a sha1 -n "CN=MyName" -ss my -sr CurrentUser -sky exchange
    

    【讨论】:

      【解决方案4】:

      当我试图查找使用 x509 证书和使用 c# 的 rsa 的 makcert 用法示例时,我偶然发现了此页面,不幸的是它只提供了部分解决方案。我将所有内容放在人们可能感兴趣的博客条目中,可以在这里找到: http://nick-howard.blogspot.com/2011/05/makecert-x509-certificates-and-rsa.html

      【讨论】:

        猜你喜欢
        • 2011-02-14
        • 2021-12-26
        • 2017-02-18
        • 1970-01-01
        • 2011-09-02
        • 2012-02-20
        • 2016-04-10
        • 2015-09-05
        • 1970-01-01
        相关资源
        最近更新 更多