密码学研究RSA等

第一次学习:

devicetoken

1、我们获取到的NSData类型的devToken就是苹果服务器根据我们这一台设备的UDID和app的bundleID混编而成的deviceToken

2、ios9以前的系统里面:一个设备的token是唯一的。除了升级系统等少量情况,基本不变。 而且在token变了以后,老的token,就被认为是无效了。 苹果不会对这部分无效的token推送。

ios9的系统:一个app每一次重新安装多会产生新的token。 而且老的token不会无效,还可以正常推送。 这个问题,我们在ios9刚发布的时候,我们就向苹果反馈过这个问题,也得到过他们反馈,应该是个bug。但是他们一直也没有修复。 所以这个重担就落在我们头上。

3、

新版的xcode 我们可以将网页直接拖进去。(意外的发现)

写得非常棒,点赞,非常有用的总结。补充一下:DeviceToken不仅仅系统升级的时候会改变,系统重刷,应用删除再安装,DeviceToken都会改变

第二次学习:

以下内容完全参考学习作者,我自己做的笔记:

作者:阮一峰先生

地址:

RSA算法1:

http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html

RSA算法2:

http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html

1、RSA:

企业证书的横64 

高16 ,两数相乘得到的是1024,这个就是密钥,RSA密钥一般是1024位,重要场合则为2048位。

2、RSA是公钥加密算法

1976年以前

所有的加密方法都是同一种模式

(1)甲方选择某一种加密规格,对信息进行加密

(2)乙方使用同一种规格,对信息进行解密

由于加密和解密使用同样的规则(简称”密钥”),这种称为”对称加密算法”

密钥:秘密的钥匙,密钥是一种参数,它是在明文转换为密文或者密文转换为明文的算法中输入的参数。密钥分为对称密钥和非对称密钥。

3、这种(对称加密)加密模式最大的一个弱点:甲方必须把加密规则告诉乙方,否则无法解密。保存和传递密钥,就成了最头疼的问题。

4、1976年,两位美国计算机科学界,D和H提出了崭新的思路,可以在不直接传递密钥的情况下,完成解密。这称为DH密钥交换算法,这个算法启发了其他科学家。人民认识到,加密和解密可以使用不用的规则,只要这两种规则之间存在某种对应关系即可,这样避免了直接传递密钥。

5、这种新的加密模式被称为“非对称加密算法”(这个时候还未实现)

(1)乙生成两把密钥(公钥和私钥)。公钥是公开的,任何人都可以获得,私钥则是保密的。

(2)甲方获取乙方的公钥,然后把它对信息加密

(3)乙方得到加密后的信息,用私钥解密。

6、如果公钥加密的信息只有私钥解的开,那么只要私钥不泄漏,通信就是安全的

7、1977年,三位数学家R,S,A设计了一种算法,可以实现非对称加密,这种算法用他们三个人的名字命名,叫做RSA算法,从那时到现在,RSA算法一直是最广为使用的“非对称加密算法”。毫不夸张的说,只有计算机网路的地方,就有RSA算法。

8、这种算法非常可靠,密钥越长,他就越难破解。根据已经披露的文献,目前被破解的最长RSA密钥是768个二进制位。也就是说,长度超过768位的密钥,还是无法破解(至少没人公开宣布)。因此可以认为,1024位RSA密钥基本安全,2048位密钥极其安全。

9、互质关系。不是质数也可以构成互质关系,比如15 和32 

(1.) 任意两个质数构成互质关系,比如13和61。

(2.) 一个数是质数,另一个数只要不是前者的倍数,两者就构成互质关系,比如3和10。

(3.) 如果两个数之中,较大的那个数是质数,则两者构成互质关系,比如97和57。

(4.) 1和任意一个自然数是都是互质关系,比如1和99。

(5.) p是大于1的整数,则p和p-1构成互质关系,比如57和56。

(6.) p是大于1的奇数,则p和p-2构成互质关系,比如17和15。

10、欧拉函数

任意给定正整数n,请问在小于等于n的正整数之中,有多少个与n构成互质关系?(比如,在1到8中,有多少个数与8构成互质关系)

计算这个值的方法叫做欧拉函数,以φ(n)表示。在1到8之中,与8形成互质关系的是1,3,5,7,所以φ(n) = 4;

(1)如果n=1,则φ(1) = 1,因为1与任何数包括自身都构成互质关系。

(2)如果n是质数,则φ(n) = n - 1.因为质数与小于它的每一个数,都构成互质关系。

(3)如果n是质数的某一次方,即n = n^k(p为质数,k为大于等于1的整数),则

φ (p^k) = p^k - p^k-1

这是因为只有当一个数不包含质数p,才可能与n互质。而包含质数p的数一共p^(k-1)个,即1×p、2×p、3×p、...、p^(k-1)×p,把它们去除,剩下的就是与n互质的数。

φ (p^k) = p^k - p^k-1 = p^k(1-1/p)

(4)如果n可以分解成两个互质的整数之积。

n = p1 × p2

则φ (n) = φ(p1p2) = φ(p1)φ(p2)

(5)因为任何一个大于1的正整数,都可以写成一系列质数的积

n = p1^k1p2^k2….pr^kr

根据第四条结论,得到

φ(n) = φ(p1^k1)φ(p1^k2)……φ(pr^kr)

再根据第三条的结论,得到

φ(n) = p1^k1p2^k2….pr^kr(1-1/p1)(1-1/p2)…(1-1/pr)

也等于

φ(n) = n(1-1/p1)(1-1/p2)…(1-1/pr)

这就是欧拉的通用公式

11、欧拉定理

欧拉函数的用处,在于欧拉定理。欧拉定理指的是:

如果两个正整数a和n互质,则n的欧拉函数φ(n)可以让下面的等式成立:

a^φ(n) 三 1(mod n)

也就是说a的φ(n)次方被n除余数是1。或者说a的φ(n)次方减去1,可以被n整除。

12、欧拉定理的证明比较复杂,这里就省略了。我们只要记住它的结论就行了。

欧拉定理可以大大简化某些运算。比如,7和10互质,根据欧拉定理,

13、欧拉定理有一个特殊情况:

假设正整数a与质数p互质,因为质数p的φ(p)等于p-1,则欧拉定理可以写成

a^p-1 三 1(mod p)

这就是著名的费马小定理,它是欧拉定理的特例

欧拉定理是RSA算法的核心,理解这个定理,就可以理解RSA。

14、还剩下最后一个概念

如果两个正整数a和互质,那么一定可以找到b,使得ab - 1 被n整除,或者说ab被n除余数是1.

ab 三 1 (mod n)

这时,b就叫做a的”模反元素”

15、如果b是a的模反元素,则b + kn都是a的模反元素。

16、欧拉定理可以用来证明模范元素必然存在

a^φ(n) = a × a^φ(n) - 1 三 1(mod n)

可以看到,a的φ(n) - 1 次方就是a的模范元素。

17、RSA

(1)随机产生两个不相等的质数p和q

爱丽丝选择了 61 和 53 。(实际应用中,这两个质数越大,就越难破解)

(2)计算p和q的乘积n

n=p×q = 3233

n的长度就是密钥长度。3233写成二进制 110010100001,一共是12位,实际应用中,RSA密钥一般是1024位,重要场合是2048位置。

(3)计算n的欧拉函数

根据公式

φ(n) = φ(p)×φ(q) = (p-1)(q-1)

爱丽丝算出φ(3233)等于60×52 即3120

(4)随机选择一个整数e,条件是1 < e < φ(n),且e与φ(n)互质(注意是e对欧拉函数值)

爱丽丝选择了1到312o个数之间,选择了17,实际应用中,常常选择65537.

(5)计算e对应φ(n)的模反元素d

所谓模反元素就是指有一个整数d,可以使得ed 被φ(n)除的余数为1

ed = 1(mod φ(n))

=> ed - 1 = k × φ(n)

=>17x + 3120y = 1

这个方程可以用“扩展欧几里得算法”求解,此处省略具体过程,得到一组解(x,y) = (2753,-15),即d = 2753.

至此所有计算完成

18、

结论:如果n可以被因数分解,d就可以算出,也就意味着私钥被破解。

可是,大整数的因数分解,是一件非常困难的事情。目前,除了暴力破解,还没有发现别的有效方法。维基百科这样写道:

"对极大整数做因数分解的难度决定了RSA算法的可靠性。换言之,对一极大整数做因数分解愈困难,RSA算法愈可靠。

  假如有人找到一种快速因数分解的算法,那么RSA的可靠性就会极度下降。但找到这样的算法的可能性是非常小的。今天只有短的RSA密钥才可能被暴力破解。到2008年为止,世界上还没有任何可靠的攻击RSA算法的方式。

  只要密钥长度足够长,用RSA加密的信息实际上是不能被解破的。

19、

假设鲍勃要向爱丽丝发送加密信息m,他就要用爱丽丝的公钥 (n,e) 对m进行加密。这里需要注意,m必须是整数(字符串可以取ascii值或unicode值),且m必须小于n。

20、我们可以看到,如果不知道d(公钥部分元素),就没有办法从c求出m。而前面已经说过,要知道d就必须分解n,这是极难做到的,所以RSA算法保证了通信安全。

21、你可能会问,公钥(n,e) 只能加密小于n的整数m,那么如果要加密大于n的整数,该怎么办?有两种解决方法:一种是把长信息分割成若干段短消息,每段分别加密;另一种是先选择一种"对称性加密算法"(比如DES),用这种算法的密钥加密信息,再用RSA公钥加密DES密钥。

生成密码工具:

http://web.chacuo.net/netrsakeypair

第三次学习:

参考文档:

https://www.jianshu.com/p/ca659dbc6f46

https://zh.wikipedia.org/wiki/RSA加密演算法

对于rsa的几个提问:

(1)什么是公钥,什么是私钥,公钥和私钥都是由两个元素组成,其中包含一个公共元素n(两个大质数的积),(N,e)是公钥,(N,d)是私钥,其他e *d 乘积 = k* &(n) + 1,d是&(n)的模反元素

(2)什么是迪菲赫尔曼密钥交换,这是是

(3)菲赫尔曼密钥交换的作用

就是将将欧拉函数推到出来的公式

分解为两个相对简易的步骤,方便传输,将欧拉函数拆为明文和暗文,也就是(n,e)和(n,d),防止m^e*d作为密文传输,m^e*d太大了,不方便传输的

(4)rsa有就是什么,rsa是三个人,分别是罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman),rsa将迪菲、费尔曼、欧兰做的工作,集合起来,就是牛逼的加密算法

(5)名词解释,m是信息,n是两个大质数的乘积,d是欧拉函数的在e(小于欧拉函数值的一个互质数)下的模反元素。

第四次学习:

转载自:https://my.oschina.net/grittan/blog/3022794 

带你彻底理解RSA算法原理

1. 什么是RSA

RSA算法是现今使用最广泛的公钥密码算法,也是号称地球上最安全的加密算法。在了解RSA算法之前,先熟悉下几个术语 根据密钥的使用方法,可以将密码分为对称密码和公钥密码 对称密码:加密和解密使用同一种密钥的方式

公钥密码:加密和解密使用不同的密码的方式,因此公钥密码通常也称为非对称密码。

2. RSA加密

RSA的加密过程可以使用一个通式来表达

密文=明文EmodN

也就是说RSA加密是对明文的E次方后除以N后求余数的过程。就这么简单?对,就是这么简单。 从通式可知,只要知道E和N任何人都可以进行RSA加密了,所以说E、N是RSA加密的密钥,也就是说E和N的组合就是公钥,我们用(E,N)来表示公钥

公钥=(E,N)

不过E和N不并不是随便什么数都可以的,它们都是经过严格的数学计算得出的,关于E和N拥有什么样的要求及其特性后面会讲到。顺便啰嗦一句E是加密(Encryption)的首字母,N是数字(Number)的首字母

3. RSA解密

RSA的解密同样可以使用一个通式来表达

明文=密文DmodN

也就是说对密文进行D次方后除以N的余数就是明文,这就是RSA解密过程。知道D和N就能进行解密密文了,所以D和N的组合就是私钥

私钥=(D,N)

从上述可以看出RSA的加密方式和解密方式是相同的,加密是求“E次方的mod N”;解密是求“D次方的mod N” 此处D是解密(Decryption)的首字母;N是数字(Number)的首字母。

公钥 (E,N)
私钥 (D,N)
密钥对 (E,D,N)
加密 密文=明文EmodN密文=明文EmodN 解密 明文=密文DmodN

4. 生成密钥对

既然公钥是(E,N),私钥是(D,N)所以密钥对即为(E,D,N)但密钥对是怎样生成的?步骤如下:

  1. 求N
  2. 求L(L为中间过程的中间数)
  3. 求E
  4. 求D

4.1 求N

准备两个质数p,q。这两个数不能太小,太小则会容易破解,将p乘以q就是N

N=p∗q

4.2 求L

L 是 p-1 和 q-1的最小公倍数,可用如下表达式表示

L=(p-1,q-1)

4.3 求E

E必须满足两个条件:E是一个比1大比L小的数,E和L的最大公约数为1 用gcd(X,Y)来表示X,Y的最大公约数则E条件如下:

1 < E < L
gcd(E,L)=1

之所以需要E和L的最大公约数为1是为了保证一定存在解密时需要使用的数D。现在我们已经求出了E和N也就是说我们已经生成了密钥对中的公钥了。

4.4 求D

数D是由数E计算出来的。D、E和L之间必须满足以下关系:

1 < D < L
E*D mod L = 1

只要D满足上述2个条件,则通过E和N进行加密的密文就可以用D和N进行解密。 简单地说条件2是为了保证密文解密后的数据就是明文。 现在私钥自然也已经生成了,密钥对也就自然生成了。 小结下:

求N N= p * q ;p,q为质数
求L L=lcm(p-1,q-1) ;L为p-1、q-1的最小公倍数
求E 1 < E < L,gcd(E,L)=1;E,L最大公约数为1(E和L互质) 求D 1 < D < L,E*D mod L = 1

5 实践下吧

我们用具体的数字来实践下RSA的密钥对对生成,及其加解密对全过程。为方便我们使用较小数字来模拟。

5.1 求N 我们准备两个很小对质数, p = 17 q = 19 N = p * q = 323

5.2 求L L = lcm(p-1, q-1)= lcm(16,18) = 144 144为16和18对最小公倍数

5.3 求E 求E必须要满足2个条件:1 < E < L ,gcd(E,L)=1 即1 < E < 144,gcd(E,144) = 1 E和144互为质数,5显然满足上述2个条件 故E = 5

此时公钥=(E,N)= (5,323)

5.4 求D 求D也必须满足2个条件:1 < D < L,E*D mod L = 1 即1 < D < 144,5 * D mod 144 = 1 显然当D= 29 时满足上述两个条件 1 < 29 < 144 5*29 mod 144 = 145 mod 144 = 1 此时私钥=(D,N)=(29,323)

5.5 加密 准备的明文必须时小于N的数,因为加密或者解密都要mod N其结果必须小于N 假设明文 = 123 则 密文=明文EmodN=1235mod323=225密文=明文EmodN=1235mod323=225 5.6 解密 明文=密文DmodN=22529mod323=123明文=密文DmodN=22529mod323=123 解密后的明文为123。

第四次学习到此都是完全转载

经典文章:

一个故事教你看懂什么是数字证书,它的原理是什么?它的作用是什么?

https://www.cnblogs.com/franson-2016/p/5530671.html

 

RSA算法原理及其在HTTPS中的应用

https://blog.csdn.net/saintyyu/article/details/55806247

 

 

百科

1、密码学

1、盐:在密码学中,通过在密码任意固定位置插入特定的字符串,让散列后的结果和使用原始密码的散列结果不相符,这种过程之为加盐

2、彩虹表

3、aes  advanced encryption standard 高级加密标准

4、md5 这种不可逆的加密方法理论上已经很安全了,但是随着彩虹表的出现,使得大量长度不够的密码可以直接从彩虹表里反推出来

5、聪明的程序员想出了个办法,即使用户的密码很短,只要我在他的短密码后面加上一段很长的字符,再计算 md5 ,那反推出原始密码就变得非常困难了。加上的这段长字符,我们称为盐(Salt),通过这种方式加密的结果,我们称为 加盐 Hash

 

这部分参考网络

签名算法实现原理

1、对称加密是通过同一份密钥加密和解密数据,而非对称加密则有两份密钥,分别是公钥和私钥,用公钥加密的数据,要用私钥才能解密,用私钥加密的数据,要用公钥才能解密。

2、 1 选两个质数 p 和 q,相乘得出一个大整数n,例如 p = 61,q = 53,n = pq = 3233

  1. 选 1-n 间的随便一个质数e,例如 e = 17
  2. 经过一系列数学公式,算出一个数字 d,满足:

a.通过 n 和 e 这两个数据一组数据进行数学运算后,可以通过 n 和 d 去反解运算,反过来也可以。

b.如果只知道 n 和 e,要推导出 d,需要知道 p 和 q,也就是要需要把 n 因数分解。

上述的 (n,e) 这两个数据在一起就是公钥,(n,d) 这两个数据就是私钥,满足用私钥加密,公钥解密,或反过来公钥加密,私钥解密,也满足在只暴露公钥 (只知道 n 和 e)的情况下,要推导出私钥 (n,d),需要把大整数 n 因数分解。目前因数分解只能靠暴力穷举,而 n 数字越大,越难以用穷举计算出因数 p 和 q,也就越安全,当 n 大到二进制 1024 位或 2048 位时,以目前技术要破解几乎不可能,所以非常安全。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值