欧拉函数 

公式

φ(n)=(p-1)(q-1)
小于x并且和x互质的数的个数
 

相关概念

因数:a*b=c 那么就称 a、b 是 c 的因数
素数:一个数如果除了1与它本身之外没有其他的因数,那么这个数就被称为素数(prime)
公因数:共同的因数,比如 8 和 10 的公因数是 2、1,最大公因数是 2
互质:最大公因数是 1
例如:7、3,最大公因数是 1,他们互质 gcb(7,3)=1
φ(10)=4   (1,3,7,9)
 

对于公式的解释

p、q 都是素数,例如:10,p、q 分别为 2、5,φ(10)=(p-1)(q-1)=(2-1)(5-1)=4
 

取模运算

如果存在正整数 m 与两个整数 a、b,如果 a-b 能被 m 整除,那么 a 和 b 模 m 同余
记作:a ≡ b mod(m)
 

模指数运算

先进行指数运算,在进行取模运算
记作:a ≡ bⁿ mod(m)
 

python中处理函数

pow(x,y,z)   意思是计算x的y次方,如果z存在对结果进行取模   等效于pow(x,y)%z
 
 

欧几里得拓展算法

对于不完全为0的非负整数a,b,gcb(a,b)表示a,b的最大公约数,必然存在x,y使得gcb(a,b)=ax+by
 
    证明:
    假设 a>b
  1、显然当 b=0,gcd(a,b)=a,此时 x=1,y=0;
  2、ab!=0 时,设 ax1+by1=gcd(a,b);
  bx2+(a mod b)y2=gcd(b,a mod b);
  根据朴素的欧几里德原理有 gcd(a,b)=gcd(b,a mod b);
  则:ax1+by1=bx2+(a mod b)y2;
  即:ax1+by1=bx2+(a-(a/b)*b)y2=ay2+bx2-(a/b)*by2;
  根据恒等定理得:x1=y2; y1=x2-(a/b)*y2;
       这样我们就得到了求解 x1,y1 的方法:x1,y1 的值基于 x2,y2.
 

RSA涉及的元素

N:大整数N,我们称之为模数(modulus)
p 和 q :大整数N的两个因子(factor)
e 和 d:互为模反数的两个指数(exponent)
c 和 m:分别是密文和明文,这里一般指的是一个十进制的数还有一个就是n的欧拉函数值,在求解d的时候常用
 

加密过程

选择两个不相等的大素数p和q,这里选61和53(实际应用中,越大越难破解)

计算出模数 n = p * q = 61 * 53 =3233

计算 φ(n) = (p−1) * (q−1) 即 n 的欧拉函数,φ(n) = 60 * 52 = 3120

随机选择一个 e 满足 (1<e<φ(n)),且 e 和 φ(n) 互质,在 1 到 3120 之间选择,选择了 17(实际应用中常常选择 65537 )

取 e 对于 φ(n) 的模反数 d,计算方法: e * d ≡ 1 (mod φ(n)) 即:e*x+φ(n)*y = 1
17x+3120y=1,解得一组整数解为(x,y) = (2753,-15),即 d = -15 将 n 和 e 封装为公钥(3233,17),n 和 d 封装为私钥(3233,2753) 对明文A进行加密:B≡A^e (mod n) 或 B = pow(A,e,n),得到的B即为密文

对密文B进行解密,A≡B^d( mod n) 或 A = pow(B,d,n),得到的A即为明文
 

RSA工具

RSA-tools2使用

P   第一个大素数
Q   第二个大素数  (P、Q长度不能相差太大)
E   公钥(随机数,必须满足:gcd(E,(p-1)*(q-1))==1)  即 E 与 (p-1)*(q-1) 互质
N   共用模数,由 P 和 Q 生成:N=P*Q
D   私钥:D=E^(-1) mod ((p-1)*(q-1))
 

使用步骤

1、单击“Start”按钮,然后随意移动鼠标直到提示信息框出现,以获取一个随机数种子
2、在“KeySize(Bits)”编辑框中输入 32 ;
3、单击“Generate”按钮生成;
4、复制“1st Prime(P)”编辑框中的内容到“Public Exponent(E)[HEX]”编辑框;
5、再次重复第 1 步;
6、在“KeySize(Bits)”编辑框中输入您所希望的密钥位数,从32到4096,位数越多安全性也高,但运算速度越慢,一般选择1024位足够了;
7、单击“Generate”按钮生成;
8、单击“Test”按钮测试,在“Message to encrypt”编辑框中随意输入一段文本,然后单击“Encrypt”按钮加密,再单击“Decrypt”按钮解密,看解密后的结果是否和所输入的一致,如果一致表示所生成的RSA密钥可用,否则需要重新生成;
9、到此生成完成。其中:
“Private Exponent(D)”编辑框中的内容为私钥;E8D85AA7
“Public Exponent(E)[HEX]”编辑框中的内容为公钥;15E03
“Modulus (N)”编辑框中的内容为公共模数。19F834DB9
请将上述三段十六进制文本保存起来即可。
 

大整数分解

yafu-x64.exe

 

cmd 下打开
factor(需要分解的整数)
  如果命令行不支持太长的数的话,把 N 保存在文件里,比如:rsa.txt
  yafu-x64.exe "factor(@)" -batchfile rsa.txt
 
  eof; done processing batchfile报错
  rsa.txt用notepad++打开,最后加上换行即可。

 msieve.exe

msieve.exe 0xA41006DEFD378B7395B4E2EB1EC9BF56A61CD9C3B5A0A73528521EEB2FB817A7 -v
msieve.exe –help 查看帮助
-v 意思打印具体分解的情况
-q 仅仅打印能找到的因子
 

openssl

-in 选项指定待解密的数据文件msg.bin.enc 
-out 选项指定解密后的输出文件msg.bin.dec 
-inkey 选项指定用于解密的私钥Key.pem,由于输入是私钥,所以不再需要使用选项-pubin 
-decrypt 选项表明这里是进行解密操作 
-pkcs 选项指定解密处理过程中数据的填充方式,对于填充,可选项有:-pkcs, -oaep, -ssl, -raw,默认是-pkcs,即按照PKCS#1 v1.5规范进行填充
 
openssl genrsa -out key.pem -f4 2048
生成私钥,并导出公钥生成2048 bit的PEM格式的RSA Key:Key.pem openssl rsa -in key.pem -pubout -out key_public.pem
从私钥导出公钥:Key_public.pem echo "hello rsa" > msg.txt
为了简便起见,这里将字符串”hello rsa”存放到文件msg.txt作为测试数据 openssl rsautl -in msg.txt -out msg.txt.enc -inkey key_public.pem -pubin -encrypt -pkcs
使用公钥key_public.pem对测试数据msg.txt进行加密生成msg.txt.enc openssl rsautl -in msg.txt.enc -out msg.txt.dec -inkey key.pem -decrypt -pkcs
使用私钥key.pem对加密后的数据msg.txt.enc进行解密,并将结果存放到msg.txt.dec文件中

例子

实验吧 RSA

http://ctf5.shiyanbar.com/crypto/RSA
 
openssl rsa -pubin -text -modulus -in public.pem 
分析公钥得到 N 、E
Exponent(E)= 65537 (0x10001)
Modulus(N)= A41006DEFD378B7395B4E2EB1EC9BF56A61CD9C3B5A0A73528521EEB2FB817A7
 
分解大整数
msieve.exe 0xA41006DEFD378B7395B4E2EB1EC9BF56A61CD9C3B5A0A73528521EEB2FB817A7 -v
 
 
得到:
p39 factor: 258631601377848992211685134376492365269
p39 factor: 286924040788547268861394901519826758027
 

使用 python 脚本解密 rsa.py,用到的库 win10 上没装好,在 kali 里可以,用 kali 运行 python2 rsa.py 得到私钥 private.pem

import math
import sys
from Crypto.PublicKey import RSA
keypair = RSA.generate(1024)
keypair.p=258631601377848992211685134376492365269
keypair.q=286924040788547268861394901519826758027
keypair.e=65537
keypair.n=keypair.p * keypair.q
Qn = long((keypair.p-1) * (keypair.q-1))
i =1
while(True):
x=(Qn * i) + 1
if(x%keypair.e==0):
keypair.d=x/keypair.e
break
i+=1
private=open('private.pem','w')
private.write(keypair.exportKey())
private.close()
 
解密文件,得到 flag
openssl rsautl -decrypt -in flag.enc -inkey private.pem -out flag.txt 
 
 

 参考

https://www.freebuf.com/sectool/163781.html 
安全牛课程《CTF从入门到提升》
 
 

【密码学】AES简单学习的更多相关文章

  1. Log4j简单学习笔记

    log4j结构图: 结构图展现出了log4j的主结构.logger:表示记录器,即数据来源:appender:输出源,即输出方式(如:控制台.文件...)layout:输出布局 Logger机滤器:常 ...

  2. shiro简单学习的简单总结

    权限和我有很大渊源. 培训时候的最后一个项目是OA,权限那块却不知如何入手,最后以不是我写的那个模块应付面试. 最开始的是使用session装载用户登录信息,使用简单权限拦截器做到权限控制,利用资源文 ...

  3. CentOS 简单学习 firewalld的使用

    1. centos7 开始 使用firewalld 代替了 iptables 命令工具为 firewall-cmd 帮助信息非常长,简单放到文末 2. 简单使用 首先开启 httpd 一般都自带安装了 ...

  4. Windows 下 Docker 的简单学习使用过程之一 dockertoolbox

    1. Windows 下面运行 Docker 的两个主要工具1): Docker for Windows2): DockerToolbox区别:Docker For Windows 可以理解为是新一代 ...

  5. 在MVC中实现和网站不同服务器的批量文件下载以及NPOI下载数据到Excel的简单学习

    嘿嘿,我来啦,最近忙啦几天,使用MVC把应该实现的一些功能实现了,说起来做项目,实属感觉蛮好的,即可以学习新的东西,又可以增加自己之前知道的知识的巩固,不得不说是双丰收啊,其实这周来就开始面对下载在挣 ...

  6. Linux——帮助命令简单学习笔记

    Linux帮助命令简单学习笔记: 一: 命令名称:man 命令英文原意:manual 命令所在路径:/usr/bin/man 执行权限:所有用户 语法:man [命令或配置文件] 功能描述:获得帮助信 ...

  7. OI数学 简单学习笔记

    基本上只是整理了一下框架,具体的学习给出了个人认为比较好的博客的链接. PART1 数论部分 最大公约数 对于正整数x,y,最大的能同时整除它们的数称为最大公约数 常用的:\(lcm(x,y)=xy\ ...

  8. mongodb,redis简单学习

     2.mongodb安装配置简单学习                   配置好数据库路径就可以mongo命令执行交互操作了:先将服务器开起来:在开个cmd执行交互操作                 ...

  9. html css的简单学习(三)

    html css的简单学习(三) 前端开发工具:Dreamweaver.Hbuilder.WebStorm.Sublime.PhpStorm...=========================== ...

随机推荐

  1. Water 2.4 发布,一站式服务治理平台

    Water(水孕育万物...) Water 为项目开发.服务治理,提供一站式解决方案(可以理解为微服务架构支持套件).基于 Solon 框架开发,并支持完整的 Solon Cloud 规范:已在生产环 ...

  2. [hdu5629]Clarke and tree

    首先由一个神奇的序列叫做Purfer序列,他可以表示一棵树,且每个节点出现此时为度数-1(因此总长为n-2). 然后dp,用f[i][j][k]表示用前i个点中的j个点构成了一个长度为k的Purfer ...

  3. [bzoj1101]Zap

    1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 50001 4 int t,n,m,k,ans,mu[N],vis ...

  4. [nowcoder5666B]Infinite Tree

    首先考虑由$1!,2!,...,n!$所构成的虚树的一些性质: 1.每一个子树内所包含的阶乘的节点都是一个连续的区间(证明:对于子树k,如果存在$x!$和$y!$,即说明$x!$和$y!$的前$\de ...

  5. jvm的垃圾回收

    首先类加载的过程:加载验证准备解析初始化 类加载器: jvm内存模型图: 空着,等以后补上 jvm垃圾收集器 目前只知道,parnew,cms,g1 parnew新生代垃圾回收器,复制算法 cms复制 ...

  6. 测试平台系列(83) 前置条件支持Redis语句

    大家好~我是米洛! 我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的完整教程,希望大家多多支持. 欢迎关注我的公众号测试开发坑货,获取最新文章教程! 回顾 上节我们打了个野,解决了一 ...

  7. 什么是H5

    H5其实就是HTML5 常说的H5测试,就是移动端web页面,他跟安卓app与IOS app的区别: (1)以往的app是使用的原生系统内核的,相当于直接在系统上操作,是传统意义上的软件,更加稳定 ( ...

  8. vue3 学习笔记(九)——script setup 语法糖用了才知道有多爽

    刚开始使用 script setup 语法糖的时候,编辑器会提示这是一个实验属性,要使用的话,需要固定 vue 版本. 在 6 月底,该提案被正式定稿,在 v3.1.3 的版本上,继续使用但仍会有实验 ...

  9. 【2020五校联考NOIP #6】最佳观影

    题意: 给出一个 \(k \times k\) 的网格和 \(n\) 次操作.其中 \(k\) 为奇数. 每次操作给出一个数 \(m\).每次你要找出一个三元组 \((x,l,r)\) 使得: \(r ...

  10. Codeforces 870F - Path(数论+分类讨论+正难则反)

    Codeforces 题目传送门 & 洛谷题目传送门 首先考虑 \(d(u,v)\) 是个什么东西,分情况讨论: \(u\not\perp v\),\(d(u,v)=1\) \(u\perp ...