使用X.509数字证书加密解密实务(二)-- 使用RSA证书加密敏感数据

一、  使用RSA证书加、解密敏感数据

X.509证书标准支持三种不对称加密算法:RSA, DSA, Diffie-Hellman algorithms。最常用的是RSA算法。所以本文就以前面章节使用makecert工具生成的生成的MyTestCert证书进行加密解密,这个证书具有RSA算法1024位的密钥对。

Figure 12. RSA加密解密过程

1、 生成证书、分发证书

证书使用前面“使用makecert工具获得”章节生成的MyTestCert,当然也可以是从商业CA获得的证书。

你获得的证书应该是含有公钥和私钥的完整证书,一般是pfx形式的证书。

要接收加密数据,需要把你的公钥分发给加密数据的加密方,加密方使用你的公钥加密数据。

证书要么以pfx形式存在,要么被导入到证书存储区。

如果你的证书存在于证书存储区可以通过证书管理控制台提供的证书导出功能导出只含有公钥的cer证书。

如果证书以pfx证书文件形式存在,可以通过代码读取证书然后导出为只含公钥的cer证书。

参考前面章节导出一个名为MyTestCert.cer证书,将此证书分发给需要用来加密的加密方。

2、 字符串明文转成某一代码页对应的编码字节流

待加密的数据可能有两种形式,一种是二进制的数据,本身就是一组字节流,这样的数据可以跳过这一步,直接进入加密步骤。还有一种情况是字符串数据,字符串中同样的字符使用不同的代码页会生成不同的字节码,所以从字符串到字节流的转换是需要指定使用何种编码的。在解密之后,要从字节流转换到字符串就要使用相同的代码页解码,否则就会出现乱码。

//保存明文文件的字节数组

Byte[] plainTextByte = Encoding.UTF8.GetBytes(“RSA证书对敏感数据进行加密!”);

这里用utf8代码页对明文进行编码,把明文字符串转成字节流。

3、 加密操作

//从只包含公钥的证书文件载入证书

X509Certificate2 myX509Certificate2 = newX509Certificate2(@"C:/Samples/PartnerAEncryptMsg/MyTestCert.cer");

//从cer证书中获得含公钥的RSACryptoServiceProvider

RSACryptoServiceProvider myRSACryptoServiceProvider = (RSACryptoServiceProvider)myX509Certificate2.PublicKey.Key;

//使用RSACryptoServiceProvider把明文字节流加密为密文字节流

Byte[] Cryptograph = myRSACryptoServiceProvider.Encrypt(plainTextByte, false);

使用1024为的密钥加密,原料应该是128字节(1024位)的byte[]的原始数据,加密后的数据也是128字节(1024位),如果明文不足128字节,RSACryptoServiceProvider会自动用随机数补足128字节。

Dotnet的RSA实现有个特点,它必须要在明文中添加一些随机数,所以明文不能把128字节占满,实际测试,明文最多为117字节,留下的空间用来填充随机数。

所以,用同一个密钥对同一串字符串进行加密,每次得到的密文都是不一样的。

4、 解密操作

//从证书文件载入证书,如果含有私钥的,需要提供保存证书时设置的密码

X509Certificate2 myX509Certificate2 = newX509Certificate2(@"C:/Samples/PartnerAEncryptMsg/MyTestCert.pfx", "password");

//从证书中获得含私钥的RSACryptoServiceProvider

RSACryptoServiceProvider myRSACryptoServiceProvider = (RSACryptoServiceProvider)myX509Certificate2.PrivateKey;

//使用RSACryptoServiceProvider把密文字节流解密为明文字节流

byte[] plaintextByte = myRSACryptoServiceProvider.Decrypt(Cryptograph, false);

解密需要载入含私钥的pfx证书,需要提供私钥保护密码。

5、 从编码字节流转成字符串明文

使用加密时采用的同样的代码页utf8把解密后的明文byte[]转成字符串

string Plaintext = Encoding.UTF8.GetString(plaintextByte);

时间: 2024-12-20 18:39:15

使用X.509数字证书加密解密实务(二)-- 使用RSA证书加密敏感数据的相关文章

使用X.509数字证书加密解密实务(一)-- 证书的获得和管理

一.       获得证书 1.        从CA获得 2.        从windows2003证书服务中获得 3.        使用makecert工具获得 二.       证书的保存 1.        保存在证书存储区 2.        以文件形式保存 2.1.       带有私钥的证书 2.2.       二进制编码的证书 2.3.       Base64编码的证书 3.        存储区中的证书跟证书文件相互转换 3.1.       使用工具相互转换 3.1.

使用X.509数字证书加密解密实务(三)-- 使用RSA证书结合对称加密技术加密长数据

本文全部源代码下载:/Files/chnking/EncryptLongData.rar 一.  使用证书结合对称加密算法加.解密长数据 上一章节讨论了如何使用RSA证书加密数据,文中提到:“Dotnet的RSA实现有个特点,它必须要在明文中添加一些随机数,所以明文不能把128字节占满,实际测试,明文最多为117字节,留下的空间用来填充随机数”.也就是说对于1024位密钥的RSA来说,一次只能加密128字节的数据,对于Dotnet的RSA实现更是只能加密117个字节的数据. 这就引出一个问题,超

Openssl及加密解密(二)openssl

openssl是一个条件实现了上百种算法.实现了单向加密工具等一组套件,代码量很小但是功能强大.它有三部分组成: libcrypto:通用功能的加密库,软件开发时可以直接调用 libssl:实现TLS/SSL的功能 openssl:多功能命令行工具,加密.解密.创建CA.证书.一对秘钥等 openssl enc加密解密命令: 参数 说明 -des3 是指定加密算法 -a 是输出文件按base64内容输出,否则就是二进制的 -in 要加密的文件 -out 加密后的文件 -salt 加盐 -d 表示

AES加密解密&&SHA1、SHA加密&&MD5加密

AES加密解密 SHA1.SHA加密 MD5加密 二话不说立即附上代码: package com.luo.util; import java.io.UnsupportedEncodingException; import java.security.InvalidKeyException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.security.

Springboot 使用过滤器进行加密解密(二)

之前写过一篇关于过滤器实现加密解密功能的文章,但是在实际开发业务中发现,还是有一些问题的,在此特地说明. 第一:过滤器走两遍的问题: 1.过滤器上,添加了两个注解 第一个:@Compent   将此Filter交给Spring容器管理 第二个:@WebFilter通过WebFilter进行Filter声明,这样容器在进行部署的时候就会处理该Filter 2.启动类上添加的注解 @ServletComponentScan  作用:Servlet.Filter.Listener 可以直接通过 @We

RSA加密解密及RSA签名和验证及证书

公钥是给别人的 发送密文使用公钥加密 验证签名使用公钥验证 私钥是自己保留的 接受密文使用私钥解密 发送签名使用私钥签名 上述过程逆转是不行的,比如使用私钥加密,使用公钥解密是不行的 证书的制作参考自使用X.509数字证书加密解密实务(一)-- 证书的获得和管理 打开VS开发命令,输入下面的命令: makecert -sr CurrentUser -ss My -n CN=MyTestCert -sky exchange -pe 从证书中读取私钥和公钥: /// <summary> /// 根

加密解密

在现代密码学中,加密方法大致可分为对称密钥加密(对称加密)和公开密钥加密(非对称加密). 一. 对称加密(Symmetric-key algorithm,或对等加密: Reciprocal cipher ) 对称加密,即加密和解密使用同一个密钥,或者知道一方密钥能够轻易计算出另一方密钥.其解密(decryption)算法等同于加密算法,也就是说,要还原对等加密的密文,套用加密同样的算法即可得到明文. 对称加密的速度比非对称加密快很多,在很多场合都需要对称加密. 对称加密又可分为分组密码(分组加密

Linux之加密解密基础技术

下文主要介绍了什么是加密解密:为何要用到加密解密技术:加密解密技术能够为我们带来什么样的好处:常见的几种加密解密技术介绍以及Linux中的openssl. 一.什么是加密,解密 加密技术是一种常用的安全保密手段,利用各种技术手段把重要的数据进行加密传送:再用对应的技术手段进行解封,该过程的逆过程就称为解密.这里用一个不太恰当的例子说一下:也就好比你去办一张银行卡,需要你设置一个密码,就可以理解成在为这张银行卡做一个加密的操作:用银行卡到提款机取钱需要你输入密码,这就是一个解密的操作. 二.为什么

加密解密原理,自建CA

目前数据的加密方式有3种:单向加密,对称加密,公钥加密(非对称加密),我们常见的加密算法有DES,MD5,SHA1...SHA512,RSA,都有各自不同的用处.简单介绍下这3中加密方式. 单向加密 通过某种Hash 函数对原始数据进行提取,提取得到一端固定长度的密文(不管文件有多大,密文长度不变),这段数据也常被称为数据指纹或特征码. 特点:1)单向加密,只能由原始数据得到特征码,而不能由特征码逆向推出原始数据. 2)雪崩效应,原始数据微小的改变会导致特征码巨大的变化 应用:常被应用于数字签名