RSA算法演绎

RSA是第一个也是使用的最广发的公钥加密算法,在1978年由R.Rivest、AdiShamir和Adleman三人发明,并以他们的名字命名。RSA算法的安全性基于大数因子分解的困难性,下面介绍一下它的基本原理:


1、生成公钥和私钥

(1) 选取两个大素数:p和q;

(2)计算n=p*q;

(3)计算小于n并且与n互质的整数的个数,即欧拉函数o(n) = (p - 1) * (q - 1);

(4)随机选择加密密钥e, 使1<e<o(n), 且与o(n)互质;

(5)最后,利用欧几里得算法计算解密密钥,使其满足ed = 1(mod o(n));

然后将(e, n)公开,即为公钥PK,私人保存好d,即为私钥SK;


2、加密

将明文m分解成等长数据块m1,m2, ……,mi。加密时,按如下公式进行计算即可:

ci=(mi)^ e(mod n),密文c则由c1,c2,……ci组成。


3、解密

与加密一样,按如下公式进行计算:

mi=(ci)^d(mod n),明文m则由m1,m2,……,mi组成。


以上就是RSA算法的公私钥产生、加密和解密的过程。整个过程中,最难理解的部分应是1.5中的求私钥d,很多课本提到的都是欧几里德算法,但并未具体的计算过程,下面本人就通过一个实例向大家介绍欧几里德算法在RSA中的应用。

例:令p=47,q=71,求用RSA算法加密的公钥和私钥。
计算如下:
(1)n=pq=47*71=3337;
(2)Ø(n)=(p-1)*(q-1)=46*70=3220;
(3)随机选取e=79(满足与3220互质的条件);
(4)则私钥d应该满足:79*d mod 3220 = 1;
那么这个式子(4)如何解呢?这里就要用到欧几里得算法(又称辗转相除法),解法如下:
(a)式子(4)可以表示成79*d-3220*k=1(其中k为正整数);
(b)将3220对79取模得到的余数60代替3220,则变为79*d-60*k=1;
(c)同理,将79对60取模得到的余数19代替79,则变为19*d-60*k=1;
(d)同理,将60对19取模得到的余数3代替60,则变为19*d-3*k=1;
(e)同理,将19对3取模得到的余数1代替19,则变为d-3*k=1;


当d的系数最后化为1时
令k=0,代入(e)式中,得d=1;
将d=1代入(d)式,得k=6;
将k=6代入(c)式,得d=19;
将d=19代入(b)式,得k=25;
将k=25代入(a)式,得d=1019,这个值即我们要求的私钥d的最终值。
此时,我们即可得到公钥PK=(e,n)={79,3337},私钥SK={1019,3337},后面的加密和解密直接套相应公式即可。


现在给个字符"C",我们再来演绎如何加解密。

取质数13和7

(1) n = 13*7 = 91

(2)o(n) = 12 * 6 = 72

(3)取72互质的数:5

(4)则私钥应该满足:5*d mod72=1

即:5 * d  - 72 * K = 1 ---------------@2

将72 % 5得2替代72,则5*d - 2 * k = 1  -------------- @1

将5 % 2得1替代5,则d - 2 * k = 1

令k = 0, 得d = 1

将d = 1 代入@1中,则k = 2

将k = 2代入@2中, 则d = 29

此时,我们即可得到公钥PK=(e,n)={5, 91},私钥SK={29, 91}


字符“C”对应的ascii码表值为67

67 * 67  mode  91=  30

30 * 67 mode 91=  8

 8 * 67 mode 91 = 81

81 * 67 mod 91 = 58

以此方式连续乘次数为5次(公钥),最后得到加密数值 58


若要解密这个数值58,以上述相同方式连续乘以自己29次,即可得到解密数值 67。


参考文章:

http://8btc.com/thread-1240-1-1.html

http://blog.sina.com.cn/s/blog_4fcd1ea30100yh3a.html



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/499617.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分数的乘法逆元和负数的取模运算

1.乘法逆元 A.定义 如果ax≡1 (mod p),且gcd(a,p)1&#xff08;a与p互质&#xff09;&#xff0c;则称a关于模p的乘法逆元为x。 既然有ax≡1 (mod p)&#xff0c;那么有ax - py 1,x是a关于模p的乘法逆元。 B.分数的乘法逆元 对于实数域&#xff0c;一个数的乘法逆元就是其倒数…

ecc算法入门介绍

一、从平行线谈起。 平行线&#xff0c;永不相交。没有人怀疑把&#xff1a;&#xff09;不过到了近代这个结论遭到了质疑。平行线会不会在很远很远的地方相交了&#xff1f;事实上没有人见到过。所以“平行线&#xff0c;永不相交”只是假设&#xff08;大家想想初中学习的平行…

Intel Hex概述

什么是Intel Hex文件 Intel HEX文件时遵循Intel HEX文件格式的ASCII文本文件。在Intel HEX文件的每一行都包含了 一个HEX记录。这些记录是由一些代表机器语言代码和常量的16进制数据组成的。Intel HEX文件常用来传输要存储在ROM 或者 EPROM中的程序和数据。大部分的EPROM编程器…

AndroidStudio+ideasmali动态调试smali汇编

0x00 前言 之前对于app反编译的smali汇编语言都是静态分析为主&#xff0c;加上一点ida6.6的动态调试&#xff0c;但是ida的调试smali真的像鸡肋一样&#xff0c;各种不爽&#xff0c;遇到混淆过的java代码就欲哭无泪了。后来知道IDEA用一款插件也可以实现smali的动态调试&a…

使用IDA Pro动态调试SO文件

&#xff08;1&#xff09;在IDA的安装路径中找到android_server文件。 &#xff08;2&#xff09;将android_server拷贝到手机的/data/local/tmp目录下面。 &#xff08;3&#xff09; 将手机插上电脑&#xff0c;打开命令提示符&#xff0c; 先输入”adb shell”,然后输入”…

c#调用c++dll接口及回调函数

在合作开发时&#xff0c;C#时常需要调用CDLL&#xff0c;当传递参数时时常遇到问题&#xff0c;尤其是传递和返回字符串是&#xff0c;现总结一下&#xff0c;分享给大家&#xff1a;VC中主要字符串类型为&#xff1a;LPSTR,LPCSTR, LPCTSTR, string, CString, LPCWSTR, LPWST…

机器学习或深度学习的数据读取工作(大数据处理)

机器学习或深度学习的数据读取工作&#xff08;大数据处理&#xff09;主要是.split和re.findall和glob.glob运用。 读取文件的路径&#xff08;为了获得文件内容&#xff09;和提取文件路径中感兴趣的东西(标签) 1&#xff0c;“glob.glob”用于读取文件路径 2&#xff0c;“.…

windows平台下的反调试技术

在调试一些病毒程序的时候&#xff0c;可能会碰到一些反调试技术&#xff0c;也就是说&#xff0c;被调试的程序可以检测到自己是否被调试器附加了&#xff0c;如果探知自己正在被调试&#xff0c;肯定是有人试图反汇编啦之类的方法破解自己。为了了解如何破解反调试技术&#…

SQLite加解密

0x00 SQLite概述 SQLite是一个轻量级、跨平台的&#xff0c;开源的数据库引擎&#xff0c;它在读写效率&#xff0c;消耗总量、延迟时间和整体简单性上具有的优越性&#xff0c;使其成为移动平台数据库的最佳解决方案。 然而免费版的SQLite有一个致命缺点&#xff1a;不支持加…

android和linux操作系统的区别

Android是由Google为移动设备开发的开源操作系统。Android软件的原始开发商Android公司是由Google&#xff0c;Inc.于2005年购买的。它是基于Linux 2.6内核开发的。Linux操作系统于1991年由Linus Torvalds作为台式计算机的开源操作系统开发。Linux操作系统是作为MINIX操作系统开…

Android系统架构图

一、Aplications&#xff08;应用层&#xff09; 应用是用Java语言编写的云新在虚拟机上的程序。 二、Application Framework&#xff08;应用框架层&#xff09; 这一层是编写Google发布的核心应用时所使用的API框架&#xff0c;开发人员可以使用这些框架来开发自己的应用。 V…

SHA1算法实现及详解

1 SHA1算法简介 安全哈希算法&#xff08;Secure Hash Algorithm&#xff09;主要适用于数字签名标准&#xff08;Digital Signature Standard DSS&#xff09;里面定义的数字签名算法&#xff08;Digital Signature Algorithm DSA&#xff09;。对于长度小于2^64位的消息&…

CRC32算法实现

CRC32 检错能力极强&#xff0c;开销小&#xff0c;易于用编码器及检测电路实现。从其检错能力来看&#xff0c;它所不能发现的错误的几率仅为0.0047%以下。从性能上和开销上考虑&#xff0c;均远远优于奇偶校验及算术和校验等方式。因而&#xff0c;在数据存储和数据通讯领域&…

AES算法重点详解和实现

可以看到&#xff0c;在原始数据长度为16的整数倍时&#xff0c;假如原始数据长度等于16*n&#xff0c;则使用NoPadding时加密后数据长度等于16*n&#xff0c;其它情况下加密数据长度等于16*(n1)。在不足16的整数倍的情况下&#xff0c;假如原始数据长度等于16*nm[其中m小于16]…

protobuf流的反解析Message

0x01 protobuf的基本概念 protobuf通过定义".proto"文件来描述数据的结构。.proto文件中用"Message"所表示所需要序列化的数据的格式。Message由field组成&#xff0c;Field类似JAVA或者C中成员变量&#xff0c;通常一个field的定义包含修饰符、类型、名称…

勒索病毒傀儡进程脱壳

样本是&#xff1a;wallet勒索病毒 环境&#xff1a;虚拟机VMWARE win7 32位 工具&#xff1a;OD&#xff0c;winhex 初次拿到样本&#xff0c;先用火绒剑工具监控下病毒样本的流程&#xff0c;可以看到有一个自创建进程的行为。 我们等找到OEP后&#xff0c;在CreateProcessA下…

arm64动态链接库通过函数名获取函数偏移

基本思路是分析elf文件, 首先遍历节区头部Elf32_Shdr查看sh_type属性值&#xff0c;得到属性值为SHT_DYNSYM的节区。 其次通过名字遍历节区结点&#xff0c;找到类型为STT_FUNC并且名字与其相同的结点。 代码如下&#xff1a; static void * xmalloc(size_t size) {void *p…

arm32和arm64常用指令B BL BLX机器码计算

现在大部分手机cpu架构是ARM v7-A和ARMV8-A,&#xff0c;在ARM-v7A中常使用32位ARM指令集并且支持thumb指令集与arm的切换&#xff0c;而在ARMV8中使用的是64位ARM指令集且不再有thumb指令集状态的切换了。在调用函数时&#xff0c;会有常用的调用方式&#xff1a;BL和B&#x…

arm shellcode 编写详析1

在编写arm shell code 之前&#xff0c;先介绍下arm中r0-r15寄存器的主要用途&#xff1a; Register Alt. Name Usage r0 a1 First function argument Integer function result Scratch register r1 a2 Second function …

arm shellcode 编写详析2

前一篇中介绍了arm shellcode基本用法&#xff0c;现在涉及到arm和thumb状态 在前一篇中默认为arm32模式&#xff1a; text:00008074 ; Segment type: Pure code .text:00008074 AREA .text, CODE .text:00008074 ; ORG 0x8074 .text:0000807…