OpenSSL: 简单易上手的RSA加解密
简介
这篇文章是继 OpenSSL: 用VS2017创建C工程、OpenSSL: 完成VS2017的配置 两篇文章的第3篇,前两篇分别跟大家分享了如何在 visual studio2017
中创建C工程,配置OpenSSL的开发环境以及使用 openssl
开源库实现base64的编解码。
本篇跟大家分享如何使用 openssl
开源库实现 RSA 的加密和解密,不过这一篇是对简单的数据进行加解密,下一篇继续跟大家分享复杂一点的 RSA 加解密过程以及实例代码。
2019 即将被画上句号,自己还有很多愿望没有实现。一拿起书就感觉困,一拿起手机觉得黑夜里阳光明媚,无药可救了呀!
获取公、私钥
在 precompiled-openssl 获取的压缩包中,解压可以在 bin64或者bin(32位操作系统使用) 目录下面找到 openssl.exe
文件,双击打开即可。
生成私钥
执行下面代码,如下:
1 | genrsa -out rsa_private_key.pem 1024 |
此时在 bin64 目录下会生成 rsa_private_key.pem
文件,即私钥文件;
将 RSA 私钥转换成 PKCS8
格式,执行如下代码:
1 | pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt |
生成公钥
执行下面代码,如下:
1 | rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem |
此时在 bin64 目录下会生成 rsa_public_key.pem
文件,即公钥文件;
用VS Code打开这两个文件,可以看到具体内容,在我的机器上生成的公钥:
1 | -----BEGIN PUBLIC KEY----- |
私钥,如下:
1 | -----BEGIN PRIVATE KEY----- |
紧接着我会使用这对公私钥进行编码。
RSA 实战
RSA加密算法是一种非对称加密算法。在公开密钥加密和电子商业中RSA被广泛使用。RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。
1973年,在英国政府通讯总部工作的数学家克利福德·柯克斯(Clifford Cocks)在一个内部文件中提出了一个相同的算法,但他的发现被列入机密,一直到1997年才被发表。
对极大整数做因数分解的难度决定了RSA算法的可靠性。换言之,对一极大整数做因数分解愈困难,RSA算法愈可靠。假如有人找到一种快速因数分解的算法的话,那么用RSA加密的信息的可靠性就肯定会极度下降。但找到这样的算法的可能性是非常小的。今天只有短的RSA钥匙才可能被强力方式解破。到目前为止,世界上还没有任何可靠的攻击RSA算法的方式。只要其钥匙的长度足够长,用RSA加密的信息实际上是不能被解破的。
1983年麻省理工学院在美国为RSA算法申请了专利。这个专利2000年9月21日失效。由于该算法在申请专利前就已经被发表了,在世界上大多数其它地区这个专利权不被承认。
新建头文件 mzc_rsa.h
,声明几个函数,如下:
1 |
|
对应的实现文件 mzc_rsa.c
,代码如下:
1 |
|
注意这里使用的 RSA 对齐模式是 RSA_PKCS1_PADDING
。
在测试的主函数(main)中,使用明文 www.veryitman.com
作为示例进行加密和解密操作,我在下面只列出关键实现。具体代码可以去 Github 下载,注意 clone rsa-feature
这个分支。
1 | /* 公钥加密, 私钥解密 */ |
今天到此为止,累了,睡觉了😜。
活着不是靠泪水搏取同情,而是靠汗水获得掌声~