我有以下代码来生成 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;
}
密钥大小或密钥长度是一个特定值,表示决定密钥强度的值的大小。在这种情况下,对于 curve25519 实际上是 255 位(素数字段是 255^19,因此得名)。
但是,这并不意味着密钥的编码就是那个大小。这是有道理的,因为您可以通过多种方式对密钥进行编码。有了
BCRYPT_ECCKEY_BLOB
,你实际上会得到微软专有的结构(因为微软在标准化加密方面并不太关心)。
在这种情况下,它将包括:
4 + 4 + 64 是 72。
现在
sizeof
只是显示 64 位指针的大小,所以让我们忘记这件事发生了,好吗?