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

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

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

我可以找到从证书中提取原始密钥字节的最简单方法是ToXmlString(bool),然后对返回的字符串执行一些hacky子字符串处理。 然而,这似乎是如此的hackish我觉得我必须错过一个更简单,更明显的方法来做到这一点。

我是否错过了使用.cer文件向C#3DES加密类提供关键数据的简单方法,或者将其从证书xml字符串中删除真的是最好的方法吗?

有帮助吗?

解决方案

cryptoProvider.Key = cert.GetPublicKey()?

其他提示

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

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

来自MSDN的

此页面帮助我开始使用.Net对称加密技术。

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

哎呀,这个帖子上的任何人都拥有解密所有内容所需的所有信息。 googlers也是如此。

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

还有一件事。证书密钥大小不一。它可能可以处理丢失密钥中的额外字节,但如果密钥恰好比3DES密钥需要短,则可能会获得Array Index / Out Of Bounds异常。我怀疑这种情况会发生,3DES只需要56位,而且证书密钥几乎总是256位或更大。

我认为你缺少的是从包含key-bytes的字符串中转换字节。

希望方法 FromBase64String 会帮助您:

byte[] keyBytes = Convert.FromBase64String(sourceString);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top