IT点滴

我不去想是否能够成功 既然选择了远方 便只顾风雨兼程
  博客园  :: 首页  :: 联系 :: 订阅 订阅  :: 管理

随笔分类 -  PKI

摘要:修改MSDN上的示例,使之可以通过RSA证书文件加密和解密,中间遇到一个小问题。Q:执行ExportParameters()方法时,回报CryptographicException:该项不适于在指定状态下使用(Key not valid for use in specified state)。A:导入带有私钥的证书时,需要使用"X509KeyStorageFlags"参数标记"私钥可导出"。X509Certificate2 prvcrt=newX509Certificate2(@"X:\path\to\CA.pfx","** 阅读全文

posted @ 2014-03-20 14:55 Ady Lee

摘要:证书库个人证书存储区为其中的每个证书维护一个属性CERT_KEY_PROV_INFO_PROP_ID,该属性指定了证书对应的密钥容器的相关信息,包括密钥容器名,CSP名称,CSP类型,密钥用途,以及CSP的其他一些参数(这些参数信息也可以使用CryptSetProvParam函数来设置)。因为个人证书携带私钥信息,所以在导出p12(pfx)个人证书时,也导出了其对应密钥容器的相关信息(使用CryptGetProvParam函数来获取),即上面所提到的。那么,在导入p12(pfx)个人证书时,也会导入密钥容器的相关信息。首先在对应的CSP中生成一个新的密钥容器,并导入密钥对信息;然后导入证书,并 阅读全文

posted @ 2014-03-20 14:04 Ady Lee

摘要:在windows中,可以直接使用微软提供的crypto库实现PKCS7签名与签名验证。签名接口函数为CryptSignMessage,其接口定义为:[cpp]view plaincopyprint?BOOLWINAPICryptSignMessage(__inPCRYPT_SIGN_MESSAGE_PARApSignPara,__inBOOLfDetachedSignature,__inDWORDcToBeSigned,__inconstBYTE*rgpbToBeSigned[],__inDWORDrgcbToBeSigned[],__outBYTE*pbSignedBlob,__in_out 阅读全文

posted @ 2014-03-20 14:02 Ady Lee

摘要:今天在使用Outlook express调试CSP程序时,发现数字证书总是加载不上(提示该数字证书已经被破坏),使用断点进去跟踪一下,发现在CSP程序中调用CPVerifySignature函数时返回80090006错误(不是一个合法的签名),因为这里CPVerifySignature函数是windows提供的SPI接口函数,肯定不会有错,推测是不是传进去的签名值发生了错误,然而这个签名值来自哪里呢?应该是来自上层的Crypto应用(即Outlook express程序),推测在证书验证时会调用哪些函数,在使用CPVerifySignature时,传入了签名值,hash对象句柄,和公钥句柄,. 阅读全文

posted @ 2014-03-20 14:01 Ady Lee

摘要:上面四个属性是CertSetCertificateContextProperty或CertGetCertificateContextProperty可以为证书上下文设置的几个属性,下面对它们的关联简单的进行分析(其中的意义我也不太清楚):通过CERT_KEY_CONTEXT_PROP_ID属性,我们可以为证书上下文设置一个CERT_KEY_CONTEXT结构体,在MSDN中,我们可以看到结构体的定义:typedef struct _CERT_KEY_CONTEXT { DWORD cbSize; HCRYPTPROV hCryptProv; DWORD ... 阅读全文

posted @ 2014-03-20 13:57 Ady Lee

摘要:证书的两种形式:1、带私钥的证书,即p12格式证书(后缀为.pfx)2、不带私钥的证书,有多种格式,通常我们使用的是cer格式证书(后缀为.cer)当我们安装.pfx格式证书时,windows的安装程序会为我们生成一个唯一的密钥容器(密钥容器名为GUID格式),并把证书中的私钥存储在密钥容器中,然后把脱除私钥的证书(为.cer格式证书)存放在证书库中(如果是个人证书,会默认存放在个人证书库,也就是MY系统证书库中),证书库并为证书维护一个CERT_KEY_PROV_INFO_PROP_ID属性,通过此属性可以获取存储私钥的CSP和密钥容器,所以当我们使用证书进行数字签名时,可以找到对应的CSP 阅读全文

posted @ 2014-03-20 13:55 Ady Lee

摘要:http://stackoverflow.com/questions/1231178/load-an-x509-pem-file-into-windows-cryptoapiI discovered the "magic" sequence of calls to import a RSA public key in PEM format. Here you go:decode the key into a binary blob with CryptStringToBinary; pass CRYPT_STRING_BASE64HEADER in dwFlagsdecod 阅读全文

posted @ 2014-03-19 16:51 Ady Lee

摘要:.net平台下面的RSA算法实现是RSACryptoServiceProvider,如果安装了 Microsoft Enhanced Cryptographic Provider,则 RSACryptoServiceProvider 支持长度从 384 位至 16384 位(增量为 8 位)的密钥。如果安装了 Microsoft Base Cryptographic Provider,则支持长度从 384 位至 512 位(增量为 8 位)的密钥。 目前该算法支持的填充Padding算法为PKCS#1 1.5和OAEPPadding,而签名算法目前仅支持SHA1withRSA算法,其他的好像没 阅读全文

posted @ 2014-03-19 16:47 Ady Lee

摘要:很久以前的文章中,演示了如何对于.net和win32下面的delphi的RSA互操作性的实现,对于C#和JAVA之前的RSA加密解密也是很简单的,一般都采用了标准的规范,所以在互操作性方面是很方便的。之前也有博友私信请教这方面的问题,现在放出一个demo实现:一、概述算法:RSA/ECB/PKCS1PaddingRSA KEY:为了便于演示,使用http://www.cnblogs.com/midea0978/articles/768824.html中的Key代码:C# & JAVA二、JAVA平台1importorg.junit.Test;2importsun.misc.BASE64 阅读全文

posted @ 2014-03-19 16:46 Ady Lee

摘要:.NET_RSA加密全接触(重、难点解析) .NET Framework提供了两个类供我们使用RSA算法,分别是:用于加密数据的RSACryptoServiceProvider和用于数字签名的DSACryptoServiceProvider,本文主要谈论RSACryptoServiceProvider的使用以及微软实现RSA算法时的一些主要特点。1、.NET中RSA密钥格式RSA的密钥有两种表现形式,一种是通过RSAParameters对象来表现,另一种是通过XML字符串来表现,当通过默认构造函数构造一个RSACryptoServiceProvider实例的时候,会自动生成一对公私钥,可以通过 阅读全文

posted @ 2014-03-19 16:44 Ady Lee

摘要:.NET和java的RSA互通,仅此而已在开始这篇文章之前,先请读者朋友阅读老唐的这两篇文章:1、Java与.Net环境下RSA加密解密交互不成功的问题解决2、Java与.Net环境下RSA加密解密交互不成功的问题解决【续】和我的这篇文章3、.NET_RSA加密全接触(重、难点解析)前面老唐的两篇文章中提到,要想实现.NET和Java的RSA互通,只能抛弃.NET现有的加密算法,而是利用http://www.codeproject.com/csharp/biginteger.asp项目中的BigInteger类(.NET Framework4中已增加了这个类的实现,在System.Number 阅读全文

posted @ 2014-03-19 16:42 Ady Lee

摘要:昨天写过了RSA非对称加密解密的交互方式,其实数字签名也是RSA非对称加密,只不过用私钥加密的,再加上个hash摘要CryptoAPI与openssl RSA非对称加密解密(PKCS1 PADDING)交互已经提到关于证书和私钥的数据以及对象获取,这里就不再重复讨论1.openssl的签名及验证[cpp]view plaincopyprint?voidopensslSigner::sign(EVP_PKEY*evpKey,BYTE**signValue,unsignedint&signLen,BYTE*text,inttextLen){EVP_MD_CTXmdctx;//摘要算法上下文 阅读全文

posted @ 2014-03-19 15:43 Ady Lee

摘要:(以下代码中都只做测试用,有些地方没有释放内存...这个自己解决下)1.RSA非对称的,首先提供一个供测试用的证书和私钥的数据1)pem格式的证书和私钥(公私钥是对应的)的base64编码[cpp]view plaincopyprint?voidreadPriKey(string&a){a="-----BEGINRSAPRIVATEKEY-----\n";a.append("MIICXQIBAAKBgQDTFPiHkUX279j7OnK2ToLrwD/QI9N/fL/XoMnW1sBYJdSWs/VP\n");a.append("5oy 阅读全文

posted @ 2014-03-19 15:42 Ady Lee

摘要:继上次只有CryptoAPI的加密后,这次要实现openssl的了动机:利用CryptoAPI制作windows的IE,火狐和chrome加密控件后,这次得加上与android的加密信息交互先前有说openssl移植到android的过程,这里就不再提android如何调用openssl了, 而那一篇第9条提到的openssl与cryptoAPI兼容的两种方式感觉实现都不太好用,这里再次提出一种AES加密的实现方式写这边文章的最主要的原因,用过CryptoAPI的都知道,很多东西都封装了,如果要与其他加密组件交互,得用其他组件来实现CryptoAPI的思路环境:windows visua... 阅读全文

posted @ 2014-03-19 15:41 Ady Lee

摘要:一、DER编码密钥对先说下DER编码,是因为JCE本身是支持DER编码密钥对的解析的,可以参见PKCS8EncodedKeySpec和X509EncodedKeySpec.DER编码是ASN.1编码规则中的一个子集,具体格式如何编排没有去了解,但最终呈现肯定的是一堆有规律的二进制组合而成。PKCS#8定义了私钥信息语法和加密私钥语法,而X509定义证书规范,通常都会用DER和PEM进行编码存储,而在JAVA中则使用的DER。接下来看看如果通过DER编码的密钥对分别获取JAVA的公私钥对象。1.下面一段是生成私钥对象的,传入参数是DER编码的私钥内容。[java]view plaincopypr 阅读全文

posted @ 2014-03-19 15:37 Ady Lee

摘要:默认情况下,.NET生成的RSA密钥对可以用XML或字节流来保存,而JAVA中生成的RSA密钥对只能用字节流来保存。而它们的字节流格式不同,就导致Java中生成的RSA密钥对不能在.NET中使用,而.NET中生成的密钥对又不能在Java中使用。而.NET的XML保存方法我觉得比较有通用性,于是就以.NET中RSA密钥保存的XML格式作为兼容格式,这样它们就可以通用了。下面是Java代码:PS:在Chrome上用博客园的编辑器设置不了代码折叠,保存后折叠的代码就打不开了。。。=============================================文件:StringHelper. 阅读全文

posted @ 2014-03-19 15:16 Ady Lee

摘要:.NET导入openssl生成的公钥之BEGIN RSA PUBLIC KEY我得到了一个公钥,形式如下-----BEGIN RSA PUBLIC KEY-----MIGJAoGBAMroxz3qtok…….……-----END RSA PUBLIC KEY-----相要用C#程序,将它导入并加密数据传给opensll应用程序解密。在网上找到很多方法,其中opensslkey.cs文件的实现最完善,但它只能解析-----BEGIN PUBLIC KEY-----打头的公钥。而且内容的长度也不同,看来它是解不开了。在搜索的过程中,发现Jeffrey Walton有文章Cryptographic 阅读全文

posted @ 2014-03-19 15:14 Ady Lee

摘要:PEM文件格式存档Author:Roson sunsunxiao@tomonline-inc.comTime:2006-4-111.描述:Openssl使用PEM(RFC1421-1424)文档格式,如果使用其他语言包,则需要将此格式进行解码并将各个私公钥加入。2.说明:a)首先使用BASE64解码,如果是非ANSI TXT格式,需要做转换。b)一个RSA私钥包含一下信息(1024位):>openssl rsa -in key.pem -noout -textmodulus:00:d5:00:b2:18:c3:04:d1:ac:80:c6:22:a0:cc:5c:f1:c0:4a:83: 阅读全文

posted @ 2014-03-19 15:13 Ady Lee 阅读(5046) 评论(0) 推荐(0)

摘要:http://www.christian-etter.de/?p=771In .NET, RSACryptoServiceProvider greatly simplifies common tasks associated with public/private keys, such as signing of data and verifying a signature.Unfortunately, there is only a single format (proprietary XML) available for importing and exporting public/pri 阅读全文

posted @ 2014-03-19 15:03 Ady Lee

摘要: 阅读全文

posted @ 2013-05-30 14:10 Ady Lee 阅读(202) 评论(0) 推荐(0)