〇、简介
谈及 RSA 加密算法,我们就需要先了解下这两个专业名词,对称加密和非对称加密。
- 对称加密:在同一密钥的加持下,发送方将未加密的原文,通过算法加密成密文;相对的接收方通过算法将密文解密出来原文的过程,就是对称加密算法。

- 非对称加密:发送发和接收方通过不同的密钥加解密的过程就是非对称加密。发送方通过公钥加密后的密文,接收方通过私钥解密密文成明文。公钥就是公开的,让全部发送方使用,私钥是保密的,不能公开,专门供接收方解密收到的密文,没有私钥的第三方就无法解密密文,从而保证了数据传输的安全性。

非对称加密的代表算法是 RSA 算法,其是目前最有影响力的公钥加密算法,并且被普遍认为是目前最优秀的公钥方案之一。本文也将做专门介绍。
RSA 公钥加密算法是 1977 年由 Ron Rivest、Adi Shamirh 和 Len Adleman 在美国麻省理工学院开发的,RSA 取名来自开发他们三者的名字。
RSA 是第一个能同时用于加密和数字签名的算法,它能够抵抗到目前为止已知的所有密码攻击,已被 ISO 推荐为公钥数据加密标准。
RSA 公开密钥密码体制的原理是:根据数论,寻求两个大素数比较简单,而将它们的乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。
强大的加密算法也存在一些缺点:
- 产生密钥很麻烦,受到素数产生技术的限制,因而难以做到一次一密(密钥只能使用一次,永远不对其它消息重复使用)。
- 分组长度太大,为保证安全性,n 至少也要 600bits 以上,使运算代价很高,尤其是速度较慢,较对称密码算法慢几个数量级;且随着大数分解技术的发展,这个长度还在增加,不利于数据格式的标准化。目前,SET(Secure Electronic Transaction) 协议中要求 CA 采用 2048bits 长的密钥,其他实体使用 1024bits 的密钥。
- RSA 密钥长度随着保密级别提高,增加很快。
同样的明文经 RSA 公钥加密后的结果,每次都不同。下面简单说明一下:
不管是使用RSA私钥进行签名还是公钥进行加密,操作中都需要对待处理的数据先进行填充,然后再对填充后的数据进行加密处理。
EB = 00 || BT || PS || 00 || D
- D: data (指待处理数据,即填充前的原始数据)
- PS: padding string (填充字符串)
- BT: block type (数据块类型)
- EB: encryption block (待加密的数据块,经过填充后结果)
- ||: 表示连接操作 (X||Y 表示将 X 和 Y 的内容连接到一起)
"填充后数据" = "00" + "数据块类型" + "填充字符串" + "00" + "原始数据"
对私钥处理的数据,BT 取值为 00 或 01:
- BT 取值为 00 时,PS 为全 00 的字符串;
- BT 取值为 01 时,PS 为全 FF 的字符串,通过填充得到的整数会足够大,可以阻止某些攻击,因此也是推荐的填充方式。
针对公钥处理的数据,BT 取值为 02:
- 使用伪随机的 16 进制字符串填充 PS,而且每次操作进行填充的伪随机书都是独立的。
可见,针对公钥处理的数据,其填充内容为伪随机(限制范围的随机数)的 16 进制字符串,每次操作的填充内容都不一样。因此每次使用公钥加密数据得到的结果就不一样了。
参考:为什么RSA公钥每次加密得到的结果都不一样? 通俗易懂的对称加密与非对称加密原理浅析
一、C# 语言实现
首先需要安装一个包:BouncyCastle.NetCore。
注意:检验密文是的选项可参考以下值,Hash:SHA-256;MGFHash:SHA-256;填充模式:ENCRYPTION_PKCS1。
// 测试
RsaSecretKey rSASecretKey = SecurityRSA.GenerateRsaSecretKey(1024);
// 密钥示例:(每次结果都不同)
// MIICdQIBADANBgkqh

最低0.47元/天 解锁文章
1765

被折叠的 条评论
为什么被折叠?



