20.5 OpenSSL 套接字RSA加密传输
RSA算法同样可以用于加密传输,但此类加密算法虽然非常安全,但通常不会用于大量的数据传输,这是因为RSA
算法加解密过程涉及大量的数学运算,尤其是模幂运算(即计算大数的幂模运算),这些运算对于计算机而言是十分耗时。
其次在RSA
算法中,加密数据的长度不能超过密钥长度减去一定的填充长度。一般情况下,当RSA密钥长度为1024
位时,可以加密长度为128
字节,密钥长度为2048
位时,可以加密长度为245
字节;当密钥长度为3072
位时,可以加密长度为371
字节。因此,如果需要加密的数据长度超过了密钥长度允许的范围,可以采用分段加密的方法。我们可以将数据包切割为每个128
个字符,这样就可以实现循环传输大量字符串。
20.5.1 加解密算法封装
在之前的章节中我们都是使用命令行的方式手动生成密钥对文件,其实在OpenSSL
中我们完全可以使用SDK
提供的函数自动生成对应的加密密钥对文件,如下一段代码中,CreateRSAPEM
则是一个生成密钥对的函数,分别向该函数内传递一个公钥,私钥,以及数据长度,即可得到两个RSA文件。
|
代码运行后会分别在当前目录下生成public.rsa
公钥及private.rsa
私钥两个文件,如下图所示;
接着就是对加解密函数的封装实现,为了能更好的实现网络传输,如下是封装的四个函数,其中public_rsa_encrypt
用于使用公钥对字符串进行加密,private_rsa_decrypt
函数使用私钥对字符串进行解密,private_rsa_encrypt
使用私钥加密,public_rsa_decrypt
使用公钥解密,读者可根据自己的实际需求选择不同的加解密函数。
// 使用公钥加密 |
当我们需要使用公钥加密时可以调用public_rsa_encrypt
函数并依次传入加密前的字符串,公钥路径以及加密后的存储位置,当需要解密时则调用private_rsa_decrypt
函数实现对加密字符串的解密操作,使用代码如下所示;
int main(int argc, char* argv[]) |
读者可自行编译并运行上述代码,即可看到加解密数据输出,如下图所示;
将这个流程反过来使用,使用私钥对数据进行加密,使用公钥实现解密,代码如下所示;
int main(int argc, char* argv[]) |
私钥加密公钥解密,输出效果图如下所示;
20.5.2 加密传输字符串
当具备了上述加解密函数实现流程后,接下来就可以实现针对字符串的加密传输功能了,因为我们采用的是1024
位的密钥所以每次只能传输128
个字符,为了能传输大量字符则需要对字符进行分块,通过CutSplit()
函数将字符串每100
个字符切割一次,然后在客户端中先使用公钥对其进行加密,加密后分块每次传输一批次的加密数据即可,直到将完整的字符串发送完成为止。
|
而对于服务端
代码实现部分则需要与客户端保持一致,服务端发送多少次客户端就接收多少次,首先服务端接收需要接收的数据包次数,并以此作为循环条件使用,通过不间断的循环接受数据包,并调用private_rsa_decrypt
完成数据包的解密工作,最终将数据包拼接成recv_message_all
并输出完整包。
|
读者可自行填充客户端中的buf
待发送字符串长度,填充好以后首先运行服务端,接着运行客户端,此时数据包将会被加密传输,在对端解密并输出如下图所示的结果;