RSA 私钥是不是始终包含公钥,还是只是 .NET?

Posted

技术标签:

【中文标题】RSA 私钥是不是始终包含公钥,还是只是 .NET?【英文标题】:Does RSA Private key always contain the Public key, or is it just .NET?RSA 私钥是否始终包含公钥,还是只是 .NET? 【发布时间】:2010-09-23 00:17:28 【问题描述】:

我在 .NET 2 中使用 RSACryptoServiceProvider,似乎公钥/私钥对的 Private 部分也总是包含 Public 部分。

我需要使用我的公钥加密一些信息,并允许对方只解密我加密的内容。我不希望他们知道我是如何加密我的信息的。在 .NET 中使用 RSACryptoServiceProvider 是否可行?

【问题讨论】:

【参考方案1】:

私钥始终包含公钥。

您可能真正想要的是签名。使用相同的 .NET 类,您可以使用您的私钥对数据进行签名,并使用公钥(显然不包含私钥)验证对方的签名。

    public static string Sign(string data, string privateAndPublicKey)
    
        byte[] dataBytes = Encoding.UTF8.GetBytes(data);
        RSACryptoServiceProvider provider = CreateProviderFromKey(privateAndPublicKey);
        byte[] signatureBytes = provider.SignData(dataBytes, "SHA1");
        return Convert.ToBase64String(signatureBytes);
    

    public static bool Verify(string data, string signature, string publicKey)
    
        byte[] dataBytes = Encoding.UTF8.GetBytes(data);
        byte[] signatureBytes = Convert.FromBase64String(signature);
        RSACryptoServiceProvider provider = CreateProviderFromKey(publicKey);
        return provider.VerifyData(dataBytes, "SHA1", signatureBytes);
    

    private static RSACryptoServiceProvider CreateProviderFromKey(string key)
    
        RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
        provider.FromXmlString(key);
        return provider;
    

【讨论】:

【参考方案2】:

使用方法:

对方的公钥

如果您想加密只有对方(并且没有其他人)可以解密的东西,您必须使用他们的公钥(而不是您的密钥)对其进行加密。

如果你得到了对方的签名,你可以使用对方的公钥来验证签名是否正确(而不是别人创建的)。

您自己的私钥

如果您想对某些内容进行签名,以便每个人都可以验证您创建的内容,您可以使用自己的私钥对其进行签名。您的公钥将用于验证它。内容根本没有加密(除非您单独加密)。

如果有人向您发送使用您的公钥加密的消息(这样只有您可以阅读),您可以使用您的私钥对其进行解密。

您自己的公钥

您不使用自己的公钥。对方使用它来验证您的签名,并为您的眼睛加密消息。

对方的私钥

你没有那个。

【讨论】:

【参考方案3】:

使用私钥/公钥的数据加密不是这样工作的。您必须使用其他人的公钥,以便他/她可以通过他/她的私钥解密。

尽管如此,这确实很慢,因此实际上用于加密消息的是在会话时生成的对称密钥。对称密钥是通过另一端的公钥加密的(比整个消息少得多的数据),然后附加到加密的消息中。例如 SSL 就是这样工作的。

【讨论】:

以上是关于RSA 私钥是不是始终包含公钥,还是只是 .NET?的主要内容,如果未能解决你的问题,请参考以下文章

Perl 和 .NET RSA 一起工作?从 Perl 公钥在 .NET 中加密?从 Perl 加载私钥?

转 公钥加密还是私钥加密

RSA的公钥和私钥到底哪个才是用来加密和哪个用来解密

java rsa私钥加密

python rsa模块---生成公钥和私钥的方法

RSA怎样设置公钥和私钥?