1

我不是加密专家,但据我了解,3DES 是一种对称加密算法,这意味着它不使用公钥/私钥。

尽管如此,我的任务是使用公钥(特别是 .CER 文件)加密数据。如果您忽略整个对称/非对称,我应该能够将公钥中的密钥数据用作 TripleDES 密钥。但是,我很难从 .CER 文件中提取关键字节。这是目前的代码..

TripleDESCryptoServiceProvider cryptoProvider = new TripleDESCryptoServiceProvider();
X509Certificate2 cert = new X509Certificate2(@"c:\temp\whatever.cer");
cryptoProvider.Key = cert.PublicKey.Key.

我能找到的从证书中提取原始密钥字节的最简单方法是 ToXmlString(bool),然后对返回的字符串进行一些 hacky 子字符串化。然而,这看起来太老套了,我觉得我一定错过了一种更简单、更明显的方法。

我是否缺少使用 .cer 文件向 C# 3DES 加密类提供密钥数据的更简单方法,或者将其从证书 xml 字符串中破解出来真的是解决此问题的最佳方法吗?

4

5 回答 5

4

将非对称加密生成的密钥用于对称加密并不是一个好主意。没有什么可以阻止您想出一种使用公钥作为 3DES 加密密钥的方法,但最终结果将是任何有权访问公钥的人(这意味着每个人!)都将能够解密您的密文.

于 2008-09-23T14:58:14.367 回答
2

cryptoProvider.Key = cert.GetPublicKey()?

于 2008-09-23T14:53:15.250 回答
1

使用非对称加密技术加密大量数据并不是可行的方法。相反,使用对称算法加密数据并使用您的公钥加密对称密钥(和 IV)。

这个来自 MSDN 的页面确实帮助我开始使用 .Net 对称加密。

于 2008-09-23T14:53:34.190 回答
1

这里真正的问题是公钥是public。意味着免费提供,意味着它提供零安全性加密。

哎呀,这个线程上的任何人都拥有解密所有内容所需的所有信息。谷歌人也是如此。

请尽量鼓励您的用户不要使用这样的公钥数据。至少,让他们提供密码或其他更安全的块,您可以使用它们来生成一致的密钥。

还有一件事。证书密钥的大小不同。它可能可以处理丢弃密钥中的额外字节,但如果密钥恰好比 3DES 密钥所需的短,您可能会得到一个数组索引/超出范围异常。我怀疑这会发生,3DES 只需要 56 位,而证书密钥几乎总是 256 位或更大。

于 2008-09-23T15:12:42.473 回答
0

我认为您缺少的是从包含密钥字节的字符串中转换字节。

希望FromBase64String方法对您有所帮助:

byte[] keyBytes = Convert.FromBase64String(sourceString);
于 2008-09-23T14:53:16.280 回答