详细了解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

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

猜你喜欢

转载自blog.csdn.net/csdn_yudong/article/details/126461122