区块链中的密码学(二)-RSA算法分析和实现
密码学领域中,加密算法主要分为对称加密和非对称加密,随着信息时代安全性要求越来越高,对称加密因为其易被破解的原因逐渐被舍弃。而RSA算法是目前密码学世界中比较流行的非对称加密算法,命名是根据其发明者Rives,Shamir,Adleman三人的名字缩写而来。讲到RSA就不得不提到最近"黎曼猜想被正面后RSA算法不在安全"的传言。带着这个问题,讲述完RSA的原理以后会顺带讲一下即便"黎曼猜想"被证实是否对目前一些基于RSA算法的区块链项目有影响。本文的读者默认对于素数,互质,去模的数学概念有一定的了解。
什么是非对称加密?
加密就是对一段明文信息进行特殊操作产生让人无法理解的密文,而解密就是反向前一步的操作。非对称加密就是整个加密过程中需要两个秘钥:公钥和私钥。公钥和私钥是一对,对一段明文进行公钥加密以后只有对应的私钥能解密。大致过程如下:
RSA加密
RSA加密的过程定义的公式如下:

简单说,明文的E次方对N取模的结果就是密文。相信到这里读者的疑问都是E和N到底是什么?其实这里的E和N 就是RSA加密的公钥,它们的用法我已经介绍过了,通常暴露给其他使用者的是E和N的组合。
RSA解密
RSA解密的过程定义如下:

对密文取D次方,在对N取模得到的结果就是明文。这里的D和N的组合就是RSA算法的秘钥,这一步的N和加密用到的N是同一个数。
RSA 生产密钥对
通过上面的两个公式可以看到,只要知道E,D,N的值就很容易实现一次RSA加解密的过程。下面介绍一下这三个数生成的过程:
1.首先准备两个很大的质数p,q。这两个数的选择依据:如果p,q很大,算法的安全性会很高,但是相对应的计算时间会增长。一般编程语言都有对应的库用来生成这样的数据。计算p和q的乘积就得到了值N。
2.根据欧拉函数,不大于N且与N互质的整数个数有(p-1)(q-1)个。φ(n) =(q-1)*(p-1);随机选择一个整数e,要求是φ(n)>e>1,并且e与φ(n)互质,一般选择65537(如果范围允许的话)。
3.前两步生成了公钥,下面生成私钥需要的D:
D需要满足条件:
D的值就是 ( φ(n)的倍数+1)/E;
到这一步就简单的实现RSA算法的加解密过程。
RSA算法安全性
相信通过上面的过程读者应该能发现,RSA运用了大量的质数运算,这也正是RSA算法的核心:当p和q是一个大素数的时候,从它们的积pq去分解因子p和q,这是一个公认的数学难题。所以当p,q的值足够大的时候,是很难根据p和q的乘积计算出p和q的值的。注意这里用的是”很难“,这也是RSA算法的缺陷,没有任何理论或概率方面的算法证明RSA算法的破解难度,所以其安全性保障也仅仅在于此,并没有如之前讲SHA256时类比宇宙中原子数量来证明碰撞的难度。RSA的安全性问题还在于这些因式分解算法随着被因式分解的数字变得越大而变得越有效率。也就是说RSA算法的安全性在一定程度上依赖于私钥的长短,而不是其本身的算法。
RSA算法和”黎曼猜想“
在文章的开头讲述了黎曼猜想,今年9月24号,英国著名数学家迈克尔·阿提亚提出了他验证黎曼猜想的思路。我们这里不打算花费大量的篇幅介绍”黎曼猜想“和证明过程。只是希望从本质上告诉读者,”黎曼猜想“的证实和RSA算法的破解是两码事。总结起来一句话就是:”黎曼猜想“被证实的结果是证明了素数的分布是有规律的,它能够帮助我们快速的定位素数的位置。然而想要破解RSA算法的本质是对两个大质数的乘积进行因式分解,这个本质上跟”黎曼猜想“的被证实没有关系。
区块链中的密码学(二)-RSA算法分析和实现的更多相关文章
- 区块链中的密码学(-)区块链中运用最广的散列算法-SHA256算法分析与实现
在很多技术人员的眼中,区块链并不是一种新的技术,而是过去很多年计算机技术的组合运用.而在这个方方面面技术的运用上,基于密码学的加密算法可以说是区块链各种特点得以表现的根本,一旦目前使用的加密算法被证实 ...
- 区块链中的密码学(四)- Merkle树和SPV节点
什么是Merkle Tree? Merkle Tree 的命名来自于美国密码学家Ralph C. Merkle ,关于他的个人资料:传送门https://en.wikipedia.org/wiki/R ...
- VRF在区块链中的应用
最近区块链领域流行了一种"怪病",许多区块链项目或者设计方案都加入了一个叫做VRFs的算法.那么, (1) 什么是VRFs? (2) VRFs在区块链中解决了什么问题? 本文旨在介 ...
- 信息摘要算法之七:SHA在区块链中的应用
最近几年比特币的火爆带动了人们对区块链技术的研究.当然我们在这里并不讨论区块链技术本身,而是讨论一下区块链中的SHA算法的应用.对于SHA系列算法我们已经在前面作了说明,在这里也不再重复. 1.区块链 ...
- Merkle tree在区块链中的应用
上篇博文我们转载了一篇<Merkle Tree(默克尔树)算法解析>,那么大家是不是会有疑问,学习这个算法之后,我们改怎么去应用,区块链中又是如何应用的?今天这篇博客就以Merkle tr ...
- 【以太坊开发】区块链中的预言机:Oraclize原理介绍
智能合约的作用很多,但是很多数据还是要基于互联网,那么如何在合约中获取互联网中的数据?Oraclize就是为了这个目的而诞生的. 工作原理: 智能合约通过对Oraclize发布一个合约之间的调用请求来 ...
- 区块链钱包开发 - USDT - 二、创建交易错误以及解决方法
这里总结了开发中一些常见报错和解决方案 1. 提示:createRawtx_change "Amount is not a number" 解决:参数中 tx 的 amout 需要 ...
- 区块链学习7:超级账本项目Fabric中的背书、背书节点、背书策略、背书签名
☞ ░ 前往老猿Python博文目录 ░ 在Hyperledger Fabric区块链中,有背书节点进行背书,Hyperledger Fabric 使用背书策略来定义哪些节点需要执行交易. Hyper ...
- 【原】用Java编写第一个区块链(二)
这篇文章将去介绍如何使用区块链进行交易. [本文禁止任何形式的全文粘贴式转载,本文来自 zacky31 的随笔] 目标: 在上一篇文章中,我们已经创建了一个可信任的区块链.但是目前所创建的链中包含的有 ...
随机推荐
- Java-API:java.util.regex.Pattern
ylbtech-Java-API:java.util.regex.Pattern 1.返回顶部 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 1. https://docs. ...
- Hybrid App混合模式移动应用开发(AngularJS+Cordova+Ionic)
以前公司开发了某手机APP是通过jquerymobile来实现的,发现它对手机上的原生设备无能为力.于是在下一个项目到来之际,通过筛选最终决定使用cordova+Ionic.看起来简单,但是因为他们各 ...
- MFRC522模块开发笔记
Write_to_Card(-)和Read_from_Card(-)可谓是所有函数的终点,而SPIWriteByte(-)则是最底层对MFRC522模块进行操作的函数,所有函数都是为了Write_to ...
- Git学习笔记(三)远程库(GitHub)协同开发,fork和忽略特殊文件
远程库 远程库,通俗的讲就是不再本地的git仓库!他的工作方式和我们本地的一样,但是要使用他就需要先建立连接! 远程库有两种,一个是自己搭建的git服务器:另一种就是使用GitHub,这个网站就是提供 ...
- paramiko分开执行多条命令 不像之前一样使用\n
#!/usr/bin/env python#-*- encoding -*- import paramiko transport = paramiko.Transport(('192.168.11.1 ...
- div的作用
<div></div>主要是用来设置涵盖一个区块为主,所谓的区块是包含一行以上的数据,所以在<div></div>的开始之前与结束后,浏览都会自动换行, ...
- 最全 C 语言常用算法详解-排序-队列-堆栈-链表-递归-树 (面试有用)
具体 源代码 案例查看github,持续更新中............ github地址:https://github.com/Master-fd/C-Algorithm 1. 二分法查找 2. 冒泡 ...
- 《Android应用性能优化》 第6章 性能评测和剖析
1.时间测量 System.currentTimeMillis 精读和准确度可能不够:更改系统时间会影响结果:UTC时间1970/1/1 00:00:00到现在的毫秒数 System.nanoTime ...
- 错误信息:"OraOLEDB.Oracle" 返回了消息 "ORA-12154: TNS: 无法解析指定的连接标识符
错误信息:"OraOLEDB.Oracle" 返回了消息 "ORA-12154: TNS: 无法解析指定的连接标识符 链接服务器"NC"的 OLE D ...
- Lucene打分公式的数学推导
原文出自:http://www.cnblogs.com/forfuture1978/archive/2010/03/07/1680007.html 在进行Lucene的搜索过程解析之前,有必要单独的一 ...