通过windows cng api 实现rsa非对称加密

参考:

1,使用 CNG 加密数据 - Win32 apps | Microsoft Learn

2,不记得了

  (下文通过cng api演示rsa加密,不做原理性介绍)   

      相对于aes等对称加密算法,rsa加密算法不可逆性更强。非对称加密在通常情况下,使用公钥对数据进行加密之后,如果没有私钥,基本是不可能实现解密的。在一些勒索程序中,非对称加密会经常出现;这里算是填个坑吧。

     下面代码实现:

      1,rsa加密

      2,公钥/私钥导出

#define RsaKeyLen 2048HRESULT bthr(BOOL b)
{return b ? S_OK : HRESULT_FROM_WIN32(GetLastError());
}//确实不需要直接从 BCryptExportKey 或 NCryptExportKey 进行 base64 编码输出,但需要执行额外的步骤 :
//
//使用 BCryptExportKey(或 NCryptExportKey) BCRYPT_RSAFULLPRIVATE_BLOB(但不是 BCRYPT_RSAPRIVATE_BLOB)或 BCRYPT_RSAPUBLIC_BLOB
//对生成的 BCRYPT_RSAKEY_BLOB 进行编码 CNG_RSA_PRIVATE_KEY_BLOB 或 CNG_RSA_PUBLIC_KEY_BLOB 并放入 CRYPT_PRIVATE_KEY_INFO
//使用 PKCS_PRIVATE_KEY_INFO 对 CRYPT_PRIVATE_KEY_INFO 进行编码 >
//调用CryptBinaryToStringAHRESULT ExportToPem(_In_ BCRYPT_KEY_HANDLE hKey, BOOL bPrivate, _Out_ PSTR* ppsz, _Out_ PULONG pcch)
{HRESULT hr;CRYPT_PRIVATE_KEY_INFO PrivateKeyInfo = { 0, {const_cast<PSTR>(szOID_RSA_RSA)} };CERT_PUBLIC_KEY_INFO   PublicKeyInfo = { {const_cast<PSTR>(szOID_RSA_RSA)} };ULONG cbKey = 0;PUCHAR pbKey = 0;//really PBCRYPT_RSAKEY_BLOBPCWSTR pszBlobType;PCSTR lpszStructType;if (bPrivate){pszBlobType = BCRYPT_RSAFULLPRIVATE_BLOB;lpszStructType = CNG_RSA_PRIVATE_KEY_BLOB;}else{pszBlobType = BCRYPT_RSAPUBLIC_BLOB;lpszStructType = CNG_RSA_PUBLIC_KEY_BLOB;}while (0 <= (hr = BCryptExportKey(hKey, 0, pszBlobType, pbKey, cbKey, &cbKey, 0))){if (pbKey){if (bPrivate){if (0 <= (hr = bthr(CryptEncodeObjectEx(X509_ASN_ENCODING,lpszStructType,pbKey, CRYPT_ENCODE_ALLOC_FLAG, 0,&PrivateKeyInfo.PrivateKey.pbData,&PrivateKeyInfo.PrivateKey.cbData)))){hr = bthr(CryptEncodeObjectEx(X509_ASN_ENCODING, PKCS_PRIVATE_KEY_INFO,&PrivateKeyInfo, CRYPT_ENCODE_ALLOC_FLAG,0,&pbKey, &cbKey));LocalFree(PrivateKeyInfo.PrivateKey.pbData);}}else{//public keyif (0 <= (hr = bthr(CryptEncodeObjectEx(X509_ASN_ENCODING,lpszStructType, pbKey, CRYPT_ENCODE_ALLOC_FLAG, 0,&PublicKeyInfo.PublicKey.pbData,&PublicKeyInfo.PublicKey.cbData)))){hr = bthr(CryptEncodeObjectEx(X509_ASN_ENCODING,X509_PUBLIC_KEY_INFO,&PublicKeyInfo, CRYPT_ENCODE_ALLOC_FLAG, 0,&pbKey, &cbKey));LocalFree(PublicKeyInfo.PublicKey.pbData);}}if (0 <= hr){PSTR psz = 0;ULONG cch = 0;while (0 <= (hr = bthr(CryptBinaryToStringA(pbKey,cbKey,CRYPT_STRING_BASE64HEADER, //CRYPT_STRING_BASE64HEADER without the "---------BEGIN CERTIFICATE---------"psz,&cch)))){if (psz){*ppsz = psz, * pcch = cch;break;}if (!(psz = (PSTR)LocalAlloc(0, cch))){hr = HRESULT_FROM_WIN32(GetLastError());break;}}LocalFree(pbKey);}break;}pbKey = (PUCHAR)malloc(cbKey);}return hr;
}BOOL DecryptAnd(BCRYPT_KEY_HANDLE hKey, PUCHAR pbData, ULONG cbData)
{UCHAR buf[0x1000] = { 0 };ULONG pbcResult = 0;NTSTATUS status = 0;if (!NT_SUCCESS(BCryptDecrypt(hKey,pbData,cbData,NULL,NULL,0,buf,0x1000,&pbcResult,BCRYPT_PAD_PKCS1))){wprintf(L"BCryptDecrypt fail,error:%d\n", GetLastError());goto end;}//print cipher textPrintBytes(buf, pbcResult);end:return status == 0 ? TRUE : FALSE;
}BOOL EncryptAnd(BCRYPT_KEY_HANDLE hKey, PUCHAR pbData, ULONG cbData)
{UCHAR buf[0x1000] = { 0 };ULONG pbcResult = 0;NTSTATUS status = 0;printf("plain text length:%d\n", cbData);if (!NT_SUCCESS(BCryptEncrypt(hKey,pbData,cbData,NULL,NULL,0,buf,0x1000,&pbcResult,BCRYPT_PAD_PKCS1))){wprintf(L"BCryptEncrypt fail,error:%d\n", GetLastError());goto end;}//print cipher textprintf("cipher text length:%d\n", pbcResult);PrintBytes(buf, pbcResult);printf("begin to decrypt \n");//begin to decryptDecryptAnd(hKey, buf, pbcResult);end:return status == 0 ? TRUE : FALSE;
}void UnsymmetricEncrypt()
{NTSTATUS status =0;BCRYPT_ALG_HANDLE hAlgRsa=NULL;BCRYPT_KEY_HANDLE hRsaKey=NULL;DWORD rsaPublicKeyLen = (RsaKeyLen) * 2;UCHAR rsaPublicKey[(RsaKeyLen) * 2] = { 0 };UCHAR rsaPrivateKey[(RsaKeyLen) * 2] = { 0 };ULONG cbResult = 0;PSTR PublicKey = NULL;PSTR PrivateKey = NULL;UCHAR plainText[0x20] = "abcdefghijklm";//opne rsa algorithm providerif (!NT_SUCCESS(status = BCryptOpenAlgorithmProvider(&hAlgRsa,BCRYPT_RSA_ALGORITHM,NULL,0))){wprintf(L"BCryptOpenAlgorithmProvider fail,error:%d\n", GetLastError());goto end;}//generate key pair if (!NT_SUCCESS(status = BCryptGenerateKeyPair(hAlgRsa,&hRsaKey,RsaKeyLen,0))){wprintf(L"BCryptGenerateKeyPair fail,error:%d\n", GetLastError());goto end;}//finalizeif (!NT_SUCCESS(status = BCryptFinalizeKeyPair(hRsaKey,0))){wprintf(L"BCryptFinalizeKeyPair fail,error:%d\n",GetLastError());goto end;}//encrypt and decryptEncryptAnd(hRsaKey, plainText, 13);printf("\n");if (!NT_SUCCESS(status = BCryptExportKey(hRsaKey,NULL,BCRYPT_RSAPUBLIC_BLOB,rsaPublicKey,rsaPublicKeyLen,&cbResult,0))){wprintf(L"BCryptExportKey fail,error:%d\n", GetLastError());goto end;}else{//printf public key//0x52, 0x53, 0x41, 0x31, 0x00, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00,//0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0xb4, 0x7a, 0xb0, 0x43, 0xee,//0x48, 0xbf, 0x53, 0x05, 0x60, 0xe3, 0x0e, 0xd9, 0xe2, 0x52, 0xa3, 0xb2, 0xef, 0x08, 0x20, 0xef,//0xe4, 0x39, 0x40, 0xb7, 0xf9, 0xf3, 0x72, 0xe5, 0xf7, 0x3c, 0x25, 0x7e, 0x88, 0xe8, 0xe8, 0x9a,//0x13, 0x67, 0xca, 0x5d, 0x45, 0xd6, 0x33, 0x6f, 0x9d, 0xda, 0xcc, 0xae, 0x07, 0x44, 0x2c, 0x11,//0x5c, 0x82, 0xdf, 0xe9, 0x87, 0xd9, 0xf0, 0xcd, 0xb7, 0xb2, 0xc1,printf("rsa public key blob:\n");PrintBytes(rsaPublicKey, cbResult);//if (S_OK != ExportToPem(//    hRsaKey,//    TRUE,//    &PrivateKey,//    &cbResult))//{//    wprintf(L"ExportToPem PrivateKey fail!\n");//    goto end;//}if (S_OK != ExportToPem(hRsaKey,FALSE,&PublicKey,&cbResult)){wprintf(L"ExportToPem PrivateKey fail!\n");goto end;}printf("\npublic key in pem:\n%s\n", PublicKey);//printf("private key in pem:\n%s\n", PrivateKey);}wprintf(L"\n UnsymmetricEncrypt success!\n");
end:if (hAlgRsa){BCryptCloseAlgorithmProvider(hAlgRsa, 0);}if (hRsaKey){BCryptDestroyKey(hRsaKey);}
}

运行结果如下图:

第一次运行

                                                                  第二次运行

通过运行结果可以看出,调用系统cng api 每次生成的密钥对都不一样,这就很ok。从表面上来看,非对称加密算法比对称加密算法多一个密钥,这就更安全一点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/295863.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

异步消息原理

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 在日常开发中&#xff…

短链接技术解析:链接的简化之道

文章目录 前言起源实现原理常见短链接生成算法哈希算法自增计数随机生成基于关键字的生成 短链接的作用字符空间节省美化和简化个性化定制 实现一个简单的短链接服务个人简介 前言 大家在短信中是不是经常看到下面的短连接&#xff0c;简短易记&#xff1a; 看到这个时你是不是…

Python零基础教程5.0——无限画图下装逼

正方形的脸让我迷糊 引言开整完整代码1效果1完整代码2效果2完整代码3效果3 结尾 引言 哈哈&#xff0c;真巧 今天周末 有趣的人已经开始HAPPY 我只能码代码&#xff0c;写教程 不过&#xff0c;锻炼使我快乐&#xff01; 少年的苦&#xff0c;中年的甘&#xff0c;老年的甜 …

Mybatis-TypeHandler类型转换器

文章目录 TypeHandler 接口TypeHandler 注册TypeHandler 查询别名管理总结 TypeHandler 接口 TypeHandler 这个接口 就是Mybatis的类型转换器 /*** author Clinton Begin*/ public interface TypeHandler<T> {// 在通过PreparedStatement为SQL语句绑定参数时&#xff0…

智能优化算法应用:基于鹈鹕算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于鹈鹕算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于鹈鹕算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.鹈鹕算法4.实验参数设定5.算法结果6.参考文献7.MA…

80x86汇编—汇编程序基本框架

文章目录 First Program指令系统伪指令数值表达式 程序框架解释int 21 中断 通过一个基本框架解释各个指令和用处&#xff0c;方便复习。所以我认为最好的学习顺序就是先看一段完整的汇编代码程序&#xff0c;然后给你逐个逐个的解释每一个代码是干嘛用的。然后剩下的还有很多指…

LTE之接口协议

一、接口协议栈 接口是指不同网元之间的信息交互方式。既然是信息交互&#xff0c;就应该使用彼此都能看懂的语言&#xff0c;这就是接口协议。接口协议的架构称为协议栈。根据接口所处位置分为空中接口和地面接口&#xff0c;响应的协议也分为空中接口协议和地面接口协议。空…

反序列化漏洞原理、成因、危害、攻击、防护、修复方法

反序列化漏洞是一种安全漏洞&#xff0c;它允许攻击者将恶意代码注入到应用程序中。这种漏洞通常发生在应用程序从不安全的来源反序列化数据时。当应用程序反序列化数据时&#xff0c;它将数据从一种格式&#xff08;例如JSON或XML&#xff09;转换为另一种格式&#xff08;例如…

信号与线性系统翻转课堂笔记7——信号正交与傅里叶级数

信号与线性系统翻转课堂笔记7——信号正交与傅里叶级数 The Flipped Classroom7 of Signals and Linear Systems 对应教材&#xff1a;《信号与线性系统分析&#xff08;第五版&#xff09;》高等教育出版社&#xff0c;吴大正著 一、要点 &#xff08;1&#xff0c;重点&a…

Java经典面试题——手写快速排序和归并排序

题目链接&#xff1a;https://www.luogu.com.cn/problem/P1177 输入模板&#xff1a; 5 4 2 4 5 1快速排序 技巧&#xff1a;交换数组中的两个位置 a[l] a[l] a[r] - (a[r] a[l]); 稳定不稳定&#xff1f;:不稳定 注意找哨兵那里内循环的等于号不能漏&#xff0c;不然…

Linux 基础指令三

一、cat命令 默认是顺序查看&#xff0c;可同时查看多个文件&#xff0c;只能看普通文件&#xff0c;不能看文件以外 使用格式: cat [选项] 文件名 常用选项 -n显示行号-b跳过空白行编号-s将所有的连续的多个空行替换为一个空行&#xff08;压缩成一个空行&#xff0…

LabVIEW在横向辅助驾驶系统开发中的应用

LabVIEW在横向辅助驾驶系统开发中的应用 随着横向辅助驾驶技术的快速发展&#xff0c;越来越多的研究致力于提高该系统的效率和安全性。项目针对先进驾驶辅助系统&#xff08;ADAS&#xff09;中的横向辅助驾驶进行深入研究。在这项研究中&#xff0c;LabVIEW作为一个强大的系…