公钥系统之RSA原理验证

在公钥系统中,我们采用公钥加密,私钥解密的方式,使得报文能够比较安全的传输。

假设A和B通信,但他们之间不通过对称密钥,B有一个公钥K+B和一个私钥K?B。为了与B实现通信,A首先需要获得B的公钥K+B对报文m进行加密,即K+B(m);B收到A的加密报文后用私钥K?B进行解密,即K?B(K+B(m))=m。其中的加解密算法通常使用RSA(RSA取创始人Ron Rivest, Adi Shamir, Leonard Adleman的姓氏首字母)。

RSA工作方式

加密时,首先把报文m做e次的幂运算,然后做模n的算数运算,即me%n;解密则先把上述密文值做d次幂,再做模n运算,即(me)d%n=m(ed)%n。

RSA工作原理推导

为了解开RSA工作原理的神秘面纱,需要使用数论中的一个神奇结论:如果p和q是素数,且有n=pq,则xy%n与x(y%(p?1)(q?1))%n相等。应用这个结论,那我们的私钥解密为:

(me)d%n=m(ed%(p?1)(q?1))%n

注意,m<n,并且我们是这样选择e和d的:ed?1能被(p?1)(q?1)整除,等价地说ed%(p?1)(q?1)=1,由此可得:

(me)d%n=m1%n=mm<n,n=pq,ed%(p?1)(q?1)=1,p和q是素数

于是乎,就得到了我们希望的结果:先对m做e次幂(加密)再做d次幂(解密),然后做模n的算数运算,就可得到原始报文m。另外通过颠倒上述公式的加解密次序,一样能得到原来的m。

(me)d%n=m=(md)e%n?K?B(K+B(m))=m=K+B(K?B(m))

因此B对外公开的公钥K+B为二元组(n,e),私钥K?B为二元组(n,d)

举例验证

条件:

m<n,n=pq,ed%(p?1)(q?1)=1,p和q是素数

取简单的值:

p=5,q=7

那么可以推导出:

n=pq=5?7=35,(ed?1)%(p?1)(q?1)=0?(ed?1)%(5?1)(7?1)=0?(ed?1)%24=0

于是,我们可以简单起见,为了减少计算量,设ed?1为24的1倍,那么我们可取值

e=5,d=5

假设传输明文为:

m=3

那么综上所述,我们可以得出:

  • 加密,me%n=35%35=33
  • 解密,(me%n)d%n=335%35=3=m,因此对RSA加密后的密文解密得到的就是原始的明文m

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-25 06:49:34

公钥系统之RSA原理验证的相关文章

Android系统Recovery工作原理之使用update.zip升级过程分析(一)

通过分析update.zip包在具体Android系统升级的过程,来理解Android系统中Recovery模式服务的工作原理.我们先从update.zip包的制作开始,然后是Android系统的启动模式分析,Recovery工作原理,如何从我们上层开始选择system update到重启到Recovery服务,以及在Recovery服务中具体怎样处理update.zip包升级的,我们的安装脚本updater-script怎样被解析并执行的等一系列问题.分析过程中所用的Android源码是gin

基于私钥加密公钥解密的RSA算法C#实现方法

本文实例讲述了基于私钥加密公钥解密的RSA算法C#实现方法,是一种应用十分广泛的算法.分享给大家供大家参考之用.具体方法如下: 一.概述 RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作. RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一.RSA的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难度等价. RSA的安全性依赖于大数分解.公钥和私钥都是两个大素数( 大于 1

Android系统Recovery工作原理之使用update.zip升级过程分析(六)---Recovery服务流程细节【转】

本文转载自:http://blog.csdn.net/mu0206mu/article/details/7465439  Android系统Recovery工作原理之使用update.zip升级过程分析(六)---Recovery服务流程细节            Recovery服务毫无疑问是Recovery启动模式中最核心的部分.它完成Recovery模式所有的工作.Recovery程序对应的源码文件位于:/gingerbread0919/bootable/recovery/recovery

java与.net平台之间进行RSA加密验证

RSA加密算法虽然不分平台,标准都是一样的,但是各个平台的实现方式都不尽相同,下面来我来说说java与.net平台之间该如何进行RSA加密验证,即java端加密->.net端验证和.net端加密->java端验证. 我对RSA算法也只是停留在应用的层面,所以我就以应用的角度来说说这个过程.首先,我们来看一下java端的私钥和公钥的样子:私钥: MIICeQIBADANBgkqhkiG9w0BAQEFAASCAmMwggJfAgEAAoGBAL6VJN4ZkfZA3aPPgKC3xaqT/yZT

关于投票系统刷票方式原理(突破ip限制刷票PHP版)

先说一点:其实不算是突破ip限制,因为事实上,这个限制是在服务器端的,客户端在牛逼,也突破不了..只是可以一直刷多次票罢了 一个朋友突然发了一个网站,让我帮她投投票..我这人一项比较好说话,就帮她投了.顺便分析了这个网站,发现这个网站的投票系统有ip限制,但是投票是一个ajax请求.那么办法就出来了. 很多投票PC网站都是依靠限制ip,来限制投票人数.那么我用curl伪造IP,那么就可以轻易制造多个IP进行投票. 下面贴上PHP代码: 由于对方是GET AJAX请求,我这里就贴上GET方法,PO

Java系统工具jps原理解析

Java系统工具jps原理解析 简介 当我们需要获取当前正在运行的Java进程时,我们可以通过操作系统自带的工具来筛选,如ps和netstat等.不过Java也提供了通用的工具来实现该功能,而且能够提供更加详细的信息.jps是Java Virtual Machine Process Status Too的简称,可以用来获取当前用户系统中的Java进程. 使用 jps的命令格式为 jps [ options ] [ hostid ],具体形式如下: usage: jps [-help] jps [

利用openssl生成公钥、私钥 Rsa加密、解密及验证签名

//获取公钥私钥 X509Certificate2 c4 = DataCertificate.GetCertFromCerFile(path + "\\cer\\xx.pem"); string PublicKey = c4.PublicKey.Key.ToXmlString(false);//公钥 X509Certificate2 c3 = DataCertificate.GetCertificateFromPfxFile(path + "\\cer\\yy.pfx&quo

php RSA公钥私钥加解密和验证用法

现在很多项目中会使用到rsa加解密和验证相关的技术,分别整理代码如下,方便记忆和使用. [签名和验证] 1 //获得签名 2 function getSign($data) { 3 $pem = 'my_rsa_private_key.pem'; 4 $privateKey = openssl_get_privatekey(file_get_contents($pem)); 5 openssl_sign($data, $sign, $privateKey); 6 openssl_free_key

基于私钥加密公钥解密的RSA算法C#实现

RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作. RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一.RSA的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难度等价.    RSA的安全性依赖于大数分解.公钥和私钥都是两个大素数( 大于 100个十进制位)的函数.据猜测,从一个密钥和密文推断出明文的难度等同于分解两个大素数的积.     密钥对的产生.选择两个大素数,p