调用CryptGetKeyParam时获取异常

时间:2010-08-03 08:53:32

标签: c# pinvoke cryptoapi

我正在尝试使用CryptoAPI(CAPI)来执行Diffie Hellman密钥交换。我正在使用MSDN文档。

        // Step 0) Acquire context
        if (!CAPI.CryptAcquireContext(ref this._cryptographicProvider, null, null, CAPI.PROV_DSS_DH, CAPI.CRYPT_VERIFYCONTEXT))
            HandleWin32Error("Unable to acquire cryptographic context");

        // Setp 1) Generate private key
        if (!CAPI.CryptGenKey(this._cryptographicProvider, CAPI.CALG_DH_EPHEM, DHKEYSIZE << 16 | CAPI.CRYPT_EXPORTABLE | CAPI.CRYPT_PREGEN, ref this._privateKeyPointer))
            HandleWin32Error("Unable to generate private cryptographic key");

        uint gSize = 0;
        CAPI.CryptGetKeyParam(this._privateKeyPointer, CAPI.KP_G, null, ref gSize, (uint)0);

        byte[] g = new byte[gSize];
        var res = CAPI.CryptGetKeyParam(this._privateKeyPointer, CAPI.KP_G, g, ref gSize, (uint)0);

第一次调用CryptGetKeyParam工作正常,即它成功返回g的大小,为64.

然后代码在最后一行失败,要么通过res = true返回g缓冲区(就像在该示例中的情况那样),或者当我使用以下调用时使用AccessViolationException:

var res = CAPI.CryptGetKeyParam(this._privateKeyPointer, CAPI.KP_G, ref g, ref gSize, (uint)0);

是的,我已经重载了P \ Invoke方法:

    [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern bool CryptGetKeyParam(IntPtr hKey, uint dwParam, ref byte[] pbData, ref uint pdwDataLen, uint dwFlags);

    [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern bool CryptGetKeyParam(IntPtr hKey, uint dwParam, byte[] pbData, ref uint pdwDataLen, uint dwFlags);

对此有何想法/想法?

*有趣的是,我设法让一个完整的Diffie Hellman Key Exchange工作,即在两方之间成功同意相同的秘密(s1)。但这是使用预定义的P和G参数。我正在重新编写代码,因为某些内容似乎不正确,因为派生的秘密对于每个密钥交换都是相同的,这意味着X是一致的。 (即Bob和Alice每次都同意s1!?) - 这里我再次遇到CryptGetKeyParam的问题,因为我在使用KP_KEYLEN时无法确定会话密钥的大小?! *

1 个答案:

答案 0 :(得分:1)

啊哈!

这是上下文标志和重载方法的组合......立即工作!

当P&amp; G未预定义,则不设置CRYPT_PREGEN标志...并且只需要两个重载方法中的一个(这一个):

[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern bool CryptGetKeyParam(IntPtr hKey, uint dwParam, byte[] pbData, ref uint pdwDataLen, uint dwFlags);
相关问题