详细了解RSA

RSA概述

首先看这个加密算法的命名。很有意思,它其实是三个人的名字。早在1977年由麻省理工学院的三位数学家 RivestShamirAdleman 一起提出了这个加密算法,并且用他们三个人姓氏开头字母命名。

RSA 加密算法是一种非对称加密算法,其玩法打破了以往所有加密算法的规则。在 RSA 出现之前,所有的加密方法都是同一种模式:加密解密的规则使用同一种方式。这种长达几个世纪的加密方案有一个致命的缺陷。在传递加密信息时,必须让对方拿到解密的规则才能正常解密。由于加密解密的规则一致,所以保存和传递 “密钥”,就成了最头疼的问题。

RSA 的出现解决了这个问题.我们来看看 RSA 是怎么玩的。

RSA加密/解密

  • 使用公钥加密的数据,利用私钥进行解密
  • 使用私钥加密的数据,利用公钥进行解密

没错,RSA 加密使用了"一对"密钥。分别是公钥私钥,这个公钥和私钥其实就是一组数字!其二进制位长度可以是 1024 位或者 2048 位。长度越长其加密强度越大,目前为止公之于众的能破解的最大长度为 768 位密钥,只要高于 768 位,相对就比较安全。所以目前为止,这种加密算法一直被广泛使用。

RSA的弊端

由于 RSA 算法的原理都是大数计算,使得 RSA 最快的情况也比对称加密算法慢上好几倍。速度一直是 RSA 的缺陷,一般来说 RSA 只用于小数据的加密。RSA 的速度是对应同样安全级别的对称加密算法的 1/1000 左右。

RSA终端命令演示

由于 Mac 系统内置 OpenSSL(开源加密库),所以我们可以直接在终端上使用命令来玩 RSA。

OpenSSL 中 RSA 算法常用指令主要有三个,其他指令此处不介绍。

命令含义
genrsa生成并输入一个RSA私钥
rsautl使用RSA密钥进行加密、解密、签名和验证等运算
rsa处理RSA密钥的格式转换等问题

生成 RSA 私钥,密钥长度为 1024bit

openssl genrsa -out private.pem 1024
Generating RSA private key, 1024 bit long modulus
..++++++
..........................................++++++
e is 65537 (0x10001)

从私钥中提取公钥

openssl rsa -in private.pem -pubout -out public.pem
writing RSA key

那么会有两个文件:private.pempublic.pem

那么它里面是什么,我们可以利用终端进行查看。

//查看私钥文件
cat private.pem
-----BEGIN RSA PRIVATE KEY-----
MIICWwIBAAKBgQDbGfA0XdkIpK5h2O9mg5o35pitxwiHDnlpBTCTUH+pkGMdDe6d
9nVQDr61QUEMWAgbnb/irTXh5VigGhHDbG/4kmVy1BgSfLxUx50jmm7jnvnS4Hrb
65g920x26gaBW+I9n9cHF/QShrqaNXP9DDeqhqNzdmrkaaAQQkQ9liN6awIDAQAB
AoGAU0gdvNn7WES4oCrEfPQDF8KIQG3KOQPwdFHrr+NGU161veKA0/xNhTvFk8IV
BqsjkdO5j2EFfTMfJ+Qg4maCfIZN+xknosXRUF3vz5CUz/rXwBupOlOiWFJbB6cV
/Jee045DjiHjciip/ZVd8A2xnUEg4pIFUujAFPH+22t5TvkCQQD73bRqCQF9sWIA
tBeNR10Mygx5wrwKvjgCvaawsgx82kuAb3CWR0G81GfU+lK0YaHdmcFHsAHlDncM
OtY6IPnNAkEA3rKP6+/jUoylsJPWuN9LyuKjtAlsNtbWaYvs8iCNhLyV9hoWjvow
AAZB1uWy5aLDtQI3v48beExwsJEFAlQtFwJASTkKU21s1or0T/oLgtJFdgtjlx6L
JqBojjtus53/zWh1XNCJLddngCtMSHnCA5kCwvcJXvsHgf0zlQWh9GJT3QJAY0+q
EwN1kpiaQzaKqQMbX6zWaDFTitkf4Q2/avLNaYZYMdnMeZJk2X3w2o6wyutc71m/
1rNRAsLD9lmVrEYxnQJAEAHb0lsRgWe/sXX2attg4NbDsEExqDZ+7GGsyvqZn1Xg
S/UPdt6rVkVQ3N7ZEPKV6SxwN9LySI4lVWmFWhCn6w==
-----END RSA PRIVATE KEY-----


//查看公钥文件
cat public.pem
-----BEEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDbGfA0XdkIpK5h2O9mg5o35pit
xwiHDnlpBTCTUH+pkGMdDe6d9nVQDr61QUEMWAgbnb/irTXh5VigGhHDbG/4kmVy
1BgSfLxUx50jmm7jnvnS4Hrb65g920x26gaBW+I9n9cHF/QShrqaNXP9DDeqhqNz
dmrkaaAQQkQ9liN6awIDAQAB
-----END PUBLIC KEY-----

其实就是一个文本文件,并且一看就知道是 base64 编码。那么公钥相比私钥要简单很多。

通过公钥加密数据,私钥解密数据

//生成明文文件
vi message.txt
//查看文件内容
cat message.txt
密码:123456

//通过公钥进行加密
openssl rsautl -encrypt -in message.txt -inkey public.pem -pubin -out enc.txt

//通过私钥进行解密
openssl rsautl -decrypt -in enc.txt -inkey private.pem -out dec.txt

通过私钥加密数据,公钥解密数据

//通过私钥进行加密
openssl rsautl -sign -in message.txt -inkey private.pem -out enc.txt

//通过公钥进行解密
openssl rsautl -verify -in enc.txt -inkey public.pem -pubin -out dec.txt

小结

那么看到这些之后,对 RSA 应该有了一定的了解。由于 RSA 加密运行效率非常低!并不是所有数据加密都会使用它。那么它的主战场在于加密一些小的数据,比如对称加密算法的密钥。又或者数字签名。关于数字签名后续文章我们再详细阐述。

—————————— 【正文完】——————————

写在最后: 约定优于配置 —— 软件开发的简约原则

——————————【完】——————————

我的:
个人网站: https://neveryu.github.io/neveryu/
Github: https://github.com/Neveryu
新浪微博: https://weibo.com/Neveryu
微信: miracle421354532

更多学习资源请关注我的新浪微博…好吗

<think>嗯,用户想了解RSA加密算法的详细信息,包括原理和实现。首先,我得回忆一下RSA的基本概念。RSA是一种非对称加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出。它的安全性基于大数分解的困难性,也就是说,如果有一个很大的合数,将其分解成两个质数相乘的形式是非常困难的。 接下来,我需要整理RSA的密钥生成步骤。根据引用[3],步骤包括选择两个大质数p和q,计算n=p*q,然后计算欧拉函数φ(n)=(p-1)(q-1)。接着选择一个与φ(n)互质的整数e,通常是65537,然后计算e关于φ(n)的模反元素d,也就是满足e*d ≡ 1 mod φ(n)的d。公钥是(e, n),私钥是(d, n)。 加密和解密过程是核心部分。加密时,明文m通过公钥加密成密文c,使用公式c ≡ m^e mod n。解密时,用私钥d计算m ≡ c^d mod n。这里的关键在于欧拉定理的应用,确保解密后的结果正确。需要解释为什么这个数学过程能正确恢复明文,可能需要提到欧拉定理和模运算的性质。 实现方面,用户提供的引用提到了C++实现中的问题,比如模反元素的求解、大数运算等。模反元素d可以通过扩展欧几里得算法来求解,这是解决e和φ(n)互质时找到d的关键。大数运算问题涉及到处理非常大的整数,这在编程中需要特别注意,可能需要使用专门的库来处理,比如GMP库或者自己实现大数类。 另外,引用[1]和[2]都提到RSA的重要性,所以需要强调其应用场景,比如SSL/TLS、数字签名等,同时也要提到它的性能问题,通常用于加密密钥而不是大量数据。 用户可能还会关心RSA的安全性,比如密钥长度的影响,常见的攻击方式如选择密文攻击,以及实际应用中的填充方案比如OAEP,这些虽然用户没直接问,但可能在相关问题中出现,需要提前准备。 在编写实现代码示例时,需要注意使用Python的话虽然简洁,但实际中因为Python的整数可以很大,处理大数运算相对容易,但性能可能不如C++。不过作为示例,Python代码更易懂。需要指出示例仅用于教学,实际应用中需要考虑更多安全性和性能优化。 最后,根据用户提供的引用,需要正确标注引用来源,确保引用的内容与原理和实现部分对应。例如,模反元素的求解和大数运算的问题来自引用[3],而加密解密的数学基础则在引用[1]和[2]中有所提及。 总结一下,回答需要分步骤详细解释RSA的每个阶段,包括数学基础、密钥生成、加密解密过程,以及实现中的挑战和解决方案,同时提供代码示例和相关问题,帮助用户全面理解。</think>### RSA加密算法原理及实现详解 #### 一、RSA算法原理 RSA是一种非对称加密算法,其安全性基于**大整数分解的困难性**。算法流程如下: 1. **选择两个大质数** 随机选择两个不同的质数$p$和$q$,例如$p=61$,$q=53$[^3]。 2. **计算模数$n$** $$n = p \times q = 61 \times 53 = 3233$$ $n$的长度决定了密钥强度,通常为2048位或以上[^2]。 3. **计算欧拉函数$\varphi(n)$** $$\varphi(n) = (p-1)(q-1) = 60 \times 52 = 3120$$ 4. **选择公钥指数$e$** 需满足$1 < e < \varphi(n)$且与$\varphi(n)$互质。常用$e=65537$(平衡效率与安全性)。 5. **计算私钥指数$d$(模反元素)** 求解方程$e \cdot d \equiv 1 \ (\text{mod} \ \varphi(n))$,即: $$d = e^{-1} \ \text{mod} \ \varphi(n)$$ 可通过**扩展欧几里得算法**实现[^3]。 6. **公钥与私钥** - 公钥:$(e, n)$,用于加密 - 私钥:$(d, n)$,用于解密 #### 二、加密与解密过程 1. **加密公式**(明文$m$需满足$m < n$) $$c = m^e \ \text{mod} \ n$$ 2. **解密公式** $$m = c^d \ \text{mod} \ n$$ 数学原理基于欧拉定理:若$m$与$n$互质,则$m^{\varphi(n)} \equiv 1 \ (\text{mod} \ n)$,从而确保解密正确性[^1]。 #### 三、Python实现示例 ```python def rsa_encrypt(m, e, n): return pow(m, e, n) def rsa_decrypt(c, d, n): return pow(c, d, n) # 示例参数 p, q = 61, 53 n = p * q phi = (p-1) * (q-1) e = 17 # 与phi=3120互质 d = 2753 # e的模反元素 # 加密解密测试 m = 123 c = rsa_encrypt(m, e, n) decrypted = rsa_decrypt(c, d, n) print(f"密文: {c}, 解密结果: {decrypted}") # 输出密文: 855, 解密结果: 123 ``` #### 四、关键问题与优化 1. **大数运算** RSA需处理极大整数(如2048位),需依赖高精度库(如Python原生支持大整数,C++中需使用GMP库)[^3]。 2. **质数生成** 使用**Miller-Rabin素性检测**高效生成大质数。 3. **填充方案** 直接加密存在安全隐患,需结合**OAEP填充**防止选择密文攻击。 #### 五、应用场景 - 安全通信(SSL/TLS握手) - 数字签名 - 加密对称算法的密钥(如AES密钥)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值