GVKun编程网logo

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

11

以上就是给各位分享将一个X509PEM文件加载到WindowsCryptoApi中,同时本文还将给你拓展.net–System.Security.Cryptography.X509Certificat

以上就是给各位分享将一个X509 PEM文件加载到Windows CryptoApi中,同时本文还将给你拓展.net – System.Security.Cryptography.X509Certificates.X509Certificate2在目标框架版本中不可用、c – 是否存在针对Windows的CryptoAPI的替换?、CryptoApi到CommonCrypto、Cryptoapi签名/验证无法在Windows 8.1上运行等相关知识,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

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

将一个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结构。 祝你好运 ;-)

.net – System.Security.Cryptography.X509Certificates.X509Certificate2在目标框架版本中不可用

.net – System.Security.Cryptography.X509Certificates.X509Certificate2在目标框架版本中不可用

我安装了VS2015 RTM和VS2013 Update 5 RTM.现在我的解决方案没有构建,因为我的接口具有返回类型X509Certificate2.现在我的假货不是建造的.我还创建了一个测试项目,我遇到了同样的问题,所以这不是我的解决方案.我收到的消息是:

Cannot generate stub for ClassLibrary1.Interfaces.ICertificateProvider: method System.Security.Cryptography.X509Certificates.X509Certificate2 ClassLibrary1.Interfaces.ICertificateProvider.getbla() unstubbable: method is abstract and Could not be stubbed,type System.Security.Cryptography.X509Certificates.X509Certificate2 is not available in the target framework version.

现在我卸载了VS2015 RTM,但问题仍然存在.当我用返回类型注释掉该方法时,证书一切正常.当我取消注释时,问题出在那里.

更新1
我刚在另一个系统上测试了这个.首先,我尝试使用VS2013 Update 4和VS2015 RC.有了这个设置一切都很好.然后我在该系统上安装了Update 5 RTM,然后它不再工作了.所以Update 5一定是问题所在!
结束更新

重现:
使用.Net Framework 4.5.1创建包含2个类库和1个测试项目的解决方案.
在类库1中创建一个接口.

namespace ClassLibrary1.Interfaces
{
    public interface ICertificateProvider
    {
        // Comment this line so you can build your fakes assembly...
        X509Certificate2 getbla();
    }
}

在第二个类库中创建一个类.实现接口并添加对第一个类库的引用.

namespace ClassLibrary1
{
    public class CertificateProvider :   ClassLibrary1.Interfaces.ICertificateProvider
    {
        public X509Certificate2 getbla()
        {
            throw new NotImplementedException();
        }
    }
}

为unittest项目中的接口项目添加fakes程序集.在测试中通过以下代码:

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using ClassLibrary1.Interfaces.Fakes;

namespace UnitTestProject1
{
    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {
            StubICertificateProvider provider = new StubICertificateProvider();
        }
    }
}

现在您的项目将无法构建.如果您在项目将构建的界面中注释该方法.
在.fakes文件中启用诊断以获取错误消息.

谁有解决方案?

更新2
更改使用.Net Framework 4.6的解决方案.更改为4.5.2不起作用.

更新3
链接到Github的官方错误:
https://github.com/dotnet/coreclr/issues/1303

我刚刚将测试项目更新到.NET 4.6,它运行良好.在那之后我有几个内部类,这些假货是不可见的,所以使用

[assembly:InternalsVisibleT

在AssemblyConfig.cs中最好让它最终运行.

c – 是否存在针对Windows的CryptoAPI的替换?

c – 是否存在针对Windows的CryptoAPI的替换?

我在使用cryptoAPI时遇到了重大问题,并且想知道你是否获得了第三方/更好的 Windows解决方案?

我对CryptoAPI的主要问题是它不够OS独立.我无法在我的代码中找到适当的平衡,以便在Windows 2003和Windows 2008上运行.

我本质上想要实现的内容可以在here左右阅读.这是我在此阶段对密码学的唯一用途.

解决方法

尝试Bouncy Castle,它可以在C#& amp; Java的:
http://www.bouncycastle.org/

我们这个领域的不少供应商在生产中使用它.

CryptoApi到CommonCrypto

CryptoApi到CommonCrypto

我有Windows平台中使用的encryption代码,它使用Crypto API函数,需要将其转换为使用OS X上的Common Crypto。

基本上原来的代码是这样的,错误检查删除简洁: –

CryptAcquireContext(&m_hProv,NULL,PROV_RSA_FULL,CRYPT_VERIFYCONTEXT)); CryptCreateHash(m_hProv,CALG_MD5,&hHash); CryptHashData(hHash,(LPBYTE)pszInputData,lstrlen(pszInputData)*sizeof(TCHAR),0); CryptDeriveKey(m_hProv,CALG_RC4,hHash,CRYPT_EXPORTABLE | 0x00280000,&m_hKey); CryptDecrypt(m_hKey,bFinal,pData,pdwDataSize);

据我了解,这是发生了什么事:

CryptAcquireContext – 获取一个对象来处理encryption

压缩图像,有没有一点?

在C中打印原始文本时如何捕获错误

使用Linux上的CMake将增强链接到共享库

multithreading发射安排

为什么在Visual C ++ 2008中链接静态运行时库仍然需要运行时MSVCR71.dll?

CryptCreateHash – 创build一个MD5哈希对象

CryptHashData – 用MD5散列input数据

CryptDeriveKey,CryptDecrypt – 用RC4解码pData,使用密钥m_hKey

pszInputData的大小是12个字节,MD5哈希对象的输出数组在两个平台上是相同的。

为了解码RC4,我使用Common Crypto进行以下操作: –

CCCryptorRef cryptor = NULL; CCCryptorCreate(kCCDecrypt,kCCAlgorithmRC4,(void*)m_hKey.data(),m_hKey.length(),&cryptor); char outBuffer[12]; size_t outBytes; CCCryptorUpdate(cryptor,(void*)pData,*pdwDataSize,outBuffer,12,&outBytes);

使用在线RC4解码器testingCommon Crypto的输出(outBuffer数组)匹配,所以这是正确的解码。

但是,pData中Windows代码的最终输出与Common Crypto中解码的RC4不匹配。

有没有一些步骤,我错过了或不理解与Windows Crypto API调用在这里; 为什么产出不同?

(请注意,我不在使用RC4的安全或缺陷的意见)

什么时候在Windows中的c + +所必需的“外部C”?

什么是有效的方式来过滤数组

为什么fork()会导致重复输出?

在Linux中沙盒

我怎样才能让Windows的二进制文件,使非编码器只能得到一个崩溃转储,可以喂给gdb?

尝试使用Open SSL中描述的API(EVP_BytesToKey – 基于密码的加密例程)。

问题变成了解CryptDeriveKey如何使用具有RC4解密的指定位数。

CryptDeriveKey(m_hProv,&m_hKey);

这里说明我们需要一个40位的密钥(0x00280000 = 40 << 16)。

但是,调用CryptDecrypt时,Windows实际上使用16个字节作为密钥,取前40位,并将数组的其余部分设置为零。

因此,将一个16字节的密钥(仅设置前40位)传递给CCCryptorCreate函数会生成与Windows匹配的输出。

Cryptoapi签名/验证无法在Windows 8.1上运行

Cryptoapi签名/验证无法在Windows 8.1上运行

我们有一个应用程序使用CryptoApi签署和验证带有SHA1哈希值的消息.它在 WindowsXP和 Windows 8下运行了很多年.它不再适用于Windows 8.1. CryptSignHash失败,错误代码为87(无效参数). CryptVerifySignature不会失败但会返回NTE_BAD_SIGNATURE(对于在Windows 8上创建的有效签名).我们已经测试了所有可能的东西..它适用于Windows 8及更低版本,在Windows 8.1上失败.

您对如何进一步调试有任何想法吗?
我们再次导出导入的公钥和私钥,并验证它们是否正确.
我们跳过使用“我们的”密钥并生成新密钥 – >签名失败也有错误87
我们使用RSA_FULL和DES生成新密钥并使用它们加密/解密消息 – >没问题,按预期工作.
我们检查了RSA_FULL提供程序的版本.在Windows 8和Windows 8.1上都是2.0.
我们尝试明确指定提供程序名称:Microsoft Base Cryptographic Provider v1.0

在Windows 8.1上签名是否适用于任何人.?

Windows 8.1上还有其他新功能吗?这可能会阻止签名工作?
我们应该知道的提供商或算法有什么变化吗?

应用程序是用Delphi编写的,大致使用以下流程:

//Setup crypto provider 
CryptAcquireContext(@fhCryptProv,nil,cptRSAFull,[ccVerify,ccMachineKeySet]); 

//Create a hash structure
CryptCreateHash( fProvider.GetProviderHandle,chtSHA1,@fhHash);

//Import the private key for signing
CryptImportKey( fProvider.GetProviderHandle,@buff[0],len,CRYPT_EXPORTABLE,@fKey);

//Hash the message
CryptHashData(fhHash,@aPlainText[1],length(aPlainText) * 2,0);

//Sign the message
CryptSignHash(fhHash,AT_SIGNATURE,CRYPT_NOHASHOID OR CRYPT_X931_FORMAT,@buff,@len);

解决方法

设置CRYPT_X931_FORMAT标志时,CryptSignHash在Windows 8.1上失败.这看起来像Windows 8.1.错误.

通过从下面的URL运行MSDN示例代码,使用CALG_SHA1而不是CALG_MD5进行散列并将CryptSignHash中的标志设置为CRYPT_NOHASHOID,可以重现此错误. CRYPT_X931_FORMAT;将标志保留为0或仅保留CRYPT_NOHASHOID适用于我测试过的系统.

我从未在WindowsXP到Windows 8.0系统上使用这些标志出现任何问题.

MSDN示例代码URL:http://msdn.microsoft.com/en-us/library/windows/desktop/aa382371%28v=vs.85%29.aspx

我们今天的关于将一个X509 PEM文件加载到Windows CryptoApi中的分享就到这里,谢谢您的阅读,如果想了解更多关于.net – System.Security.Cryptography.X509Certificates.X509Certificate2在目标框架版本中不可用、c – 是否存在针对Windows的CryptoAPI的替换?、CryptoApi到CommonCrypto、Cryptoapi签名/验证无法在Windows 8.1上运行的相关信息,可以在本站进行搜索。

本文标签: