在 Windows 中使用 bcrypt 生成 curve25519 曲线密钥对

问题描述 投票:0回答:1

我有以下代码来生成 curve25519 密钥对。但是当我导出密钥时,大小与预期的密钥大小不匹配。执行上有什么问题吗?文档说明如下:

” BCRYPT_ECCPUBLIC_BLOB 导出 ECC 公钥。 pbOutput 缓冲区接收 BCRYPT_ECCKEY_BLOB 结构,紧随其后的是密钥数据。”

另外,为什么Windows中的curve25519密钥大小(基于文档)是255而不是应有的256?

以下代码的输出是:

Key size 72
Struct size 8
#include <Windows.h>
#include <iostream>
#include <bcrypt.h>


#ifndef NT_SUCCESS
#define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0)
#endif

#pragma comment (lib, "bcrypt.lib")

int main()
{
    BCRYPT_KEY_HANDLE hKey = NULL;
    BCRYPT_ALG_HANDLE alg;
    ULONG cbBuffer = 0;
    PCRYPT_PROVIDERS pBuffer = NULL;
    NTSTATUS status;
    BCRYPT_ALG_HANDLE hAlgorithm;

    
    status = BCryptOpenAlgorithmProvider(&hAlgorithm, BCRYPT_ECDH_ALGORITHM, MS_PRIMITIVE_PROVIDER, 0);
    if (!NT_SUCCESS(status))
    {
        printf("BCryptOpenAlgorithmProvider failed with code 0x%08x\n", status);
        return status;
    }
    status = BCryptSetProperty(hAlgorithm, BCRYPT_ECC_CURVE_NAME, (PUCHAR)BCRYPT_ECC_CURVE_25519, sizeof(BCRYPT_ECC_CURVE_25519),0);
    if (!NT_SUCCESS(status))
    {
        printf("BCryptSetProperty failed with code 0x%08x\n", status);

        return status;
    }
    status = BCryptGenerateKeyPair(hAlgorithm, &hKey, 255, 0);
    if (!NT_SUCCESS(status))
    {
        printf("BCryptGenerateKeyPair failed with code 0x%08x\n", status);

        return status;
    }

    status = BCryptFinalizeKeyPair(hKey, 0);
    if (!NT_SUCCESS(status))
    {
        printf("BCryptFinalizeKeyPair failed with code 0x%08x\n", status);
        return status;
    }
    PUCHAR publicKey;
    ULONG publicKeySize;

    status = BCryptExportKey(hKey, NULL,
        BCRYPT_ECCPUBLIC_BLOB, NULL, 0, &publicKeySize, 0);
    printf("Key size %lu \n", publicKeySize);
    printf("Struct size %lu \n", sizeof(BCRYPT_ECCKEY_BLOB));
    if (!NT_SUCCESS(status))
    {
        printf("BCryptExportKey failed with code 0x%08x\n", status);
        return status;
    }
c++ windows bcrypt
1个回答
0
投票

密钥大小密钥长度是一个特定值,表示决定密钥强度的值的大小。在这种情况下,对于 curve25519 实际上是 255 位(素数字段是 255^19,因此得名)。

但是,这并不意味着密钥的编码就是那个大小。这是有道理的,因为您可以通过多种方式对密钥进行编码。有了

BCRYPT_ECCKEY_BLOB
,你实际上会得到微软专有的结构(因为微软在标准化加密方面并不太关心)。

在这种情况下,它将包括:

  • 一个 4 字节魔法,其中包括特定于 ECC / Curve25519 的 4 字节魔法;
  • 4个字节决定后面结构的长度;
  • 然后是 X 和 Y 坐标,2 * 32 字节 = 64 字节。

4 + 4 + 64 是 72。

现在

sizeof
只是显示 64 位指针的大小,所以让我们忘记这件事发生了,好吗?

© www.soinside.com 2019 - 2024. All rights reserved.