小王的尴尬日常(一)--使用RSA公钥证书解密

本文讲述了在Windows环境下使用RSA公钥证书进行解密操作时遇到的问题及解决办法,包括如何打开系统证书库,选择正确的参数,以及在解密过程中遇到的错误0x8009000D的解决策略。最后提到了使用openssl的RSA_public_decrypt函数来成功解密。
摘要由CSDN通过智能技术生成

最近接了一个活,要用rsa的公钥解密,这个公钥存储在公钥证书里面,这个公钥证书呢… 安装在了windows操作系统里。以下是讲解部分,如果不想看的直接跳跃到最末尾的代码部分。
公钥–>公钥证书–>公钥证书库(Windows)
我要是使用它呢,就要反向过来:
解密<–提取公钥<–找到公钥证书<–打开公钥证书库(Windows)

当时我想这活没难度so easy, 可第一步就有点尴尬啊,先说这个公钥证书库的问题:
第一个证书库相关的函数,是CertOpenStore, 天下套路千千万,打开句柄占一半。无论是Windows还是linux这些个系统函数设计都是一个套路,遵循的树状结构。

HCERTSTORE WINAPI CertOpenStore(
__in LPCSTR lpszStoreProvider,
__in DWORD dwMsgAndCertEncodingType,
__in HCRYPTPROV_LEGACY hCryptProv,
__in DWORD dwFlags,
__in const void* pvPara
);
Instruction :The CertOpenStore function opens a certificate store by using a specified store provider type. While this function can open a certificate store for most purposes, CertOpenSystemStore is recommended to open the most common certificate stores. CertOpenStore is required for more complex options and special cases.

英文不好的兄弟自行脑补,反正就是打开一个证书库的操作句柄。
然后咱们仔细推敲一下这个函数,咱们先说第一个参数 lpszStoreProvider ,这个参数很重要,它决定了你以后的命运。

lpszStoreProvider
A pointer to a null-terminated ANSI string that specifies the store provider type.

就是选择一下你打开的证书库类型,它有很多种选择,常用的有以下几种:

CERT_STORE_PROV_MEMORY 内存里的证书库,程序里面创建用来在内存里存储证书
CERT_STORE_PROV_SYSTEM 系统里的证书库,存储在系统里面的证书库
CERT_STORE_PROV_FILENAME 文件里面的证书库,存储在文件里面的证书库
CERT_STORE_PROV_COLLECTION 证书库的集合,一般是程序里面创建用来添加其他证书库的

上面这四种是比较常用的,而我面临的情况是证书被安装在了系统里面,所以自然要用到 CERT_STORE_PROV_SYSTEM

咱们再说第二个参数 dwMsgAndCertEncodingType,这个就不仔细说了,证书编码格式,主要有以下两种:

PKCS_7_ASN_ENCODING
Specifies PKCS #7 message encoding.

X509_ASN_ENCODING
Specifies X.509 certificate encoding

第三个参数 hCryptProv
这个参数是让你选择csp,这个直接NULL就好了,默认就可以了。

第四个参数 dwFlags
这个参数,结合第一个参数的CERT_STORE_PROV_SYSTEM能打出很多种套路,我就说两个常用的:

CERT_SYSTEM_STORE_LOCAL_MACHINE 本地系统证书库
CERT_SYSTEM_STORE_CURRENT_USER 当前用户证书库

这个选择完了还不算完,我们还有第五个参数 pvPara ,这个参数我们要指定证书的类型,我们知道在Windows下面证书划分为:个人、中级证书颁发机构、受信认的根证书颁发机构、受信任的发布者、其他人。但是这第五个参数怎么填?跟以上这几个类型都无关。
这里写图片描述
这是系统证书库的注册表存储结构,路径为:
HKEY_CURRENT_USER(或HKEY_LOCAL_MACHINE)\Software\Microsoft\SystemCertificates,比如说我的是中级证书颁发机构,存储的子键名为 CA,我就把‘CA’作为第五个参数。

HCERTSTORE hSysStore = CertOpenStore(
        CERT_STORE_PROV_SYSTEM_A,        // The store provider type
        0,                               // The encoding type is
        NULL,                            // Use the default 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值