带.cer公钥的3DES?

时间:2020-03-06 14:36:12  来源:igfitidea点击:

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

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

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

我可以找到从证书中提取原始密钥字节的最简单方法是ToXmlString(bool),然后对返回的字符串进行一些修改。
但是,这似乎有点骇人听闻,我觉得我一定想念一种更简单,更明显的方法来做到这一点。

我是否缺少使用.cer文件将密钥数据提供给C3DES加密类的更简单方法,还是从证书xml字符串中删除它确实是解决此问题的最佳方法?

解决方案

cryptoProvider.Key = cert.GetPublicKey()?

我认为我们缺少的是从包含键字节的字符串中转换字节。

希望方法FromBase64String可以为我们提供帮助:

byte[] keyBytes = Convert.FromBase64String(sourceString);

用非对称密码术加密大量数据并不是要走的路。取而代之的是,使用对称算法对数据进行加密,并使用公共密钥对对称密钥(和IV)进行加密。

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

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

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

哎呀,这个线程上的任何人都拥有解密所有东西所需的全部信息。 Google员工也是如此。

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

还有一件事。证书密钥的大小各不相同。它可能可以处理掉密钥中多余的字节,但是如果密钥恰好比3DES密钥所需的短,那么我们可能会得到Array Index / Out Of Bounds异常。我怀疑这种情况是否会发生,3DES只需要56位,而证书密钥几乎总是256位或者更大。