CTF中的RSA算法(一)

最近看c看的头疼了O(≧口≦)O,所以先停下来缓一缓写几篇博客吧。
在讲之前我们先来看一个著名网红老师李永乐的视频,了解一下RSA的一些基本知识,一遍不行看两遍,两遍不行看三遍,切记一定要看懂这个视频,否则,下面写的很有可能就看不懂了。虽说密码学和数学相关性很大,但是一步一步的学并没有那么难,我的数学也不好,但是这并不妨碍我做这些密码学的题目,我可以慢慢的学。记住千万不要还没开始就放弃了。
????视频链接:https://www.bilibili.com/video/av26639065/

????基本介绍:
????RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。
????RSA加密算法是一种非对称加密算法。
????对极大整数做因数分解的难度决定了RSA算法的可靠性。换言之,对一极大整数做因数分解愈困难,RSA算法愈可靠。 假如有人找到一种快速因数分解的算法的话,那么用RSA加密的信息的可靠性就肯定会极度下降。但找到这样的算法的可能性是非常小的。今天只有短的RSA钥匙才可能被强力方式解破。到目前为止,世界上还没有任何可靠的破解RSA算法的方式。只要其钥匙的长度足够长,用RSA加密的信息实际上是不能被解破的。
????公钥与私钥的产生:
(1)进行加密之前,首先找出2个不同的大质数p和q
(2)计算n=p*q
(3)根据欧拉函数,求得φ(n)=φ(p)φ(q)=(p?1)(q?1)
(4)找出一个公钥e,e要满足: 1<e<φ(n) 的整数,且使e和φ(N)互质。。
(5)根据e*d除以φ(n)余数为1,找到私钥d。
于是: 公钥就是(n,e) 私钥就是(n,d)

加密==> m^e除以n求余数即为c(密文)

解密==> c^d除以n求余数即为m(明文)

既然知道了原理,是不是就应该做一道题练练身了呢

题目:按照RSA算法,若选取两奇数p=5,q=3,公钥e=7,则私钥d为多少?(不要直接偷看答案解析哈)
A.6????B.7????C.8????D.9

解析:由p=5,q=3,e=7,可知n=p*q=15; φ(n)=(p?1)(q?1)=8
??????由ed除以φ(n)余数为1得,7d=1(mod 8)
??????mod运算(取余)应该大部分人都会吧,不会的话可以去百度一下。
enn......如果说上面的题目你已经自己做出来了,或者看懂答案解析了,说明你悟性还是挺高的哈。
那下面这道题目呢? O(∩_∩)O~
题目来自:Jarvis OJ - Basic - VeryEasyRSA()


????呀( ⊙ o ⊙ )!数好大,怎么搞,这是手要报废的节奏啊O(≧口≦)O。
????enn......怎么可能那么难啊,看看题目名---VeryEasyRSA,所以吧,我们就要上我们的工具了--python。俗话说的好”工欲善其事必先利其器“。
????下面是RSA中常用到的模块安装,经过我的多次尝试,终于找到了不走弯路的安装方法,这里用的是python2,因为python3的模块安装时会存在各种各样的问题,甚至那个模块python3还没有,python2安装时错误会少一点,而且做rsa的题目时我还没见过哪个大佬用python3,清一色的python2。

??前提条件:基于linux环境安装,确保安装了wget,gcc,make软件,会基本的linux命令。
??一共需要安装6个模块(不要随便更改下载链接中的模块版本,我不保证更改后的模块版本适合下面源码安装的编译选项,enn当时我就在这个坑里跳了好久才出来。)

  1. 检查是否安装了M4模块
    ????命令行命令: man m4
    ????如果没有安装,就先安装一下,网上大部分资料写的都是使用源码写的方式安装,但是可能是编译软件版本的问题,进行m4源码安装时总是安装失败,这就是第一个坑,最后竟然可以直接使用apt-get命令安装,太狠了这个:apt-get install m4
  2. 安装GMP模块
    wget https://gmplib.org/download/gmp/gmp-6.1.2.tar.bz2
    tar -xf gmp-6.1.2.tar.bz2 

    cd 进入解压后的文件夹

    ./configure --prefix=$HOME/static --enable-static --disable-shared --with-pic

    执行完成之后再执行

    make && make check && make install
  3. 安装MPFR模块(解压,进入目录什么的的命令下面就不写了,和(2)中一样。)
    wget https://www.mpfr.org/mpfr-current/mpfr-4.0.2.tar.bz2 
    ./configure --prefix=$HOME/static --enable-static --disable-shared --with-pic --with-gmp=$HOME/static
    make && make check && make install
  4. 安装MPC模块
    wget https://ftp.gnu.org/gnu/mpc/mpc-1.1.0.tar.gz
    ./configure --prefix=$HOME/static --enable-static --disable-shared --with-pic --with-gmp=$HOME/static --with-mpfr=$HOME/static
    make && make check && make install
  5. 安装gmpy2模块
    git clone https://github.com/aleaxit/gmpy.git
    sudo python setup.py build_ext --static=$HOME/static install
  6. 安装libnum模块
    git clone https://github.com/hellman/libnum
    sudo python setup.py install 

    ????好了,到这里常用的RSA解密的模块都装的差不多了。回到上面的那个题目,我们看看怎么个VeryEasyRSA法。
    ????解题脚本:

#!/usr/bin/python
#coding:utf-8
#@Author:醉清风

import gmpy2
p = 3487583947589437589237958723892346254777
q = 8767867843568934765983476584376578389
e = 65537
phi = (p-1)*(q-1)       #φ(n)在写的时候多用phi代替,因为键盘不好敲出来。
d = gmpy2.invert(e,phi) #e模phi的逆为d, (e*d)%phi==1 原理上面讲过
print d

或者

#!/usr/bin/python
#coding:utf-8
#@Author:醉清风

import libnum
p = 3487583947589437589237958723892346254777
q = 8767867843568934765983476584376578389
e = 65537
phi = (p-1)*(q-1)
d = libnum.invmod(e,phi) #e模phi的逆为d,(e*d)%phi==1
print d

????上面的两种解法只是调用的模块不同,但计算效果是一样的,后面的题目中也会经常使用这些模块,具体想用哪个模块看自己的心情就好。
????现在才只是个开始,后面的更有意思,未完待续......

原文地址:https://blog.51cto.com/13400543/2413968

时间: 2024-08-04 13:02:59

CTF中的RSA算法(一)的相关文章

公钥密码RSA算法记录

介绍: RSA算法是1978年由 R.Rivest.A.Shamir.L.Adleman提出的一种用数论构造的.也是迄今为止理论上最为成熟.完善的公钥密码体,该体制已得到广泛的应用. 算法描述: 1. 密钥的产生 (1) 选两个保密的两个大素数 p 和 q . (2) 计算 n=p*q,φ(n) = (p-1)*(q-1),其中,φ(n)是n的欧拉函数值 (即满足和n互素的在[1,n)区间的数的个数,定理[ φ(m*n) = φ(m)*φ(n),仅当m,n互素时]): (3) 选一个整数 e ,

C# 中使用 RSA加解密算法

一.什么是RSA RSA公开密钥密码体制.所谓的公开密钥密码体制就是使用不同的加密密钥与解密密钥,是一种“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制. 在公开密钥密码体制中,加密密钥(即公开密钥)PK是公开信息,而解密密钥(即秘密密钥)SK是需要保密的.加密算法E和解密算法D也都是公开的.虽然密钥SK是由公开密钥PK决定的,但却不能根据PK计算出SK.正是基于这种理论,1978年出现了著名的RSA算法,它通常是先生成一对RSA 密钥,其中之一是保密密钥,由用户保存:另一个为公开密钥

解决项目中的RSA加密解密算法的实际案例

目前项目中在2个地方用到了RSA加密算法 1.一个地方时登录的时候,前端js做了RSA加密,然后后端RSA解密 2.H5移动端的url中存在RSA加密串 但是在时间压测中,主要的问题是H5请求的url中存在RSA加密串 登录的RSA逻辑: 在压测脚本 中 这个RSA登录密码加密是可以解决的,直接将所有的密码统一成RSA的加密串就可以 但是在H5端的url中存在这个RSA加密串,那么就需要解决这个问题 那么如果需要做性能压测,这个问题必须要解决,否则一些url请求是无法模拟的 通过上述的方法,就可

springmvc使用RSA算法加密表单

今天被吐槽在客户端用js对密码进行md5加密其实也不见得安全.这种做法其实不见得有什么作用,学过计算机网络都知道,在网上抓一个包是很简单的事,就算别人抓包抓不到你原始密码,用这个md5后的密码一样可以模拟登录系统.这样做无非就是直接通过登录页没法直接输入用户名密码,但用个程序模拟登陆也不是什么太难的事情.以前一直写那么多,一直没有注意,直到今天被吐槽,才发现以前自己的做法是多么的幼稚. 加密数据的方式当然不止一种,也可以通过https加密数据,但是对于一般应用来说,还需要花钱拿去给那些认证机构签

CTF中那些脑洞大开的编码和加密

0x00 前言 正文开始之前先闲扯几句吧,玩CTF的小伙伴也许会遇到类似这样的问题:表哥,你知道这是什么加密吗?其实CTF中脑洞密码题(非现代加密方式)一般都是各种古典密码的变形,一般出题者会对密文进行一些处理,但是会给留一些线索,所以写此文的目的是想给小伙伴做题时给一些参考,当然常在CTF里出现的编码也可以了解一下.本来是想尽快写出参考的文章,无奈期间被各种事情耽搁导致文章断断续续写了2个月,文章肯定有许多没有提及到,欢迎小伙伴补充,总之,希望对小伙伴们有帮助吧! 0x01 目录 1 2 3

RSA算法(二)

转载:http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html 作者: 阮一峰 日期: 2013年7月 4日 上一次,我介绍了一些数论知识. 有了这些知识,我们就可以看懂RSA算法.这是目前地球上最重要的加密算法. 六.密钥生成的步骤 我们通过一个例子,来理解RSA算法.假设爱丽丝要与鲍勃进行加密通信,她该怎么生成公钥和私钥呢? 第一步,随机选择两个不相等的质数p和q. 爱丽丝选择了61和53.(实际应用中,这两个质数越

RSA算法Java的简单实现

RSA简介 RSA算法据说是目前地球上最重要的加密算法.维基百科是这么介绍的:"对极大整数做因数分解的难度决定了RSA算法的可靠性.换言之,对一极大整数做因数分解愈困难,RSA算法愈可靠.假如有人找到一种快速因数分解的算法,那么RSA的可靠性就会极度下降.但找到这样的算法的可能性是非常小的.今天只有短的RSA密钥才可能被暴力破解.到2008年为止,世界上还没有任何可靠的攻击RSA算法的方式.只要密钥长度足够长,用RSA加密的信息实际上是不能被解破的." 看上去很神奇是吧,其实在学习网络

程序员眼中的RSA算法

RSA算法是数学应用于实际的一项伟大发明,起数学过程相对而言还是比较专业的,有兴趣可以看看. RSA算法的证明过程,详见:http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html 首先默认有个欧拉定理及相关的推论成立,这个要看证明过程不简单 然后看一下其加密解密的公式,可以试着推导一下: 可以看出非对称的加密解密过程,在数学上是成立的. 那么回头看它的安全性:就是要确保d不被攻破,d安全的前提是n不被成功分解. 1.能不

这个发现是否会是RSA算法的BUG、或者可能存在的破解方式?

笔者从事各种数据加解密算法相关的工作若干年,今天要说的是基于大数分解难题的RSA算法,可能有些啰嗦. 事情的起因是这样的,我最近针对一款芯片进行RSA CRT解密的性能优化.因为期望值是1024bits长度能做到20ms左右,但我的实现结果接近40ms.为了找到更加快速的实现方式,我在各大论坛查找不基于Jebelean和Montgomery的模乘实现.在查找过程中非常偶然的获得了一组密钥数据,现在按照一般生成密钥的顺序,先对该组数据简单说明一下,证明其正确性. 1. 密钥产生过程 选取两个512