什么是RSA
RSA是一种公钥密码算法,它的名字是由它的三位开发者,即Ron Rivest、Adi Shamir 和 Leonard Adleman的姓氏的首字母组成的( Rivest-Shamir-Adleman )。
RSA可以被用于公钥密码和数字签名。
RSA加密
在RSA中,明文、密钥和密文都是数字。RSA的加密过程可以用下列公式来表达:
密文=明文E mod N (RSA加密)
RSA的密文是对代表明文的数字的E次方求mod N的结果。换句话说,就是将
明文和自己做E次乘法,然后将其结果除以N求余数,这个余数就是密文。
加密公式中出现的两个数E
和 N
,到底都是什么数呢? RSA的加密是求明文的E
次方mod N
,因此只要知道E和N这两个数,任何人都可以完成加密的运算。所以说,E
和 N
是RSA加密的密钥,也就是说,E
和 N
的组合就是公钥。
RSA解密
RSA的解密和加密一样简单,可以用下面的公式来表达:
明文=密文 D mod N ( RSA解密)
表示密文的数字的D次方求 mod N就可以得到明文。
这里所使用的数字N和加密时使用的数字N是相同的。数 D
和数 N
组合起来就是RSA的解密密钥,因此D和N的组合就是私钥。
在RSA中,加密和解密的形式是相同的。加密是求“明文的E次方的 mod
N”,而解密则是求“密文的D次方的 mod N”。
生成密钥对
在RSA中,加密是求“明文的E次方的 mod
N”,而解密则是求“密文的D次方的 mod N”。
由于E和N是公钥,D和N是私钥,因此求E、D和N这三个数就是生成密钥对。
生成私钥公钥步骤
用 Linux或者mac 上自带,命令如下,完成制作非对称加密的秘钥对(公钥和私钥)
1.生成 RSA 私钥(传统格式的)
openssl genrsa -out rsa_private_key.pem 1024
2.将传统格式的私钥转换成 PKCS#8 格式的(JAVA需要使用的私钥需要经过PKCS#8编码,PHP程序不需要,可以直接略过),这个过程需要输入两遍密码,是针对私钥的密码,不要密码直接按回车
openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM
3.生成 RSA 公钥
openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
此时在系统根目录已经生成了两个文件。可以直接使用cat
命令查看文件中的内容
代码实现加密以及解密过程
1 |
|
输出1
24bf96c2a3d83a71745ebc15441046f2ca0bc2cffab73a0a452bcb5c3b58ee717585e779df5046a31f71a6abf650e097f86e4ee95cb14ddd121794763a556987a965be2ec9eb47ff1cf17adcc166bc349a2471f24b924d50927b41bb61d4c0f357949a05e1f00db870582e00e7234e35923e6f1eae3021892590458af3b790f8a
hello world
代码实现生成公钥私钥来加密和解密
1 | func main() { |