RSA-演变过程、原理、特点(加解密及签名)及公钥私钥的生成
本篇是iOS逆向开发总结的第一篇文章,是关于iOS密码学的相关技术分析和总结,希望对大家有所帮助,如果有错误地方欢迎指正。
一、前言
密码学的历史追溯到2000年前,相传古罗马凯撒大帝为了防止敌方截获情报,用密码传送情报。凯撒大帝的做法比较简单,通过对二十几个罗马字母表建立一张对应的表格,这样如果不知道密码,截获也会没有用。
在1976年前,所有的加密方法都是同一种模式:加密、解密使用同一种算法。在数据交互的时候,彼此通信双方就必须将规则告诉对方,否则就没法解密。加密和解密的规则也就是密钥,保护它尤为显得重要,传递密钥就成了最大的隐患。这种加密方式被称为对称加密算法。
1977年有三位麻省理工学院的数学家罗纳德.李维斯特(Ron Rivest)、阿迪.萨默尔(Adi Shamir)和伦纳德.阿德曼(Leonard Adleman)一起设计了算法,可以实现非对称加密。这个算法就是用三个人的名字命名,叫做RSA算法
RSA加密方式比较特殊,需要两个密钥:公开密钥简称公钥(publickey)和私有秘钥简称私钥(privatekey)。公钥加密,私钥加密;私钥加密,公钥解密。这个算法就是伟大的RSA算法。
- RSA加密或者签名后的结果都是不可逆的二进制,使用时大部分都会转换为BASE64码再传输。
- RSA加密时,对要加密的数据大小有限制,最大不大于密钥的长度。列如在使用1024bit的密钥时(
genrsa -out rsa_private_key.pem 1024
),最大可以加密到1024/8 = 128Bytes的数据。数据大于128Bytes时,此时就需要对数据进行分组加密--因为数据超限,加解密就会失效,openssl会返回false ,分组加密之后的加密串拼接成一个字符串后发送到客户端。 - 为了保证每次加密的结果都不相同,RSA加密时在待加密数据之后拼接一个随机字符串,然后再进行加密。不同的填充方式Padding表示字符串的不同长度,在对超限数据进行分组之后,会按照Padding指定的长度添加到随机字符串。列如Padding填充方式使用默认OPENSSL_PKCS1_PADDING(需要占用11个字节用于填充)那么这样明文长度最多就是128-11=117Bytes。
- 接收方解密也需要分组。将加密后的原始二进制数据每128 Bytes分为一组中,然后再进行解密,解密之后,根据Padding的长度进行丢弃随机字符串,把得到的原字符串拼接起来,就得到原始报文。
二、RSA原理
RSA算法的可靠性基础: 对极大整数做因数分解是很困难的。
RSA是非对称算法,加解密使用不同的密钥。
两个密钥都是可以用于加密,解密时需要另一个密钥。但是,通常用公钥加密,私钥进行解密,因为公钥是公开的。理论上A和B之间通过RSA实现保密通信,需要A和B各自生成一组密钥来,同时保管好自己的私钥;而用对方的公钥加密要发送的消息,用自己的私钥解密对方发过来的消息。
在签名的场景下,用私钥进行签名,公钥验证。
RSA比DES等对称加密要慢的多。一般在实际传输数据时,用RSA加密比较短的对称密码,双方交换密码后再使用DES等对称算法传输数据。
2.1 欧拉函数
欧拉函数: 求小于N的正整数中与N互质的数的个数
例如: 对应5, 与5互质的数总共有1,3,也就是φ(N) = 2。
RSA算法是运用欧拉函数一个特例,如果N可以分解成两个互质的整数的积: N = pq
则: φ(N) = φ(p)φ(q) = (p−1)(q−1)
例如: φ(35947) = φ(103)φ(349) = (103−1)(349−1)=35496
2.2 模反元素
两个正整数a和n互质,那么一定能找到整数b,使得ab -1 被n来整除,也就是ab ≡ 1 (mod n)
这时侯,b被叫做a的模反元素
RSA加密过程:
- 取两个质数p1,p2
- 确定了n值,n = p1 * p2, n值一般会很大程度为1024个二进制位;
- 确定φ(n),这样
φ(n)=(p1-1) * (p2-1);
- 确定e值,
1<e<φ(n)
,e
为整数而且与φ(n)
互质; - 确定d值,
e*d%φ(n)=1;
- 加密 c = m^e%n;
- 解密 m=c^d%n
实际的验证:
- p1 = 3, p2 = 7;
- n = p1 * p2 = 3 * 7 = 21;
- φ(n)=(p1-1) * (p2-1)=2*6=12;
- 1 < e < 12, e = 5 (12 与 e互质则取值{1,5,7,11}, φ(12) = 4)
- e * d % φ(n) = 5 * d % 12 = 1,则d =17
- 设置明文 m = 3, 则 c = m ^ e % n = 3 ^ 5 % 21 = 12
- 解密密文 m = c ^ d % n = 12 ^ 17 % 21 = 3
下面是数据传输过程图解:
三、OpenSSL
openSSL是苹果系统内置的开源加密库,这样我们就可以通过终端来获取私钥公钥,进行数据加密.
主要命令:
1. 生成RSA私钥
openssl genrsa -out private.pem
2. 从私钥中提取出公钥
openssl rsa -in private.pem -pubout -out public.pem
3. 将私钥转换成为明文
openssl rsa -in private.pem -text -out private.txt
4. 经过公钥进行加密
openssl rsautl -encrypt -in message.txt -inkey public.pem -pubin -out enmsg.txt
5. 经过私钥进行解密
openssl rsautl -decrypt -in enmsg.txt -inkey private.pem -out demsg.txt
6. 经过私钥进行加密
openssl rsautl -sign -in message.txt -inkey private.pem -out enmsg2.txt
7. 经过公钥进行解密
openssl rsautl -verify -in enmsg2.txt -inkey public.pem -pubin -out demsg2.txt
终端使用:
1.创建公钥私钥
2. 查看私钥公钥
3.创建文本
4. 公钥加密
5. 私钥解密
6. 私钥加密
7. 公钥解密
通过上面的7种方式,得到如下结果图解:
大家可以通过终端尝试上面的命令,用起来撒!!!
以后就是关于RSA的基本讲解,希望对大家有所帮助!!!下一篇将讲解哈希算法在逆向的使用!
RSA-演变过程、原理、特点(加解密及签名)及公钥私钥的生成的更多相关文章
- 调用OpenSSL实现RSA加解密和签名操作
调用OpenSSL实现RSA加解密和签名操作 RSA公钥可以从证书和公钥文件,RSA私钥可以从私钥文件中提取.OpenSSL使用了一种BIO抽象IO机制读写所用文件,可以打开文件相关联的BIO,通过B ...
- RSA - 原理、特点(加解密及签名验签)及公钥和私钥的生成
Wiki - RSA加密演算法 Wiki - 欧拉函数 Wiki - 模反元素 ASN.1 格式标准 RSA算法原理(二) 注意: RSA 加密或签名后的结果是不可读的二进制,使用时经常会转为 BAS ...
- 使用非对称算法RSA实现加解密和使用签名算法SHA1WithRSA、MD5withRSA生成签名以及验签
不啰嗦,直接上源码 package com.hudai.platform.manager.util; import java.io.ByteArrayOutputStream; import java ...
- [Python3] RSA的加解密和签名/验签实现 -- 使用pycrytodome
Crypto 包介绍: pycrypto,pycrytodome 和 crypto 是一个东西,crypto 在 python 上面的名字是 pycrypto 它是一个第三方库,但是已经停止更新,所以 ...
- Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(加解密)
转自http://www.cppblog.com/ArthasLee/archive/2010/12/01/135186.html 最近,基于某些原因和需要,笔者需要去了解一下Crypto++库,然后 ...
- 编码,加解密,签名,Hash
工作中会听到各种各样是是而非的词汇,base64,url,sha256,rsa,hash等等,你能很好的分清这些词语吗? 这次我想把它们统一的整理说明下: 一: 编码 编码是信息从一种形式或格式转换为 ...
- Java实现RSA密钥对并在加解密、加签验签中应用的实例
一.项目结构 二.代码具体实现 1.密钥对生成的两种方式:一种生成公钥私文件,一种生成公钥私串 KeyPairGenUtil.java package com.wangjinxiang.genkey. ...
- RSA算法原理与加密解密 求私钥等价求求模反元素 等价于分解出2个质数 (r*X+1)%[(p-1)(q-1)]=0
Rsapaper.pdf http://people.csail.mit.edu/rivest/Rsapaper.pdf [概述Abstract 1.将字符串按照双方约定的规则转化为小于n的正整数m, ...
- OpenSSL RSA加解密 (.Net公钥加密/ Linux端私钥解密)
要求在.Net端生成公钥私钥对. 然后在.Net端使用RSA公钥加密:在Linux端使用RSA私钥解密. 最初的尝试是:.Net端使用RSACryptoServiceProvider; linux端使 ...
随机推荐
- asp.net core razor自定义taghelper
又一个新的名词(taghelper),这个名词在netcore razor中也替代了(Htmlhelper),通过taghelper是可以操作html标签.条件输出.更是自由添加内外元素.当然也内置了 ...
- C#中的根据实体增删改操作
在日常操作中,我们经常会对一些数据进行批量更新, 我在使用EF的时候,没有找到比较好的批量更新的解决方案, 便参考了张占岭前辈的博客,整合了这么一个简略版的使用实体类生成数据库增删改SQL的操作类 在 ...
- 5、链表队列(java实现)
1.图例 2.链表节点 public class Node<T> { public T data; public Node next; } 3.具体实现 public class Link ...
- 磁盘告警之---神奇的魔法(Sparse file)
一.问题来源 半夜钉钉接到告警,某台机器的磁盘使用率少于20%,于是迷糊中爬起来,咔咔咔 find / -size +1G,咔咔咔,把几个只有4-5G的日志文件echo空值了一下,然后吓蒙了,刚刚 ...
- 04.Django基础四之模板系统
一 语法 模板渲染的官方文档 关于模板渲染你只需要记两种特殊符号(语法): {{ }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 二 变量 在Django的模板语言中按此语法使用:{ ...
- Navicat Premium 连oralce报错:oracle library is not loaded
我装的Navicat Premium是64位的,计算机也是64位的,故在oracle网上下了一个64位的instantclient-basic-windows.x64-11.2.0.4.0.zip 地 ...
- JSP自定义标签的使用简化版
在jsp中 如果不想页面中出现java代码 这个时候就需要使用到jsp的自定义标签库技术了 自定义标签库 能够有效的减少jsp中java代码的出现 使其更加自然的像html页面一样 如果要使用jsp自 ...
- CDH 5.9.3 集群配置
-----------------------------------------集群规划------------------------------------------ hostname ip ...
- TypeScript中使用getElementXXX()
如果只是看解决方法,可以直接跳到第二小节 简述 Angular 1.x版本是用JavaScript编写的,我们在百度Angular经常会搜索到AngularJS,并不是JavaScript的什么衍生版 ...
- 使用apache的poi来实现数据导出到excel的功能——方式二
此次,介绍利用poi与layui table结合导出excel.这次不需要从数据库中查询出来的数据进行每一行的拼接那么麻烦,我们这次将标题定义一个id值,对应从数据库中查找出来的字段名即可. 1.po ...