X509数字证书之一:加密和解密

来源:互联网 发布:js cookie时间 编辑:程序博客网 时间:2024/06/06 07:35

摘要:公钥在分发给接收方后,接收方需要验证公钥来源的可靠性。数字证书的目的是提供公钥和发送方数字签名,确保发送方身份可靠。数字证书是建立安全可靠的网络传输的完整解决方案,目前被广泛用于文件加密解密、电子支付等场景。


CA机构,又称为证书授证(Certificate Authority)中心,作为电子商务交易中受信任的第三方,承担公钥体系中公钥的合法性检验的责任。CA中心为每个使用公开密钥的用户发放一个数字证书,数字证书的作用是证明证书中列出的用户合法拥有证书中列出的公开密钥。CA机构的数字签名(使用用户的私钥签名)使得攻击者不能伪造和篡改证书。它负责产生、分配并管理所有参与网上交易的个体所需的数字证书,因此是安全电子交易的核心环节。


1.带有私钥的证书 
由Public Key Cryptography Standards #12,PKCS#12标准定义,包含了公钥和私钥的二进制格式的证书形式,以pfx作为证书文件后缀名。 

2.二进制编码的证书 
证书中没有私钥,DER 编码二进制格式的证书文件,以cer作为证书文件后缀名。 

3.Base64 编码的证书 
证书中没有私钥,BASE64 编码格式的证书文件,也是以cer作为证书文件后缀名。

由定义可以看出,只有pfx格式的数字证书是包含有私钥的,cer格式的数字证书里面只有公钥没有私钥。


一:X509 证书创建:

windows7环境下,执行makecert.exe 命令创建。一个用于wcf服务端,一个用户wcf客户端。

F:\temp\PayMvcApp>C:\"Program Files (x86)"\"Microsoft SDKs"\Windows\v7.0A\Bin\x6
4\makecert.exe -sr CurrentUser -ss My -a sha1 -n CN=WosServer -sky exchange -pe
Succeeded


F:\temp\PayMvcApp>C:\"Program Files (x86)"\"Microsoft SDKs"\Windows\v7.0A\Bin\x6
4\makecert.exe -sr CurrentUser -ss My -a sha1 -n CN=WosClient  -sky exchange -pe
Succeeded

二:证书文件导出:

参考下图,进行证书文件导出,导出选择类型有:包含私钥的pfx文件格式导出,只有公钥的cer文件格式导出。这两种类型的文件在下面的代码示例中会使用到。



三:X509证书对文件内容的加密和解密

            //由证书公钥文件初始化rsa算法
            string pubKeyFile = Server.MapPath("~/certificate/WosClient-pubkey.cer");
            X509Certificate2 cer = new X509Certificate2(pubKeyFile);
            RSACryptoServiceProvider rsaProvider = (RSACryptoServiceProvider)cer.PublicKey.Key;


            //公钥加密
            string plainText = "Today, I have a dream.";
            byte[] plainBytes = System.Text.Encoding.UTF8.GetBytes(plainText);
            byte[] encryptedBytes = rsaProvider.Encrypt(plainBytes, false);


            //包含私钥文件的rsa算法初始化
            string priKeyFile = Server.MapPath("~/certificate/WosClient.pfx");
            X509Certificate2 cert2 = new X509Certificate2(priKeyFile, "123456");
            RSACryptoServiceProvider rsaProvider2 = (RSACryptoServiceProvider)cert2.PrivateKey;


            //私钥解密
            byte[] decryptedBytes = rsaProvider2.Decrypt(encryptedBytes, false);
            string decryptedString = System.Text.Encoding.UTF8.GetString(decryptedBytes);

总结:

可以看到发送方和接收方都是使用证书文件,其中加密时候用到只包含公钥cer格式的证书文件,而接收方在解密时用到包含私钥的pfx文件。实际的场景可以这样描述,Bob生成pfx和cer证书文件,然后他把cer文件分发给Alice,Jack;把pfx文件留做自用。当Alice,Jack要传输报文给Bob时,他们用Bob提供的公钥cer文件进行加密,当Bob收到加密后的报文,用自己的私钥pfx文件进行解密;这样双方可以安全通信。


参考文档:

http://baike.baidu.com/view/16501.htm

原创粉丝点击