【问题标题】:How to import a Public Key into RSA For decryption如何将公钥导入 RSA 进行解密
【发布时间】:2013-04-03 11:09:52
【问题描述】:

这似乎是一个愚蠢的问题,但我一直在寻找过去一个半小时。我有一条使用 RSA 密钥对的 PRIVATE KEY 加密的消息。我有我需要用来解密消息的公钥。我一直在寻找将公钥导入 RSACryptoProvider 的方法,但似乎找不到方法。我只是有一个 BigInteger 对象作为模数和指数(构成一个公钥)。我似乎找不到让它解密任何东西的方法。我试过了

System.Security.Cryptography.RSACryptoServiceProvider rsa = new System.Security.Cryptography.RSACryptoServiceProvider();
rsa.ImportParameters(new System.Security.Cryptography.RSAParameters { Exponent = BitConverter.GetBytes(12345), Modulus = BigInteger.Parse("HEX of public key", System.Globalization.NumberStyles.HexNumber).ToByteArray() });
_session.EncryptionKey = rsa.Decrypt(_session.EncryptionKey, false);

所有这一切都是抛出一个 CryptographicException 说没有密钥集。我需要标记一些东西,让它知道我想使用公钥解密吗?

【问题讨论】:

  • 您确定该邮件是用私钥加密的吗?如果只使用私钥句柄进行加密,高级 RSA 实现将使用相应的公钥进行此操作。
  • 是的。使用私钥进行加密是为了使只有拥有私钥的一方才能为客户端生成密钥,因为公钥在客户端中是硬编码的。它是一种验证。

标签: c# encryption cryptography rsa public-key-encryption


【解决方案1】:

所有这一切都是抛出一个 CryptographicException 说没有密钥集。我需要标记一些东西,让它知道我想使用公钥解密吗?

没有。高中级密码库不支持私钥加密、公钥解密等异常操作。如果需要,您需要使用数学原语来实现 RSA。

也许,您需要一个数字签名机制来代替?

【讨论】:

    【解决方案2】:

    大多数人不使用公钥解密,因为使用公钥定义的“解密”只是使用公钥验证签名的一个组成部分。因此 RSACryptoServiceProvider 只是做验证哈希,并用公钥加密。

    您包含_session.EncryptionKey 的示例代码表明您正在尝试实现hybrid cryptosystem。如果您正在实施的这个密码系统使用 public 密钥进行解密,那么您就没有任何秘密。

    我编写了一个谷歌高级加密框架 keyczar 的 C# 实现,它包含一个易于使用的hybrid crypto

    【讨论】:

    • RSA 的重点是确认生成 EncryptionKey 的人的身份。我们一直在遭受中间人攻击,使用 Private 进行加密的全部目的是确保没有其他第三方可以生成和加密他们自己的密钥,因为公钥在客户端是硬编码的。
    • @jduncantor 如果 EncryptionKey 是对称密钥,那么您正在做的事情并不能阻止中间人攻击。
    • 怎么样?我使用 Diffie-Hellman 作为密钥交换方法。他发送给爱丽丝的服务器密钥是从随机秘密生成的,用服务器私钥加密并发送给客户端。然后,客户端使用公钥对其进行解密,并执行正常的 diffie-hellman 方程以获取共享密钥。 Mallet(中间人)无法生成要发送给 Alice 的密钥,因为他不知道私钥而无法对其进行加密,因此当 Alice 尝试使用公钥对其进行解密时,会返回不正确的密钥。
    • @jduncanator 看起来您并没有对密钥进行双重加密,但是如果您一直遭受中间人攻击,仅保护密钥交换可能是不够的,您只是更难的是,对称密文确实需要真实性。
    • @jduncanator 如果您不对密文进行身份验证,它们可能会被伪造,这会使您面临多种攻击媒介。而且由于您损坏的协议已经受到攻击,您确实应该正确修复它,甚至更好地切换到众所周知的协议/实现。
    【解决方案3】:

    根据 Pavel 的回答,我们决定最好自己计算。我们最终得到了

    var encryptionKey = new BigInteger(_session.EncryptionKey);
    var result = encryptionKey.modPow(12345, BigInteger.Parse("HEX of public key", System.Globalization.NumberStyles.HexNumber).ToByteArray());
    _session.EncryptionKey = result.ToByteArray();
    

    (中间有一些未填充但与问题无关,我省略了它)

    感谢所有答案:)

    【讨论】:

      猜你喜欢
      • 2012-05-07
      • 2023-01-17
      • 1970-01-01
      • 1970-01-01
      • 2011-08-16
      • 1970-01-01
      • 2011-12-28
      • 2017-10-18
      • 2018-12-10
      相关资源
      最近更新 更多