我正在尝试在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公钥参数(例如模数和指数)呢?
我需要在证书链验证期间将自定义自签名根证书标记为受信任,总的来说,我希望尽可能地依赖系统 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) 我有一张智能卡(实际上是 USB 令牌),上面写有一些证书和密钥。现在我需要在 Windows 上使用 python 检索此证书。如何才能实现呢?
我查看了pyscard软件包,但它似乎太低级,可能不是最简单的方法。但如果您知道这个低级答案,那么您的帮助将不胜感激。
似乎CryptAcquireContextpywin32 (win32crypt) 的函数允许我使用智能卡中的私钥进行加密,但我无法获取证书本身。
你有什么建议吗?
我正在尝试通过临时根 CA 签署公钥/私钥对,接下来的步骤如下:
CertCreateSelfSignCertificate)(完成)CryptGenKey) (完成)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) 我有这个程序工作,使用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) 我正在尝试使用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) 我需要使用 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 …
wincrypt ×7
c++ ×4
encryption ×3
certificate ×2
winapi ×2
aes ×1
asn.1 ×1
c ×1
certenroll ×1
cng ×1
cryptoapi ×1
cryptography ×1
pyscard ×1
python ×1
rsa ×1
sign ×1
smartcard ×1
windows ×1
winhttp ×1