2

上下文:VS 2015 winforms,Windows 7,使用 SecurityDriven Inferno 库。

我正在编写一个离线应用程序,它生成要作为电子邮件附件发送的加密文件(因此不在客户端-服务器上下文中使用)。这些文件首先使用 Inferno(ETM_Transform) 加密,然后与另一个文件(有时用于重置密码)一起发送,处理 DHM 密钥交换。

每个用户的公钥存储在应用程序创建和持久化的数据表中,允许在密钥交换过程中快速访问。然而,对于私钥,我的问题是用户(包括我自己)更愿意从密码短语中重新创建他们的私钥,从而无需隐藏密钥,从而提高安全性和可移植性。所以我需要从存储的公钥和散列密码短语中构建一个密钥。

这是一种合理的方法,还是对于这种特定情况有更好的方法?

这是一个抛出异常的非常简短的代码示例:“不支持请求的操作”。我应该如何继续将数据导入密钥?

    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);                        
    }
4

2 回答 2

2

您不能随机生成公钥。公钥是根据私钥(和曲线)计算得出的,您可能会收到以下错误:a) 公钥 X 与私钥的预期不匹配,b) Y 坐标对于给定 X 坐标。

您需要根据您选择的私钥计算公钥的值。据我所知,.Net 和 Windows CNG 都没有公开该功能。

于 2016-11-26T08:37:02.980 回答
1

CngKeyDHM blob 具有包含标头的特定格式 - 它不仅仅是一个随机字节数组。您缺少该标头,这就是您遇到异常的原因。很高兴你得到一个例外,因为你试图做的在概念上是错误的。ECDH_P384并非为每个随机私钥组合设计为有效/正确的私钥。您不应该手动生成 a CngKey- leaveCngKey生成​​给相应的CngKey方法。

curve25519另一方面,它被设计为任何随机私钥都是有效的。您可以查看重新发明或重新实现Minilock

于 2016-12-05T19:23:55.287 回答