【问题标题】:How is public key used to decrypt in .NET assemblies?.NET 程序集中如何使用公钥解密?
【发布时间】:2009-03-22 15:39:52
【问题描述】:

.NET 签名的程序集包含公钥,但是公钥在 RSA 中是用来加密的,那么 .NET 是如何使用公钥来解密签名程序集的呢?

好的,签名的程序集包含散列,但散列是使用私钥而不是公钥加密的。那么,为什么以及如何在 .NET 中使用私钥进行加密,使用公钥进行解密。我的意思是,像 RSACryptoPad 这样的所有软件都使用公钥进行加密而不是解密。

【问题讨论】:

    标签: c# rsa


    【解决方案1】:

    公钥-私钥对不用于加密整个程序集。相反,它用于签署程序集。

    稍微简化一下,要对文件(例如程序集)进行签名,您可以获取文件的哈希值,然后用您的私钥对该哈希值进行加密。使用该文件的人通过自己对文件进行哈希来验证您的签名,然后使用您的公钥解密您的加密哈希并确认这两个哈希相同。这证明了两件事:

    1. 程序集来自声称来自谁 - 即您 - 因为它是使用您的私钥生成的。
    2. 该程序集未被其他人更改,因为您在发布该程序集时创建的哈希值与当前哈希值相同。没有人可以更改签名的程序集,因为他们还必须对需要您的私钥的加密哈希进行相应的更改。

    this Wikipedia article 中有更多关于数字签名的详细信息。

    公钥-私钥对的好处在于它们可以左右两边工作。所以用你的私钥加密的东西只能用你的公钥解密,但用你的公钥加密的东西也可以用你的私钥解密。后一种用法意味着如果有人想向您发送某些东西并且只有您可以使用您免费提供的公钥对其进行加密,但他们知道只有您使用您的私钥才能对其进行解密。

    由于密钥只能成对使用 - 制作 encryption asymmetric - 其他人不能简单地反转他们使用公钥完成的加密以将消息发送给您。

    【讨论】:

    • 扩展了基本问题,增加了更多查询。感谢您的回答。
    • 添加了一些关于为什么要使用公钥和私钥进行加密的说明。
    • 这是错误的——签名不是通过使用私钥加密来完成的;它是通过 /decrypting/ 完成的(至少对于 RSA)。
    • 你在签名时到底在解密什么,derobert?
    • @configurator:在 RSA 中,消息的填充散列。 en.wikipedia.org/wiki/RSA#Signing_messages 有详细信息。请记住,RSA 中的“解密”只是一个数学运算,您可以对任意数据执行它。
    【解决方案2】:

    这个想法是,签名只能创建使用 private 密钥,但之后任何拥有 public 密钥副本的人可以验证签名。 签名不需要解密-- 只需将签名添加到纯文本程序集中。

    【讨论】:

      【解决方案3】:

      签署程序集的目的是验证其来源。如果我签署了我的程序集然后将其发送给您,您应该有理由确定它来自我并且在此过程中没有被篡改。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-12
        • 1970-01-01
        • 2013-08-06
        • 1970-01-01
        • 2012-04-21
        • 1970-01-01
        • 1970-01-01
        • 2021-10-03
        相关资源
        最近更新 更多