上下文:VS 2015 winforms、Windows 7,使用 SecurityDriven Inferno 库。
我正在编写一个离线应用程序,它生成加密文件作为电子邮件附件发送(因此不在客户端服务器上下文中使用)。这些文件首先使用 Inferno(ETM_Transform) 进行加密,然后与另一个文件一起发送(有时是为了重置密码),处理 DHM key 交换。
每个用户的公钥存储在由应用程序创建和保存的数据表中,允许在 key 交换过程中快速访问。然而,对于私钥,我的问题是用户(包括我自己)更愿意从密码短语重新创建私钥,从而无需隐藏 key ,从而提高安全性和可移植性。因此,我需要根据存储的公钥和散列密码构建一个 key 。
这是一种合理的方法,还是针对特定环境有更好的方法?
这是一个非常短的代码示例,它抛出异常:“不支持请求的操作”。我应该如何继续将数据导入到 key 中?
internal static void CreateKey(string passPhrase)
{
byte[] keyType = new byte[] { 0x45, 0x43, 0x4B, 0x34 };
byte[] keyLength = new byte[] { 0x30, 0x0, 0x0, 0x0 };
CryptoRandom cr = new CryptoRandom(); // rng used for this example
byte[] prKey = cr.NextBytes(48); // salt+hash passphrase and pass it to the private key part
byte[] pbKey = cr.NextBytes(96); // the public part, if I understand the format correctly for a cngkey using ECDH_P384
byte[] blob = Utils.Combine(keyType, keyLength); // same as concat
blob = Utils.Combine(blob, pbKey, prKey);
CngKey key = CngKey.Import(blob, CngKeyBlobFormat.EccPrivateBlob);
}
最佳答案
您不能随机生成公钥。公钥是根据私钥(和曲线)计算出来的,您可能会收到一个错误:a) 公钥 X 与私钥的预期不匹配,b) Y 坐标对于给定 X 坐标。
您需要根据您选择的私钥计算公钥的值。据我所知,.Net 和 Windows CNG 都没有公开该功能。
关于c# - 从密码构建私有(private) CngKey(ECDH_P384),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40812124/