RSA算法的简单认识nhe

项目上传了  现在终于有时间学习点新东西了  

东西也都是学习别人结合理解写的  理解不深  毕竟没用过 希望以后用得着  

以后用到的话会继续更新的

前几天一直在打算学点什么新的东西 发现自己对数据加密了解不多 上网上搜了一下  发现加密的话最屌的应该就是RSA加密 而且支付宝用的也是这个  所以就开始学习了一下

终于开始理解 为什么 人家大公司对算法要求这么高 毕竟加密这些东西需要的数学知识太多了 

恩 下面说下我对它的理解吧

1.原理

RSA的基本用法是通过公钥对客户端的数据加密 然后通过私钥对客户端的数据解密完成的 

RSA核心是根据欧拉函数算的 所以欧拉函数的理解非常重要 

欧拉定理 : 给定任意正整数n 求 小于等于n的正整数中  有多少与n构成互质数(即两个数除了一没有其他公约数)

 计算这个值的函数成为欧拉函数 用φ(n)表示

那么就有四中种情况了

1.1 等于一的时候 φ(1) = 1

1.2 为质数的时候  这种情况下 因为质数本身就只能被一和本身整除 所以 他与任何比他小的数都为质数 φ(n) = n - 1

1.3如果n为质数的某一次方 即n = a^k,  那么 φ(a^k) = a^k - a^k-1  φ(16) = φ(2^4) = 2^4 - 2^3 = 8;

1.4将n分解为两个质数的积n = a1 * a2, 则 φ(n) = φ(a1 * a2) = φ(a1) * φ(a2);

1.5任意一个大于1的正整数n 可以写为;  

 ; 


知道这些函数之后  就应该介绍欧拉定理了  欧拉定理指的是

如果a 和 n互质 那么下列等式成立

  即a的φ(n)次方 被n的除的余数为1

我们可以验证一下  5 和7 互质  a  = 5 , n = 3  则 5 ^φ(3) =  25  除三余1  

当然  欧拉定理也有例外的时候  

那就是正整数a和质数p互质 因为φ(p)的值为p-1欧拉定理可以写为 

a^p - 1 = 1(mod p)   这就是著名的费马定理

1.6最后还需要知道一个概念   那就是模反元素

即如果正整数a和n互质  那么存在 b使得ab - 1被n整除 公式为

ab = 1(mod n)

这个时候b为a的模反元素 

这个非常好证明  根据欧拉定理  a^φ(n) =  1(mod n) 推出 a^φ(n - 1) * a = 1(mod n)  即 a必存在模反元素a^φ(n - 1);


2.下面就开始介绍RSA的使用  我们先假设一个场景 

假设  小明需要向小芳发送一条信息  但是又不想被人发现  于是对信息进行加密 怎么加密呢?

这个时候 

2.1小芳选了两个质数q = 37 和p =  53(实际上是不会用这么小的数的),计算乘积 n = 1961,n的长度就是秘钥的长度

1961写为二进制为11110101001 共十一为  所以秘钥的长度为十一位  但实际应用过程中 一般是1024位 重要的 2048位

2.2计算n的欧拉函数φ(n) = (p - 1)(q - 1)  则 φ(1961)等于 36 * 52  = 1872 

2.3 随机取整数 在 1< e < φ(1961)之间  并与φ(1961)互质  小芳 取了 23 

2.4计算e对于φ(n)的模反元素d 有 ed  = 1 (mod φ(n)); 我们对式子进行变形一下  

ed - 1 = kφ(n)  及 ex + yφ(n) = 1  得 23x + 1872y = 1

由扩展欧几里得算法(欧几里得算法是 :对于不完全为0的非负整数a,b, gcd(a,b)表示a,b 表示ab最大公约数,必然存在x,y 使得gcd(a,b) = ax + by)得出   x = 81 ,y = -1 ,即d = 81

2.5计算完成  下面就该生成秘钥了  n和e封装成公钥 ,n和d封装成私钥 所以公钥为(1961,23) 私钥为(1961,81)


3.在上面  我们总共用到了六个数  q , p , n , e , d , φ(n)  因为公钥是可以被获取的  即  n 和 e是公开的  其余是不可知的 根据

 ed + yφ(n) = 1得 我们需要知道φ(n)  那么就需要知道q . p所以 只要对n进行因式分解就可以破解秘钥了   但是实际操作可行吗  答案当然是否定的  12301866845301177551304949
  58384962720772853569595334
  79219732245215172640050726
  36575187452021997864693899
  56474942774063845925192557
  32630345373154826850791702
  61221429134616704292143116
  02221240479274737794080665
  351419597459856902143413

这个应该是当前人类分解最长的整数了 232个十进制位  768个二进制位  即秘钥长度为768 但是现在 人类使用的秘钥长度为1024 有的甚至为2048  所以被破解的可能性太小


4.加密和解密

有了公钥和私钥 就可以进行加密和解密了  

4.1假设小明要发送信息d  使用(n,e)对d进行加密,m必须是整数(字符串取unicode值)

d^e = c (mod n)  加密就是算出式中的c   已知公钥是 (1961,23)假设m为2  可以算出c = 1411

然后小明把c = 1411发送给小芳  

4.2小芳接收到1411后 利用(1961,81)进行解密

即 c^d = m(mod n)

1411^81 = m(mod 1961)   得到m = 2

至此  加密解密完成



















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值