【问题标题】:Simple rsa encryption/decryption in .NET?.NET 中的简单 rsa 加密/解密?
【发布时间】:2011-07-06 07:34:50
【问题描述】:

我想生成一对密钥,然后输入如下内容:

Rsa.Decrypt(data, privateKey); 
Rsa.Encrypt(data, publicKey);

有什么简单的方法可以做到这一点吗?我知道有类似 RsaCryptoServiceProvider 的东西,但它需要 XML 来创建正确的对象。我想将私钥/公钥存储为简单的字符串(不是 xml),我将把它放在 web.config 中:

<appSettings>
    <add key="MyPublicKey" value"...."/>
    <add key="MyrivateKey" value"...."/>
</appSettings>

稍后我将加密 web.config,这样一切都会安全(IIS 会处理它)。可以这样吗?

【问题讨论】:

  • 不要使用 RSA 加密任意数据。 RSA非常脆弱,需要以正确的方式使用正确的填充等。要加密任意数据,您应该使用 RSA 和块密码的组合。
  • 两个问题立即浮现在脑海:首先,您打算如何将公钥安全地传递给消息接收者?请记住,公钥加密仅与密钥管理系统一样安全。其次,将 private 密钥放入像 web.config 这样的知名文件中是不是非常危险?我会将我的私钥存储在专门为敏感数据存储而设计的系统中,而不仅仅是将其填充到 web.config 中。
  • @CodeInChaos:换句话说,使用众所周知的标准,例如 Cryptographic Message Syntax 或 PGP(对于 .net,CMS 可能得到更好的支持)。 @Eric:至于私钥,如果 web.config 得到很好的保护(而且我认为大多数客户不应该访问它),那么它和任何地方一样好。如果您将其存储在安全的地方,则可以防止复制,但无论如何您都需要从自动化系统访问它,那么您将访问密钥/密码存储在哪里? (对于非常安全的系统,您当然可以使用 HSM 或 TPM)。

标签: c# .net encryption rsa


【解决方案1】:

使用您的首选密钥大小(512 / 1024 / 2048...)创建一个 RSACryptoServiceProvider 对象:

int keySize = 1024;
m_ServiceProvider = new RSACryptoServiceProvider(keySize);

或者使用默认大小:

m_ServiceProvider = new RSACryptoServiceProvider();

然后使用 ExportParameters 在字节数组中获取您需要的内容,例如获取公钥使用的 Modulus 部分:

byte[] publicModulus = m_ServiceProvider.ExportParameters(true).Modulus;

我在 ExportParameters 中传递了一个真值,因为您想要访问私钥参数。

然后你只需要将字节数组转换为字符串:

string publicModulusStr = Convert.ToBase64String(modulus);

稍后,当您想从 web.config 中读取并重新创建 RSACryptoServiceProvider 对象时,请使用您存储在文件中的文本创建一个 RSAParameters 对象,然后将 RSAParameters 传递给 RSACryptoServiceProvider 构造函数。

请注意:您保存的 web.config 文件应该非常私密,因为您将私钥存储在其中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-02
    • 2011-01-29
    • 1970-01-01
    • 2011-07-04
    • 2011-08-19
    • 2011-02-06
    • 1970-01-01
    相关资源
    最近更新 更多