Articles of cryptoapi

使用System.Security.Cryptography将Win32 Crypto API调用转换为C#

我被赋予了一个任务,放弃我们的产品的DLL之一,并用一个纯粹的C#replace它。 旧的DLL是.NET 2.0托pipeC ++(C ++ \ CLI),它将对Win32本地Crypto API的调用进行封装。 新的DLL应该公开一个具有相同名称和方法的新对象,但应该用C#(.NET 4.0)编写。 当然,新的DLL应该像旧的一样encryption(和解密),否则,所有保存在一个持久性存储器,如数据库或文件中的encryption密码将不会被解决! 这是本机(Win32)API调用的(伪)代码(注意input总是Unicode编码): //buffer_to_encrypt – Is the input to the following procedure and is the buffer // to be encrypted using 3DES and the below password to generate a valid 3DES key // The buffer is Unicode encoded!!! HCRYPTPROV m_provider = NULL; HCRYPTHASH m_hash = NULL; […]

从Windows证书存储导出PFX文件

我们的应用程序使用OpenSSL来保护客户端设备和服务器之间的通信。 证书由客户CA生成,我们必须将服务器证书和私钥上传到基于Windows操作系统的计算机。 到目前为止,我们指导客户在服务器文件系统的特定目录中保存包含服务器证书和私钥的PEM文件,然后从那里上传应用程序。 最近,我们被客户要求从本地Windows证书商店读取PFX证书。 我可以想到两个选项,它们结合使用CAPI库来导出WCS(根据友好名称)的PFX文件,将其序列化,然后使用OpenSSL API上传。 第一个选项将其保存为服务器文件系统上的临时文件,然后像以前一样使用OpenSSL API读取。 第二个选项使用内存,即通过指针,而不是使用临时文件。 我的团队花了很多时间在网上search(主要是堆栈溢出)并尝试代码片段,但没有find工作的解决scheme。 我明白在将文件导入WCS时,私钥应该是可导出的。 当我尝试下面的代码简单导出证书并将其保存到文件(基于MS示例代码的选项#1的前半部分)时,它只写入一个字符到文件。 我在这里错过什么? 我需要重新格式化证书吗? 任何错误的想法,什么是正确的方法来做到这一点? 私钥可以用这种方式提取吗? 预先感谢您的任何评论 //—————————————– #pragma comment(lib, "crypt32.lib") #include <stdio.h> #include <windows.h> #include <Wincrypt.h> #define MY_ENCODING_TYPE (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING) void MyHandleError(char *s); void main(void) { //——————————————————————- // Declare and initialize variables. HCERTSTORE hSystemStore; PCCERT_CONTEXT pCertContext = NULL; Char pszStoreName[256] = "root"; char […]

将一个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()之外,还有更多的东西。 任何可以让我走上正轨的指针? 我已经失去了2天的“试错”编程,并没有取得任何进展。

CryptoAPI / WinCrypt:如何在C ++中导入PEM文件中的私钥?

我试图在C ++中使用WinCrypt API 。 我的应用程序需要encryption,解密,签名和validation文件,而且我知道如何做到这一点,一旦我有正确的密钥。 但我的问题实际上是不是生成这些键的应用程序。 我拥有的是PEM格式文件中的公钥和私钥: —–BEGIN RSA PRIVATE KEY—– [Base64 encoded] —–END RSA PRIVATE KEY—– 和: —–BEGIN RSA PUBLIC KEY—– [Base64 encoded] —–END RSA PUBLIC KEY—– 经过一番研究,我发现如何导入公钥: 这里和这里 ,使用以下方法: CreateFile & ReadFile来读取文件内容 CryptStringToBinary ,使用CRYPT_STRING_BASE64HEADER将PEM格式转换为DER格式(从base64中删除页眉和页脚并解码) CryptDecodeObjectEx与X509_PUBLIC_KEY_INFO CryptImportPublicKeyInfo来导入密钥 但现在,我的问题是做私人密钥相同的事情。 任何帮助将真的非常感激:)谢谢。

RSA_public_decrypt和MS Crypto API等效

我正在尝试开发许可证validation解决scheme。 许可证使用OpenSSL的RSA_private_encrypt函数在服务器上进行编码。 对于Mac OX XI使用RSA_public_decrypt ,它的作用就像一个魅力。 在Windows上,我必须使用很less的代码,所以我不能链接到OpenSSL或其他库,我必须使用MS Crypto API。 我花了好几天的时间想弄清楚什么是错,但没有运气。 我可以成功导入公钥,但在这里我的成功结束。 我知道,我需要扭转CAPI的字节顺序,所以这可能不是问题。 我已经尝试了一切,包括CryptVerifyMessageSignatureWithKey和CryptDecodeObject以不同的参数加载blob,但仍然没有运气。 它总是以GetLastError() == CRYPT_E_ASN1_BADTAG结尾,我认为这意味着BLOB不是ASN1格式的… Google不会告诉任何有关RSA_private_encrypt的输出格式…所以我完全在这里丢失。 这里是基于OpenSSL的OS X代码: void cr_license_init(const char* lic) { __cr_license_ = lic; unsigned char lic_encoded[CR_LIC_LEN]; BIO* b64 = BIO_new(BIO_f_base64()); BIO* licIn = BIO_new_mem_buf((void*)lic, -1); licIn = BIO_push(b64, licIn); if(BIO_read(licIn, lic_encoded, CR_LIC_LEN) == CR_LIC_LEN) { const unsigned char* key_data = license_pub_der; […]