标签: wincrypt

从WinHTTP中的CRYPT_BIT_BLOB获取RSA公钥?

我正在尝试在WinHTTP中获取RSA公钥信息。到目前为止,我已经在CERT_CONTEXT结构中获得了证书信息。我可以获得加密算法和其他算法,如下所示:

PCCERT_CONTEXT cert;
DWORD certLen = sizeof(PCCERT_CONTEXT);
WinHttpQueryOption(hRequest, WINHTTP_OPTION_SERVER_CERT_CONTEXT, &cert, &certLen);
Run Code Online (Sandbox Code Playgroud)

加密算法由

LPSTR pubKeyAlgo = cert->pCertInfo->SubjectPublicKeyInfo.Algorithm.pszObjId;
Run Code Online (Sandbox Code Playgroud)

我们可能会如下获得公钥:

CRYPT_BIT_BLOB pubKey = cert->pCertInfo->SubjectPublicKeyInfo.PublicKey;
BYTE *p = pKey.pbData;
Run Code Online (Sandbox Code Playgroud)

但是根据文档,这是一种编码形式:

公钥

包含已编码的公钥的BLOB。

那么如何获得实际的RSA公钥参数(例如模数和指数)呢?

c++ encryption rsa winhttp wincrypt

6
推荐指数
1
解决办法
834
查看次数

CertGetCertificateChain 带有支持的内存存储和证书信任列表

我需要在证书链验证期间将自定义自签名根证书标记为受信任,总的来说,我希望尽可能地依赖系统 API。

我创建了一个临时内存存储。

HCERTSTORE certStore = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, 0, 0, 0);
Run Code Online (Sandbox Code Playgroud)

然后我将自定义根证书放入商店。

CertAddCertificateContextToStore(certStore, rootCertContext, CERT_STORE_ADD_REPLACE_EXISTING, 0);
Run Code Online (Sandbox Code Playgroud)

CertGetCertificateChain MSDN 文档说

hAdditionalStore 用于搜索支持证书和证书信任列表 (CTL) 的任何其他存储的句柄。

据我所知,如果我使用根证书创建 CTL 并将其放入商店,CertGetCertificateChain 将信任它。因此,我在分配的缓冲区中创建根证书 CTL 条目,然后将其复制到std::vector ctlEntries

 CertCreateCTLEntryFromCertificateContextProperties(rootCertContext, 0, nullptr, CTL_ENTRY_FROM_PROP_CHAIN_FLAG, nullptr, ctlEntry, &size);
Run Code Online (Sandbox Code Playgroud)

然后我创建 CTL 本身。

const std::wstring ctlID(L"TrustedRoots");

// I do not know what OIDs to use here. I tried different options.
std::vector<LPSTR> usageList;
usageList.push_back(szOID_SORTED_CTL);
usageList.push_back(szOID_PKIX_KP_CLIENT_AUTH);
usageList.push_back(szOID_PKIX_KP_SERVER_AUTH);

CTL_INFO ctlInfo;
ZeroMemory(&ctlInfo, sizeof(ctlInfo));
ctlInfo.dwVersion = CTL_V1;
ctlInfo.SubjectUsage.cUsageIdentifier = static_cast<DWORD>(usageList.size());
ctlInfo.SubjectUsage.rgpszUsageIdentifier = usageList.data();

ctlInfo.ListIdentifier.cbData = static_cast<DWORD>((ctlID.size() + …
Run Code Online (Sandbox Code Playgroud)

c++ winapi certificate certificate-store wincrypt

6
推荐指数
1
解决办法
542
查看次数

如何通过python从智能卡读取证书?

我有一张智能卡(实际上是 USB 令牌),上面写有一些证书和密钥。现在我需要在 Windows 上使用 python 检索此证书。如何才能实现呢?

我查看了pyscard软件包,但它似乎太低级,可能不是最简单的方法。但如果您知道这个低级答案,那么您的帮助将不胜感激。
似乎CryptAcquireContextpywin32 (win32crypt) 的函数允许我使用智能卡中的私钥进行加密,但我无法获取证书本身。

你有什么建议吗?

python smartcard pyscard wincrypt

6
推荐指数
1
解决办法
6310
查看次数

Microsoft CryptoApi - 创建由根颁发机构证书签名的新证书

我正在尝试通过临时根 CA 签署公钥/私钥对,接下来的步骤如下:

  1. 创建自签名根权限证书 ( CertCreateSelfSignCertificate)(完成
  2. 生成公钥/私钥对 ( CryptGenKey) (完成)
  3. 通过根权限证书( TODO )签署公钥/私钥对(我一直在尝试使用CertCreateSelfSignCertificate函数,但似乎这是不可能的......)

我一直在遵循下一个链接中提到的步骤: 链接

使用 powershell 工作正常,但我不知道如何使用 Microsoft CryptoApi C++ 实现它。Powershell 示例:

$testCert = New-SelfSignedCertificate -CertStoreLocation Cert:\LocalMachine\My -DnsName "SignedByRootCA" -KeyExportPolicy Exportable -KeyLength 2048 -KeyUsage DigitalSignature,KeyEncipherment -Signer $rootCert
Run Code Online (Sandbox Code Playgroud)

目前,我获得的证书没有私钥,那么如何为我的签名证书分配私钥呢?我当前的代码如下所示:

// Open the CA cert to get the issuer information and a handle to sign the cert
PCCERT_CONTEXT caCert = NULL;
CertificateStore certStore{};
certStore.Open(certStore.ROOT);
certStore.FindCertContext(tmpThumbprint, caCert);
NCRYPT_KEY_HANDLE caKey = NULL;
DWORD …
Run Code Online (Sandbox Code Playgroud)

c++ certificate cryptoapi certenroll wincrypt

5
推荐指数
0
解决办法
1007
查看次数

为什么加密文本不会改变?

我有这个程序工作,使用AES128加密一个9字节的字符串,wincrypt.h但当我更改密钥的最后一个字符时发生一些奇怪的事情:

L"3igcZhRdWq96m3GUmTAiv2"对实施例L"3igcZhRdWq96m3GUmTAiv1"L"3igcZhRdWq96m3GUmTAiv9" 加密的文本仍然是彼此相同.

#include <Windows.h>
#include <wincrypt.h>
#include <stdio.h>
#pragma comment(lib, "crypt32.lib")

#define BUFFER_SIZE 16

//params: <input file> <output file> <is decrypt mode> <key>
int wmain()
{

    wchar_t key[] = L"3igcZhRdWq96m3GUmTAiv2";
    wchar_t *key_str = key;


    size_t len = lstrlenW(key_str);


    DWORD dwStatus = 0;
    BOOL bResult = FALSE;
    wchar_t info[] = L"Microsoft Enhanced RSA and AES Cryptographic Provider";
    HCRYPTPROV hProv;

    if (!CryptAcquireContextW(&hProv, NULL, info, PROV_RSA_AES, CRYPT_VERIFYCONTEXT)) {
        dwStatus = GetLastError();
        printf("CryptAcquireContext failed: %x\n", dwStatus); …
Run Code Online (Sandbox Code Playgroud)

c encryption winapi aes wincrypt

3
推荐指数
1
解决办法
96
查看次数

CryptEncrypt不加密整个文本

我正在尝试使用wincrypt加密文本消息.然而,我的代码是不可预测的.它不加密/解密整个纯文本,而只加密/解密整个纯文本的一部分.如果我改变密码长度(例如改为"password123"),它会加密/解密不同数量的字符.这是我的代码.

#include <windows.h>
#include <wincrypt.h>
#include <stdio.h>


int main()
{
 const char* passw = "password12";
 const char* toencrypt = "consectetur adipiscing elit. In tellus nisl,   sodales non arcu quis, sagittis maximus orci cras amet.";

 HCRYPTPROV hProv;
 HCRYPTHASH hHash;
 HCRYPTKEY hKey;
 DWORD todwSize = (DWORD)strlen(toencrypt);
 PBYTE pBuffer;

 CryptAcquireContext(&hProv, NULL, MS_DEF_PROV, PROV_RSA_FULL, CRYPT_DELETEKEYSET);
 CryptAcquireContext(&hProv, NULL, MS_DEF_PROV, PROV_RSA_FULL, CRYPT_NEWKEYSET);

 CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash);
 CryptHashData(hHash, (BYTE*)passw, strlen(passw), 0);
 CryptDeriveKey(hProv, CALG_RC4, hHash, 0, &hKey);

 //--------------------------------------------------------------------

 CryptEncrypt(hKey, 0, TRUE, 0, NULL, &todwSize, todwSize);

 pBuffer = …
Run Code Online (Sandbox Code Playgroud)

c++ windows encryption cryptography wincrypt

2
推荐指数
1
解决办法
819
查看次数

使用 WinCrypt 或 CNG 验证签名文件 (PKCS7)

我需要使用 Windows 加密 API 方法验证已签名的 JAR 文件。我对加密和签名问题只有基本的了解。我也是那些加密 API(WinCrypt、Bcrypt、Ncrypt)的新手。验证文件哈希不是问题,但签名部分阻止了我。

多亏了 OpenSSL、PKCS7 RFC ( https://tools.ietf.org/html/rfc2315 ) 和各种其他来源,我才能够找出 JAR 中包含的 META-INF/LOCALSIG.DSA 的实际文件内容。但是经过两周的挖掘、反复试验,我仍然被卡住,不知道还能尝试什么。

OpenSSL 有很好的命令openssl smime -verify -inform der -in LOCALSIG.DSA -content LOCALSIG.SF -noverify,它完全符合我的要求。不幸的是,我在 Windows API 中找不到这样的高级命令。

我已经尝试使用VerifySignature来自所有三个 API 的函数系列,但是我需要为它们提供公钥,并且我没有使用任何ImportKey函数。因此,我尝试使用CryptDecodeObjectEx,手动剖析 ASN1 格式,以便将各个部分作为 BLOB 传递给 API 函数。虽然我在这方面取得了一些成功,但我再次陷入困境,因为我无法弄清楚如何解析集合。我不想从头开始编写自己的 ASN1 解析器...

那么,如何将 PKCS7 签名文件与 Windows 加密 API 一起使用?

我想使用 OpenSSL 可能会更容易,但是我必须说服我的雇主为了这个目的将 OpenSSL 添加到我们的代码库中......


更新:LOCALSIG.DSA 文件包含签名者证书和 LOCALSIG.SF 文件的签名散列。这可以使用openssl pkcs7 -inform der -print_certs -text -in LOCALSIG.DSA或进行验证openssl cms …

sign asn.1 cng wincrypt

2
推荐指数
1
解决办法
1434
查看次数