标签: cryptoapi

提取证书中主题属性的所有值

我目前正在使用CertGetNameString提取每个主题属性的值,如下所示:

CertGetNameString(pCertificate,
                  CERT_NAME_ATTR_TYPE,
                  0,
                  szOID_ORGANIZATIONAL_UNIT_NAME,
                  buf,
                  _countof(buf));
Run Code Online (Sandbox Code Playgroud)

但是,我发现的一些证书具有组织单位名称(OU)的多个值,并且CertGetNameString只能读取第一个.例如,这是Adobe证书的主题:

CN = Adobe Systems, Incorporated
OU = Acrobat Engineering
OU = Digital ID Class 3 - Microsoft Software Validation v2
O = Adobe Systems, Incorporated
L = San Jose
S = California
C = US
Run Code Online (Sandbox Code Playgroud)

如何使用CryptoAPI读取OU(和其他)属性的所有值?

c++ windows winapi certificate cryptoapi

5
推荐指数
1
解决办法
3212
查看次数

一个进程是否有可能在没有管理特权的情况下将代码注入到另一个进程中?

CryptProtectMemoryDPAPI中的API允许您传递该CRYPTPROTECTMEMORY_SAME_PROCESS标志,从而防止其他进程解密内存。解决此问题的一种方法是使用OpenProcessWriteProcessMemoryCreateRemoteThread将代码注入目标进程并进行调用CryptUnprotectMemory,从而解密内存并将其泄漏给另一个进程。

假设两个进程都在Windows Vista或更高版本上的同一受限特权用户(即非管理员)的上下文中运行,这是否仍然可能?我给人的印象是,无论进程ACL是什么,进程内存写操作都被限制的用户拒绝,但我可能是错的。

windows security winapi dpapi cryptoapi

5
推荐指数
1
解决办法
2923
查看次数

在Windows CryptoAPI和OpenSSL x509格式之间转换

我有一个CERT_CONTEXT结构,我通过CryptoAPI从Windows上的智能卡中提取.我需要将此结构转换为与OpenSSL一致的DER编码字节数组.到目前为止,我所得到的最接近的匹配是通过CryptEncodeObject使用X509_ASN_ENCODING和X509_CERT_TO_BE_SIGNED修改它接受CERT_INFO结构作为输入.

问题是它与OpenSSL i2d_X509函数产生的输出不匹配.使用2048位x509证书作为输入,OpenSSL产生1789字节的编码输出,而Windows CryptoAPI产生1638字节的编码输出.

我能看到的唯一选择是使用CERT_CONTEXT结构中的值动态创建X509证书,并使用i2d_X509函数直接对结果对象进行编码.唯一的问题是我无法从智能卡中提取私钥,因此这可能会导致x509证书创建例程出现问题.

如果有人能就这些问题提供任何见解/建议/提示,我会非常感激.

c++ openssl asn.1 cryptoapi x509

4
推荐指数
1
解决办法
2572
查看次数

如何使用WinCrypt和C++导入PEM格式的私钥?

我正在尝试在C++中使用WinCrypt API.

我的应用程序需要密码,解密,签名和验证文件,一旦我有正确的密钥,我知道如何做到这一点.但我的问题实际上是,这与生成这些密钥的应用程序不同.

我所拥有的是PEM格式的文​​件中的公钥和私钥:

-----BEGIN RSA PRIVATE KEY-----
[Base64 encoded]
-----END RSA PRIVATE KEY-----
Run Code Online (Sandbox Code Playgroud)

而且:

-----BEGIN RSA PUBLIC KEY-----
[Base64 encoded]
-----END RSA PUBLIC KEY-----
Run Code Online (Sandbox Code Playgroud)

经过一些研究,我发现如何导入公钥:这里这里,使用以下方法:

  • CreateFile&ReadFile读取文件内容
  • CryptStringToBinary,使用CRYPT_STRING_BASE64HEADER将PEM格式转换为DER格式(从base64删除页眉和页脚并解码)
  • CryptDecodeObjectEx with X509_PUBLIC_KEY_INFO
  • CryptImportPublicKeyInfo,用于导入密钥

但现在,我的问题是用私钥做同样的事情.任何帮助真的很感激:)谢谢.

c++ windows cryptography cryptoapi pem

4
推荐指数
1
解决办法
8185
查看次数

开发使用MS CryptoAPI的64位应用程序

我是一名C++开发人员,但在Windows开发方面没有强大的背景.

我的主要问题围绕使用Crypto API.我将使用CryptAcquireContext等函数.在研究有关此API的更多信息时,仅将其描述为"Win32加密API".我想知道是否有"Win64加密API"?

如果没有,如果我开发一个在Visual Studio中使用"Win32 Crypto API"并编译为64位模式的应用程序.如果我用32位编译会更好吗?

我该怎么做才能开发一个使用Crypto API的64位应用程序?

如果可能,请在使用加密API,检索证书,携带签名等时报告您为64位开发应用程序时遇到的任何问题.

文章非常受欢迎.

c++ windows cryptography cryptoapi mscapi

4
推荐指数
2
解决办法
3544
查看次数

数字签名SunMSCAPI提供商和MS Crypto API

我想与SunMSCAPI提供商签署文件.由于需要使用MS Crypto API导入公钥和签名.

通常生成签名SHA1withRSA,最终使用big-endian到little-endian(字节顺序)转换.

//generate keystore with java keytool
$Keytool -genkey -alias tsign -keystore c:\test\tsignjks.p12 - keyalg rsa -storetype  pkcs12
Run Code Online (Sandbox Code Playgroud)

在Java应用程序中:

//for signing and getting keystore, assuming windows certificate is installed
..ks = KeyStore.getInstance("Windows-MY","SunMSCAPI"); 
PrivateKey priv = ks.getKey("tsign",password); 
Signature rsa = Signature.getInstance("SHA1withRSA","SunMSCAPI"); 
rsa.initSign(priv);
.. 
rsa.update(buffer, 0, len);
..
byte[] realSig = rsa.sign();

//for writing public key for ms crypto api or exporting it from windows certificate store
Certificate cert = ks.getCertificate("tsign");
byte[] encodedCert = cert.getEncoded();
FileOutputStream …
Run Code Online (Sandbox Code Playgroud)

java rsa cryptoapi digital-signature mscapi

4
推荐指数
1
解决办法
6614
查看次数

在PDF签名中包含时间戳的步骤

美好的一天,

我正在尝试将时间戳信息嵌入到pdf签名中,以便adobe会向我报告签名是时间戳.目前,我所获得的只是Adobe报告"签名包含嵌入式时间戳,但无法验证",当您查看日期/时间属性时,它表示"时间戳授权"不可用和"显示证书"是灰色的.

显然,我在构建PKCS#7消息时做错了.但我现在不知道.有人可以通过描述我需要采取的步骤来帮助我,以便我的签名有时间戳吗?或者建议一个可以帮我找到问题的工具?

我正在使用Crypto API.我目前遵循的步骤如下:

  1. 使用CryptHashMessage函数(SHA256)创建pdf数据的摘要.
  2. 使用CryptRetrieveTimeStamp函数将此摘要发送到TSA .我已设置*TIMESTAMP_DONT_HASH_DATA*标志,以便不再对哈希值进行哈希处理.
  3. 来自TSA的repsonse被添加到*CRYPT_SIGN_MESSAGE_PARA*结构中作为未经身份验证的属性,并且签名时间被添加为经过身份验证的属性.
  4. 然后我使用CryptSignMessage函数来签署使用上述结构的原始数据.

如何检查数据是否正确,以便adobe可以告诉我签名已被加上时间戳?

此致,玛格达

pdf cryptoapi digital-signature trusted-timestamp

4
推荐指数
1
解决办法
5454
查看次数

从具有多个签名的签名可执行文件中读取证书数据

微软正在远离SHA1.结果,许多可执行文件现在具有两个或更多个签名; 一个使用SHA1摘要以实现向后兼容,另一个使用SHA256.

例如,如果您查看vstest.executionengine.exeVisual Studio 2013的属性(查看Windows 8或Server 2012上的属性),您将看到它有来自3个不同证书的3个不同签名.

我已经有一个使用的组合代码CryptQueryObject,CryptMsgGetParam和.NET SignedCms,但它只能看到3个签名1.一个签名者似乎只有一条消息.

我需要获取所有签名的证书信息.如何对多个签名进行建模 - 是单个消息中的多个消息还是多个签名者?Microsoft是否添加了新的API或新标志来访问多个签名?

sha1 sha256 authenticode cryptoapi digital-signature

4
推荐指数
1
解决办法
553
查看次数

为什么重新启动时丢失了密钥容器?

多年以来,我们一直将强名密钥保存在密钥容器中。Visual Studio不直接支持它,但是,如果您只编辑.csproj文件并添加:

<KeyContainerName>MyKeyName</KeyContainerName>
Run Code Online (Sandbox Code Playgroud)

我们通过执行以下操作将密钥安装到密钥存储中:

sn -m Y
sn -i MyKeyFile.snk MyKeyName
Run Code Online (Sandbox Code Playgroud)

然后,我们可以从该计算机上删除MyKeyFile.snk,并且密钥更加安全。

最近,重新启动后这已成为问题。我们怀疑问题是由VS 2015引入的,但可能是Windows 8和/或10引起的。我们将密钥安装到密钥容器中,一切正常。然后,我们重新启动该计算机,并且构建失败并显示以下内容:

CSC : error CS7028: Error signing output with public key from container 'MyKeyName' -- Keyset does not exist (Exception from HRESULT: 0x80090016)
Run Code Online (Sandbox Code Playgroud)

看起来密钥容器在重新启动时丢失了,但是,如果这样做,则:

sn -m Y
sn -i MyKeyFile.snk MyKeyName
Run Code Online (Sandbox Code Playgroud)

它失败并显示:

Failed to install key pair -- Object already exists.
Run Code Online (Sandbox Code Playgroud)

我们必须使用sn -d删除密钥容器,然后将其重新添加,Visual Studio很高兴。

这里发生了什么?当sn可以看到它时,为什么Visual Studio在重新启动后看不到我们的密钥容器?密钥容器实际存储在哪里?

cryptography cryptoapi visual-studio

4
推荐指数
1
解决办法
1107
查看次数

CertGetCertificateChain 什么时候可以返回多个简单证书链?

为什么CertGetCertificateChain有一个设施可以返回多个“简单链”?什么是简单链条以及我应该期待哪些其他类型的链条?

在测试运行中通过如下证书......

root
  |- parent
    |- my certificate 
Run Code Online (Sandbox Code Playgroud)

...结果是一个简单的链:

0. my certificate
1. parent
2. root
Run Code Online (Sandbox Code Playgroud)

在什么情况下我们会看到多个简单链被返回?

cryptoapi x509certificate code-signing-certificate

4
推荐指数
1
解决办法
308
查看次数