微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将一个X509 PEM文件加载到Windows CryptoApi中

我对整个Crypto事物是新的,所以我请求一些基本的指针。

我需要加载.PEM(X509)“—– BEGIN RSA XXX KEY —– —–结束RSA XXX KEY —–”到Windows Crypto Api上下文中使用C ++(我find了Python和.NET的例子,但他们使用特定的function,我不能涉及到普通的Windows Crypto Api)

我知道如何encryption/解密一旦我有一个HCRYPTKEY。 但是,我只是不知道如何导入.PEM文件中的Base64 blob,并得到一个HCRYPTKEY,我可以使用它。

我有这样的感觉,除了简单的调用CryptDecodeObject()之外,还有更多的东西。

Java SunPKCS11通过networking访问USBencryption令牌

Linux Crypto API和linux / crypto.h – 文档

在Linux / POSIX中,什么是Windows'rand_s的最佳替代品?

使用RSA分配/validation签名(PKCS 7)

OpenSSL使用EVP与algorithmAPI进行对称encryption

任何可以让我走上正轨的指针? 我已经失去了2天的“试错”编程,并没有取得任何进展。

CryptEncrypt不会encryption整个文本

如何使用PHPencryption大文件并通过命令解密?

通过getauxval检测Power8运行时环境和内核密码

在Windows上访问智能卡时重用Java Keystore

Windows上的PBC:CryptGenRandom()

KJKHyperion在他的回答中表示 :

我发现调用PEM格式导入RSA公钥的“魔术”序列。 干得好:

使用CryptStringToBinary将密钥解码成二进制块; 在dwFlags中传递CRYPT_STRING_BASE64HEADER

使用CryptDecodeObjectEx将二进制密钥blob解码为CERT_PUBLIC_KEY_INFO; 在dwCertEncodingType中传递X509_ASN_ENCODING,在lpszStructType中传递X509_PUBLIC_KEY_INFO

将来自CERT_PUBLIC_KEY_INFO的PublicKey blob解码成具有CryptDecodeObjectEx的RSA密钥blob; 在dwCertEncodingType中传递X509_ASN_ENCODING,在lpszStructType中传递RSA_CSP_PUBLICKEYBLOB

CryptImportKey导入RSA密钥块

这个序列确实帮助我了解发生了什么事情,但它现在不适用于我。 CryptDecodeObjectEx的第二个调用给了我一个错误:“ASN.1坏标记值满足”。 经过多次了解微软文档的尝试,我终于意识到,第一代解码器的输出不能再解码为ASN,而且它实际上已经可以导入了。 有了这个理解,我在下面的链接找到答案:

http://www.ms-news.net/f2748/problem-importing-public-key-4052577.html

以下是我自己的程序,从.pem文件导入公钥到CryptApi上下文:

int main() { char pempubKey[2048]; int readLen; char derPubKey[2048]; size_t derPubKeyLen = 2048; CERT_PUBLIC_KEY_INFO *publicKeyInfo; int publicKeyInfoLen; HANDLE hFile; HCRYPTPROV hProv = 0; HCRYPTKEY hKey = 0; /* * Read the public key cert from the file */ hFile = CreateFileA( "c:\pub.pem",GENERIC_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_norMAL,NULL ); if ( hFile == INVALID_HANDLE_VALUE ) { fprintf( stderr,"Failed to open file. error: %dn",GetLastError() ); } if ( !ReadFile( hFile,pempubKey,2048,&readLen,NULL ) ) { fprintf( stderr,"Failed to read file. error: %dn",GetLastError() ); } /* * Convert from PEM format to DER format - removes header and footer and decodes from base64 */ if ( !CryptStringToBinaryA( pempubKey,CRYPT_STRING_BASE64HEADER,derPubKey,&derPubKeyLen,"CryptStringToBinary Failed. Err: %dn",GetLastError() ); } /* * Decode from DER format to CERT_PUBLIC_KEY_INFO */ if ( !CryptDecodeObjectEx( X509_ASN_ENCODING,X509_PUBLIC_KEY_INFO,derPubKeyLen,CRYPT_ENCODE_ALLOC_FLAG,&publicKeyInfo,&publicKeyInfoLen ) ) { fprintf( stderr,"CryptDecodeObjectEx 1 Failed. Err: %pn",GetLastError() ); return -1; } /* * Acquire context */ if( !CryptAcquireContext(&hProv,PROV_RSA_FULL,CRYPT_VERIFYCONTEXT) ) { { printf( "CryptAcquireContext Failed - err=0x%x.n",GetLastError() ); return -1; } } /* * Import the public key using the context */ if ( !CryptImportPublicKeyInfo( hProv,X509_ASN_ENCODING,publicKeyInfo,&hKey ) ) { fprintf( stderr,"CryptImportPublicKeyInfo Failed. error: %dn",GetLastError() ); return -1; } LocalFree( publicKeyInfo ); /* * Now use hKey to encrypt whatever you need. */ return 0; }

我发现调用PEM格式导入RSA公钥的“魔术”序列。 干得好:

使用CryptStringToBinary将密钥解码成二进制块; 在dwFlags中传递CRYPT_STRING_BASE64HEADER

使用CryptDecodeObjectEx将二进制密钥blob解码为CERT_PUBLIC_KEY_INFO; 在dwCertEncodingType中传递X509_ASN_ENCODING,在lpszStructType中传递X509_PUBLIC_KEY_INFO

将来自CERT_PUBLIC_KEY_INFO的PublicKey blob解码成具有CryptDecodeObjectEx的RSA密钥blob; 在dwCertEncodingType中传递X509_ASN_ENCODING,在lpszStructType中传递RSA_CSP_PUBLICKEYBLOB

CryptImportKey导入RSA密钥块

我目前面临同样的困难。 我还没有完成一个解决方案的编码,但据我所知,你需要剥离—– BEGIN等—–和—– END等——标签和解码Base64 。

这给你一个DER编码的字符串,你需要解析以获得模数和公开指数。 从那些你可以填充PUBLICKEYSTRUC和RSAPUBKEY结构。 祝你好运 ;-)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐