c# - 从密码构建私有(private) CngKey(ECDH_P384)

标签 c# encryption cng

上下文: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/

相关文章:

c# - 排序字典和列表 <>() 在 VS 2010 中有错误

c# - 如何临时禁用/关闭 ReSharper 2016?

c# - 有没有办法在Excel中找到一个范围内的范围?

encryption - 对于紧急情况 : share part of pass with 4 people, 可解密 2 人

c# - 导入 RSA CngKey 并存储在 MicrosoftSoftwareKeyStorageProvider 中

c# - 欧拉 1,代码不起作用

java - 嵌入式数据库和加密

c++ - XOR 加密问题......完全初学者

c# - 从其他地方导入公钥到 CngKey?

sql-server - EKM 是否与 CNG key 存储提供商合作?