iOS小技能:RSA签名、验签、加密、解密的原理

1,918 阅读5分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第2天,点击查看活动详情

引言

  1. 对称加密算法:数据发送方将明文和密钥一起经过特殊加密算法处理成密文后,将它发送出去。接收方收到密文后,若想解读原文,则需要使用加密用到的相同密钥及相同算法的逆算法对密文进行解密,才能使其恢复成原文。

最典型的问题就是如何同步这个密钥,同步过程如果在公网上,不进行加密是可以抓包拿到的,那么这里就遇到了要对密钥加密的问题。

常见的对称加密算法有 AES、DES、Blowfish

  1. 非对称加密算法:如果用公钥进行加密,只有用对应的私钥才能解密;如果用私钥进行加密,只有用对应的公钥才能解密。比如,私钥签名、公钥验签;公钥加密、私钥解密。

通常公钥是公开的,可能同时多人持有。

非对称加密算法实现机密信息的交换过程为:甲方生成一对密钥并将其中一个作为公钥向其他方公开;得到该公钥的乙方使用该密钥对机密信息进行加密后发送给甲方;甲方再用自己的另一个专用密钥对加密后的信息进行解密。

I RSA算法流程

RSA是最有名的非对称加密算法,公钥和私钥之间是基于数论知识生成的。

1.1 算法原理

数论知识:给出两个素数,很容易将它们相乘,然而给出它们的乘积,想得到这两个素数就显得尤为困难。

RSA加密算法的原理是对一极大整数做因数分解的困难性来保证安全性,如果能够解决大整数(比如几百位的整数)分解的快速方法,那么 RSA 算法将轻易被破解。

非对称加密随着密钥变长,安全性上升的同时性能也会有所下降。

RSA加密对明文的长度有所限制,规定需加密的明文最大长度=密钥长度-11(单位是字节,即byte),所以在加密和解密的过程中需要分块进行。

而密钥默认是1024位,即1024位/8位-11=128-11=117字节。所以默认加密前的明文最大长度117字节,解密密文最大长度为128字。

那么为啥两者相差11字节?是因为RSA加密使用到了填充模式(padding),即内容不足117字节时会自动填满,用到填充模式自然会占用一定的字节,而且这部分字节也是参与加密的。

1.2 公钥和私钥的生成

步骤:

  1. 准备两个非常大的素数 p和 q(转换成二进制后,或者更多位数,位数越多越难破解)。
  2. 利用字符串模拟计算大素数 p和q的乘积 n=pq。
  3. 同样方法计算 m=(p-1)(q-1),这里的m 为n 的欧拉函数;
  4. 找到一个数e(1<e<m) ,满足 gcd(m,e)=1(即 e 和 m 互素)
  5. 计算e 在模m 域上的逆元d (即满足 ed mod m=1)
  6. (n,e) 为公钥,(n,d) 为私钥;

需要的文件(iOS专用): 由rsa_private_key.pem生成csr -> 生成crt -> 生成der -> 生成p12

    ios     ==> rsacert.der             rsa加密、sha验签
    ios     ==> p.p12                   rsa解密、sha加签

RSA密钥生成命令:

  1. 创建整数请求: openssl>req -new -key rsa_private_key.pem -out rsacert.csr

  2. 生成整数并签名,10年有效期: openssl>x509 -req -days 3650 -in rsacert.csr -signkey rsa_private_key.pem -out rsacert.crt

  3. 转换格式:将 PEM 格式文件转换成 DER 格式 (公钥) openssl>x509 -outform der -in rsacert.crt -out rsacert.der

  4. 导出P12文件 (私钥) openssl>pkcs12 -export -out p.p12 -inkey rsa_private_key.pem -in rsacert.crt

注意:“>”符号后面的才是需要输入的命令。

1.3 RSA 加密

对于明文x ,用公钥 (n,e) 对x 加密的过程,就是将x 转换成数字(字符串的话取其 ASCII码、base64b编码或者 unicode 值),然后通过幂取模计算出密文y 。

1.4 RSA 解密

对于密文y ,用私钥(n,d) 对y进行解密,和加密类似,同样是计算幂取模;

1.5 RSA加密、签名区别

  加密和签名都是为了安全性考虑,加密是为了防止信息被泄露,而签名是为了防止信息被篡改。

1.6 RSA签名的过程

  1. A生成一对密钥(公钥和私钥),私钥不公开,A自己保留。公钥公开,任何人可以获取。
  2. A用自己的私钥对消息加签,形成签名sign,并将加签的消息和消息本身一起传递给B。
  3. B收到消息后,在获取A的公钥进行验签,如果验签出来的内容与消息本身一致,证明消息是A回复的。

II 代码实现

2.1 RSA签名算法和加密算法的实现

blog.csdn.net/z929118967/…

2.2 请求参数按照ASCII码从小到大排序

iOS 安全规范指南之【对请求参数进行签名】请求参数按照ASCII码从小到大排序、拼接、加密(采用递归的方式进行实现)应用案例:条码支付综合前置平台申请退款

demo地址:download.csdn.net/download/u0…

  1. demo 数组用[]表示,对象(字典)用{} 表示进行排序拼接。
  2. 数组排序可选,数组内部,只对字符串元素进行排序,并不与字典key参与排序。 字典和数组独立排序

———————————————— 版权声明:本文为CSDN博主「iOS逆向」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请>附上原文出处链接及本声明。 原文链接:blog.csdn.net/z929118967/…

see also

公号:iOS逆向

相关关键词:EncryptsignRSA