如何将BCrypt用于RSA(非对称加密)

罗伯托·卡洛斯

我正在尝试使用BCrypt进行加密和解密的简单工作示例,但是由于我不完全了解该方法,因此我无法使其工作。BCryptEncrypt函数,Microsoft Docs

NTSTATUS BCryptEncrypt(
  BCRYPT_KEY_HANDLE hKey,
  PUCHAR            pbInput,
  ULONG             cbInput,
  VOID              *pPaddingInfo,
  PUCHAR            pbIV,
  ULONG             cbIV,
  PUCHAR            pbOutput,
  ULONG             cbOutput,
  ULONG             *pcbResult,
  ULONG             dwFlags
);

我在8gwifi.org上生成了一个简单的512位密钥对

string Public_Key = "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJSNbUhCkU9RuY99L8kC2WRJ8TBES3WX1u9wYlANvUFU/h7lU8VNOWI8dNGCQ6UbK2ypHFom+Zm4BaG1zokwcUkCAwEAAQ==";
string Private_Key = "MIIBOgIBAAJBAJSNbUhCkU9RuY99L8kC2WRJ8TBES3WX1u9wYlANvUFU/h7lU8VNOWI8dNGCQ6UbK2ypHFom+Zm4BaG1zokwcUkCAwEAAQJAZ9bwZAl8L5jt//o/E+C0+2Cggt/Ka5nG+bpyTok8GNTyaG+Prmz/QCYdI3VuYdONdfAPm3jLwtbK9wTt1E8HAQIhAM8jg1nwjN9+nhPyFo0F+2o8y47mq1kHnCn+gqAdW8MhAiEAt5gQcCqX2Y5KbmMoqtQ+4RIEHQ8HD+fyGqxWUhVpESkCIEtylQJqgvVZCj0bnakqN6Q/lqlrTZg1FGWbZXrqlqThAiEAilt5v94Jc7Ws2AW4Rw0OmfVGzlNd4hnNNVa88r0Z4gkCIGfFy2H8pGxHxg1GKE2mSZAfpRMyjqeq119S3t/bhqY2";
string Encrypt_Me = "Hello World";

老实说,我不完全了解如何在这种情况下使用此功能,我尝试搜索一个简单的示例,但找不到任何示例。

谢谢。

吴德瑞-MSFT

这里有一个示例:https : //social.msdn.microsoft.com/Forums/windowsdesktop/en-US/007a0e26-7fc0-4079-9b63-2ad23f866836/bug-in-rsa-encryptiondecryption-using-cng?forum= Windows SDK

请注意,加密数据的第一个字节不得超过0xb6。并且在帖子中有详细的解释。

以加密为例,首先,用于BCryptOpenAlgorithmProvider加载和初始化指定RSA的CNG提供程序。

#define NT_SUCCESS(Status)          (((NTSTATUS)(Status)) >= 0)
status = BCryptOpenAlgorithmProvider(&hAlgorithm,
    BCRYPT_RSA_ALGORITHM,
    NULL,
    0);
if (!NT_SUCCESS(status)) {
    printf("Failed to get algorithm provider..status : %08x\n", status);
    goto cleanup;
}

然后, BCryptImportKeyPair

status = BCryptImportKeyPair(hAlgorithm,
    NULL,
    BCRYPT_RSAPUBLIC_BLOB,
    &hKey,
    PublicKey,
    PublicKeySize,
    BCRYPT_NO_KEY_VALIDATION);
if (!NT_SUCCESS(status)) {
    printf("Failed to import Private key..status : %08x\n", status);
    goto cleanup;
}

要获取加密的缓冲区大小:

status = BCryptEncrypt(hKey,
    InputData,
    InputDataSize,
    NULL,
    NULL,
    0,
    NULL,
    0,
    &EncryptedBufferSize,
    0
);
if (!NT_SUCCESS(status)) {
    printf("Failed to get required size of buffer..status : %08x\n", status);
    goto cleanup;
}

encryptedBuffer = (PUCHAR)HeapAlloc(GetProcessHeap(), 0, encryptedBufferSize);
if (encryptedBuffer == NULL) {
    printf("failed to allocate memory for blindedFEKBuffer\n");
    goto cleanup;
}

加密数据:

status = BCryptEncrypt(hKey,
    InputData,
    InputDataSize,
    NULL,
    NULL,
    0,
    encryptedBuffer,
    encryptedBufferSize,
    &encryptedBufferSize,
    0
);

if (!NT_SUCCESS(status)) {
    printf("Failed encrypt data..status : %08x\n", status);
    goto cleanup;
}
cleanup:
if (hKey)
    BCryptDestroyKey(hKey);
if (hAlgorithm)
    BCryptCloseAlgorithmProvider(hAlgorithm, 0);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

非对称Android RSA加密-.NET

来自分类Dev

静态非对称加密

来自分类Dev

非对称加密

来自分类Dev

如何确定OpenPGP加密是对称还是非对称?

来自分类Dev

Jasypt和非对称加密

来自分类Dev

JWT使用非对称加密

来自分类Dev

如何在Java中以非对称加密生成密钥对?

来自分类Dev

如何将非对称错误栏添加到Pandas分组条形图中?

来自分类Dev

HTTPS使用非对称或对称加密?

来自分类Dev

使用nodeJS和Objective-C的非对称公钥/私钥加密RSA

来自分类Dev

使用nodeJS和Objective-C的非对称公钥/私钥加密RSA

来自分类Dev

RSA 和非对称加密上下文中的证书是什么?

来自分类Dev

使用KeyCzar的Android非对称加密

来自分类Dev

使用KeyCzar的Android非对称加密

来自分类Dev

本地模式下的非对称加密?

来自分类Dev

android中的RSA/非对称解密

来自分类Dev

SSH何时使用非对称和对称加密?

来自分类常见问题

如何通过套接字正确地非对称加密和解密

来自分类Dev

如何在非对称加密(libsodium)中使用随机数?

来自分类Dev

如何不依靠已安装的密钥环等在命令行上进行非对称加密?

来自分类Dev

多于两个收件人的非对称加密?

来自分类Dev

我可以对 AWS KMS 使用非对称加密吗?

来自分类Dev

C 上信封的 EVP 非对称加密和解密

来自分类Dev

如何删除numpy数组中的非对称对?

来自分类Dev

如何生成用于RSA / AES加密的密码

来自分类Dev

如何找出用于PGP加密(使用GPG)的对称加密算法?

来自分类Dev

将非对称向量列表转换为矩阵

来自分类Dev

将非对称矩阵转换为方矩阵

来自分类Dev

将非对称向量列表转换为矩阵