有没有办法在C#中执行私钥加密?
我知道标准的System.Security.Cryptography
中的RSACryptoServiceProvider
,但这些类仅提供公钥加密和私钥解密。此外,它们提供数字签名功能,该功能内部使用私钥加密,但没有任何公开可访问的函数来执行私钥加密和公钥解密。
我找到了this article on codeproject,这是执行此类加密的非常好的起点,但是,我正在寻找一些现成的代码,因为文章中的代码几乎无法加密包含随机值(即任何值,包括零)的任意长字节数组。
您知道一些好的组件(最好是免费的)来执行私钥加密吗?
我使用.NET 3.5
。
注意:我知道使用非对称加密(使用私钥加密和使用公钥解密)通常被认为是不好的方式,但我只需要以这种方式使用它。
额外说明
假设你有
var bytes = new byte[30] { /* ... */ };
如果您想使用 2048位RSA
来确保没有人更改了这个数组中的任何内容。
通常,您会使用数字签名(即 RIPEMD160
),然后将其附加到原始字节并发送给接收者。
因此,您有 30个字节 的原始数据和 额外的256个字节 的数字签名(因为它是 2048位RSA
),总共是 286个字节。但是,其中只有 256个字节 中的 160位 实际上是哈希值,因此还有 1888位(236个字节)未使用。
所以,我的想法是:
取出 30个字节 的原始数据,将哈希值(20个字节)附加到其中,现在加密这些 50个字节。您将得到一个长度为 256个字节 的消息,比 286个字节 短得多,因为“您能够将实际数据推入数字签名中”。
ECDSA 资源
[MSDN](https://learn.microsoft.com/en-us/dotnet/api/system.security.cryptography.ecdsacng?view=net-7.0) [Eggheadcafe.com](http://www.eggheadcafe.com/software/aspnet/31670677/ecdsacng-elliptic-curve-c.aspx) [c-plusplus.de](https://www-c--plusplus-net.translate.goog/forum/topic/205305/ecdsa-private-key-exportieren?_x_tr_sl=de&_x_tr_tl=en&_x_tr_hl=en) [MSDN Blog](https://learn.microsoft.com/en-us/archive/blogs/shawnfa/elliptic-curve-dsa) [Wiki](https://en.wikipedia.org/wiki/Elliptic_Curve_DSA)DSA 资源
CodeProject
MSDN 1
MSDN 2
MSDN 3
最终解决方案
如果有人对我是如何解决这个问题感兴趣,我将使用1024位DSA
和 SHA1
,这在许多不同版本的Windows(Windows 2000
及更高版本)上得到广泛支持,安全性足够好(我不签署订单,我只需要确保某些孩子无法破解他的iPhone上的签名(:-D)),而签名大小仅为40字节。