文章目录
  1. 1. RSA
    1. 1.1. 两个概念
    2. 1.2. 签名的一般做法和作用
    3. 1.3. 中间人攻击和CA
  2. 2. Openssl 实践
    1. 2.1. RSA相关命令
    2. 2.2. 证书格式说明
  3. 3. 参考
  4. 4. 下一步

最近iOS客户端开发需要用到RSA加密与服务端通信,还未涉及过此方面知识,写篇文章学习下。这篇介绍RSA,签名相关概念和openssl证书生成的相关命令。

RSA

RSA是经典的非对称加密算法。原理就不多介绍了,不研究密码学也没必要深入了解。加解密流程也比简单。但是其中的密钥交换,数字签名,认证中心比较繁琐。画个图

两个概念

  • 加密:发送者使用接受者的公钥对发送信息进行加密操作
  • 签名:发送者使用自己私钥对信息进行的加密操作

签名的一般做法和作用

发送报文时,发送方用一个哈希函数从报文文本中生成报文摘要,然后用自己的私人密钥对这个摘要进行加密,这个加密后的摘要将作为报文的数字签名和报文一起发送给接收方,接收方首先用与发送方一样的哈希函数从接收到的原始报文中计算出报文摘要,接着再用发送方的公用密钥来对报文附加的数字签名进行解密,如果这两个摘要相同、那么接收方就能确认该数字签名是发送方的。

签名有两个重要作用:

  • 确定消息确实是由发送方签名并发出来的。
  • 数字签名能确定消息的完整性。因为数字签名的特点是它代表了文件的特征,文件如果发生改变,数字摘要的值也将发生变化。不同的文件将得到不同的数字摘要。

中间人攻击和CA

关于中间人攻击维基百科解释的非常好,而且配了生动的示例wiki-中间人攻击

中间人是破坏了通信中的密钥分配环节,把自己的公钥伪装成别人公钥。 CA(Certificate Authority)就是专门提供网络身份认证服务的机构。

Openssl 实践

OpenSSL是一个开放源代码的软件库包,应用程序可以使用这个包来进行安全通信,避免窃听,同时确认另一端连接者的身份。这个包广泛被应用在互联网的网页服务器上。其主要库是以C语言所写成,实现了基本的加密功能,实现了SSL与TLS协议。下面解释是Openssl在RSA方面的命令

RSA相关命令

生成私钥

1
openssl genrsa -out root_private_key.pem 1024

创建公钥

1
openssl rsa -in root_private_key.pem -out root_public_key.pem -pubout

公私钥是一一对应的,所以生成公钥需要指定一个私钥。

加密文件

1
openssl rsautl -encrypt -pubin -inkey root_public_key.pem -in plain.txt -out cipher.txt

解密文件

1
openssl rsautl -decrypt -inkey root_private_key.pem -in cipher.txt -out plain.txt

如果加密/解密文件过大,会报”openssl data greater than mod len”错误。这是因为RSA算法对加密文件的长度是有限制的。过大的话需要分片加密。(测试的时候加密”hello”可以,加密”hello world!”,解密的时候竟然就报错了)

创建证书请求

1
openssl req -new -out root-req.csr -key root_private_key.pem -keyform PEM

为了证实身份证书请求要用私钥签名。

自签生成公钥证书

1
openssl x509 -req -in root-req.csr -out root_public_key.der -outform der -signkey root_private_key.pem -days 3650

也可以导出cer格式的证书, 就可以使用cer格式的证书和密钥导出p12格式的信息交换文件

1
openssl x509 -req -in root-req.csr -out root_public_key.cer -signkey root_private_key.pem -days 3650

在这一步中我们自己扮演了CA角色

导出p12格式证书

1
openssl pkcs12 -export -clcerts -in root-cert.cer -inkey root_private_key.pem -out root.p12

p12文件通常用于保存个人私钥

自签根证书

1
openssl x509 -req -in root-req.csr -out root-cert.cer -signkey root_private_key.pem -CAcreateserial -days 3650

证书格式说明

格式 说明
pem PEM(Privacy Enhanced Mail)是openssl默认采用的信息存放方式。一般包含内容类型、头信息和信息体(BASE64编码的数据)
csr (Certificate Signing Request)即证书签名请求,这个并不是证书,而是向权威证书颁发机构获得签名证书的申请,其核心内容是一个公钥
der (Distinguished Encoding Rules)二进制格式的证书文件,不可读
p12 以pkcs#12格式存储的证书和相应私钥,他通常包含保护密码,2进制方式 通常用于保存个人私钥
crt/cer 用于存放证书,2进制形式

参考

RSA加密算法
再谈RSA-客户端与服务器互通

下一步

接下来我们将使用iOS的Security框架,在iOS端实现RSA加解密。