前言

最近学习了RSA加密原理,并且做了些有关RSA的Crypto题。收获很大,总结了一下

一、对称加密和非对称加密

对称加密算法

(1)甲方选择某一种加密规则,对信息进行加密;
(2)乙方使用同一种规则,对信息进行解密。


最大弱点:甲方必须把加密规则告诉乙方,否则无法解密。保存和传递密钥,就成了最头疼的问题。
非对称加密算法

(1)乙方生成两把密钥(公钥和私钥)。公钥是公开的,任何人都可以获得,私钥则是保密的。
(2)甲方获取乙方的公钥,然后用它对信息加密。
(3)乙方得到加密后的信息,用私钥解密。


公钥加密的信息只有私钥解得开,那么只要私钥不泄漏,通信就是安全的

二、RSA基本介绍

介绍

  • RSA加密算法是一种非对称加密算法。在公开密钥加密和电子商业中RSA被广泛使用。
  • 对极大整数做因数分解的难度决定了RSA算法的可靠性。换言之,对一极大整数做因数分解愈困难,RSA算法愈可靠。现在只有短的RSA钥匙才可能被强力方式解破。到目前为止,世界上还没有任何可靠的攻击RSA算法的方式。只要其钥匙的长度足够长,用RSA加密的信息实际上是不能被解破的。

RSA签名验签
使用私钥将明文进行签名生成密文串与明文一起传输。对方收到数据后使用公钥和密文串进行验签。如果验签通过就说明就说明第一数据没有被修改过;第二这些数据一定是持有私钥的人发送的,因为私钥只有自己持有,起到防抵赖的作用。

三、RSA数学知识

1、互质关系

如果两个正整数,除了1之外没有其他公因子,我们称这两个数是互质关系。不是质数也可以构成互质关系。
关于互质关系,有以下结论:

  • 任意两个质数构成互质关系,比如13和61.
  • 一个数是质数,另一个数只要不是前者的倍数,两者就构成互质关系,比如3和10.
  • 如果两个数中,较大的那个数是质数,则两者构成互质关系,比如97和57.
  • 1和任意一个自然数都是互质关系。
  • p是大于1的整数,则p和p-1构成互质关系,比如57和56.
  • p是大于1的奇数,则p和p-2构成互质关系,比如17和15.

2、欧拉函数

任意给定正整数n,计算在小于等于n的正整数之中,有多少个与n构成互质关系。计算这个值的方法叫做欧拉函数。以φ(n)表示。在1到8之中,与8形成互质关系的是1、3、5、7,所以 φ(n) = 4。

  1. 如果n=1,则 φ(1) = 1 。因为1与任何数(包括自身)都构成互质关系。

  2. 如果n是质数,则 φ(n)=n-1 。因为质数与小于它的每一个数,都构成互质关系。比如5与1、2、3、4都构成互质关系。

  3. 如果n是质数的某一个次方,即 n = p^k (p为质数,k为大于等于1的整数),则

    比如 φ(8) = φ(2^3) =2^3 - 2^2 = 8 -4 = 4。
    这是因为只有当一个数不包含质数p,才可能与n互质。而包含质数p的数一共有p^(k-1) 个,即1×p、2×p、3×p、…、p^(k-1)×p,把它们去除,剩下的就是与n互质的数。
    上面的式子还可以写成下面的形式:

    可以看出,上面的第二种情况是 k=1 时的特例。

  4. 如果n可以分解成两个互质的整数之积,
    n = p1 × p2

    φ(n) = φ(p1p2) = φ(p1)φ(p2)
    即积的欧拉函数等于各个因子的欧拉函数之积。比如,φ(56)=φ(8×7)=φ(8)×φ(7)=4×6=24。

  5. 因为任意一个大于1的正整数,都可以写成一系列质数的积。

    根据第4条的结论,得到

    再根据第3条的结论,得到

    也就等于

    这就是欧拉函数的通用计算公式。比如,1323的欧拉函数,计算过程如下:
    φ(1323)=φ(3^2 * 7^2)=1323(1-1/3)(1-1/7)=756

3、欧拉定理

如果两个正整数a和n互质,则n的欧拉函数 φ(n) 可以让下面的等式成立:

也就是说,a的φ(n)次方被n除的余数为1。或者说,a的φ(n)次方减去1,可以被n整除。比如,3和7互质,而7的欧拉函数φ(7)等于6,所以3的6次方(729)减去1,可以被7整除(728/7=104)。

如果正整数a与质数p互质,应为φ§=p-1,所以欧拉函数可写成:

这是著名的费马小定理。它是欧拉定理的特例。欧拉定理是RSA算法的核心。

4、模反元素

如果两个正整数a和n互质,那么一定可以找到整数b,使得 ab-1 被n整除。

比如:3和11互质,那么3的模反元素是4,应为3*4-1 可以被11整除。4加减11的整数倍数都是3的模反元素。
欧拉定理可以用来证明模反元素必然存在:

a的φ(n)-1次方,就是a的模反元素

四、RSA算法

1、公钥和私钥的生成

RSA算法之一种非对称加密算法。具体的加密工程如下:
使用A和他的小伙伴B来举例子。
假设Al想通过一个不可靠的媒体接受B的一条私人消息,他可以用下面的方式产生一个公钥和私钥。

1. 随意选择两个大的质数p和q,p不等于q,计算N = pq.
2. 根据欧拉函数,求得r=φ(N)=φ(p)φ(q)=(p-1)(q-1)。
3. 选择一个小于r的整数e,是e与r互质。并求得e关于r的模反元素,命名为d。(求d令ed≡1(mod r))。(模反元素存在,当且仅当e与r互质)
4. 将p和q的记录销毁。

其中(N,e)是公钥,(N,d)是私钥。

例子:

  1. Al随机选两个不相等的质数61和53,并计算两数的积N=61*53=3233,N的长度就是密钥长度。3233的二进制是110010100001,一共12位,所以这个密钥就是12位。实际应用中,RSA密钥一般是1024位,总要的场合是2048位。
  2. 计算N的欧拉函数。 φ(N)=(p-1)(q-1)=60*52=3120.
  3. A 在1到3120上随机选择了一个随机数e=17。
  4. 计算e对φ(N)的模反元素d,ed ≡ 1 (mod φ(N))等价于ed-1=kφ(N)。
    找到模反元素d,实质上就是对这个二元一次方程求解:17x+3120y=1。
    用扩展欧几里得算法求解。可以算出一组解(x,y)=(2753,-15),即d=2753。

其中N=3233,e=17,d=2753。所以公钥就是(N,e)=(3233,17),私钥(N,d)=(3233,2753)。实际应用中公钥和私钥都是采用ASN.1格式表达的。

2、可靠性

密钥生成步骤,一共出现六个数字:p、q、N、φ(N)、e、d
一旦d泄露,就等于私钥泄露。

ed ≡ 1(mod φ(N))。只有知道e和φ(N),才能算出d
φ(N)=(p-1)(q-1)。只有知道p和q,才能算出φ(N)
N=pq,只有将n分解才能算出p和q

只有将n质因数分解,才能算出d。也就意味着私钥破译。但大整数的质因数分解是非常困难的。

3、加密和解密

加密

加密要用到公钥(N,e)。
假设B要向A发送加密信息m,B就要用A的公钥(N,e)对m进行加密。
但m必须是整数(字符串可以取ascii值或unicode值),且m必须小于n。
加密就是计算下式的c。

m^e ≡ c (mod n)

假设m=65,A的公钥(3233,17),所以等式如下:

65^17≡2790(mod 3233)

所以c等于2790,B就把2790发给A。

解密

A收到B发来的c(也就是2790)后,就用自己的私钥(3233,2753)进行解密。

c^d ≡ m (mod n)

也就是c的d次方除以n的余数就是m。
2790^2753 ≡ 65 (mod 3233)
因此得到原文65。

证明

证明为什么用私钥就能解密。就是要证明这个式子:

c^d ≡ m (mod n)

因为加密规则是:

m^e ≡ c (mod n)

于是,c可以写成:

c = m^e - kn

将c代入要我们要证明的那个解密规则:

(m^e - kn)^d ≡ m (mod n)

等同于求证:

m^ed ≡ m (mod n)
因为:ed ≡ 1 (mod φ(n))
所以:ed = hφ(n)+1
将ed代入:
m^(hφ(n)+1) ≡ m (mod n)

接下来,分成两种情况证明上面这个式子。

  1. 当m与n互质
根据欧拉定理,此时
m^φ(n) ≡ 1 (mod n)
得到:(m^φ(n))^h × m ≡ m (mod n)
由此原始得到证明。
  1. 当m与n不是互质时

此时,由于n等于质数p和q的乘积,所以m必然等于kp或kq。
以 m = kp为例,考虑到这时k与q必然互质,则根据欧拉定理,下面的式子成立:

(kp)^q-1 ≡ 1 (mod q)
进一步得到:
[(kp)^(q-1)]^(h(p-1))× kp ≡ kp (mod q)
即:(kp)^ed ≡ kp (mod q)
改写成:(kp)^ed = tq + kp
上式t必然能被p整除,即t=t'p
(kp)^ed = t'pq + kp
因为m=kp,n=pq,所以:
m^ed ≡ m (mod n)

证明完毕。

参考博客:
RSA算法原理(一)
RSA算法原理(二)

五、RSA实战

Crypto1:easy_RSA


题目提示是RSA,下载题目查看

由题目可知,只要计算出私钥d即可
φ(N)=φ§φ(q)=(p-1)(q-1)
ed ≡ 1 (mod φ(N))
所以ed=φ(N)+1,即17d=(p-1)(q-1)+1=473398607160*4511490+1
先计算欧拉函数φ(N)

再加1

然后除以17即是私钥d,也即是flag内容,加上flag{}提交


百度发现一个脚本,不过要安装gmpy2库

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import gmpy2p = 473398607161
q = 4511491
e = 17
s = (p-1)*(q-1)
d = gmpy2.invert(e,s)
print('flag is :',d)

Crypto2:Normal_RSA


下载题目,得到flag.enc和pubkey.pem。根据题目提示肯定是需要用到工具。RSA工具及使用
这道题目主要需要用到RSAtools和OpenSSL
1、用OpenSSL得到N
命令:

openssl rsa -pubin -text -modulus -in public.pem

N=C2636AE5C3D8E43FFB97AB09028F1AAC6C0BF6CD3D70EBCA281BFFE97FBE30DD
Modulus 是N的值,Exponent是e的值。

16进制转10进制

2、分解N的值,得到p、q
在线大数分解

即p=275127860351348928173285174381581152299、q=319576316814478949870590164193048041239

3、用RSAtools生成私钥文件private.pem
命令:

python rsatool.py -o private.pem -e 65537 -p 275127860351348928173285174381581152299 -q 319576316814478949870590164193048041239



4、用生成的private.pem和OpenSSL对flag.enc文件进行解密
命令:

openssl rsautl -decrypt -in flag.enc -inkey private.pem


得到flag
当然也有个强大的工具RsaCtfTool

感悟

学习了RSA加密算法之后,对RSA加密解密有了认识。同时为了能顺利使用rsatool,特意又搭了Kali虚拟机。
果然Kali真的是强大的一批。小白进阶ing

Crypto-RSA加密相关推荐

  1. [crypto]-53-openssl命令行的使用(aes/rsa签名校验/rsa加密解密/hmac)

    常用技巧 如何编写一个二进制规律性的文件, 比如你可以编写一个"0123456789abcdef"的文本文件,记得删除换行符然后用ultraedit打开,ctrl+H就可以看到二进 ...

  2. JavaScript的RSA加密库(cryptico、Node-rsa、Crypto、jsrsasign、JSEncrypt)

    JavaScript的RSA加密库 一.Rsa利用openssl生成公钥私钥 1.安装openssl: 2.生成公钥: 3.生成私钥: 二.Cryptico 1.优点: 2.缺点: 3.安装: 4.D ...

  3. Crypto++库实现AES和RSA加密解密

    本文介绍使用Crypto++进行AES加密和RSA加密 Crypto++库在VS中配置方法 Crypto++库下载地址: https://www.cryptopp.com/, 目前已经更新到8.1版本 ...

  4. 合宙Air105|CRYPTO|加密与解密|算法|RSA|HASH函数| BASE64|MD5|SHA1|SHA256|CRC|官方demo|学习(4):CRYPTO(加密与解密)

    基础资料 基于Air105开发板:Air105 - LuatOS 文档 上手:开发上手 - LuatOS 文档 探讨重点 对官方CRYPTO(加密与解密) 功能的复现,进行相关内容的学习及探讨. 实现 ...

  5. Crypto++安装和简单使用RSA加密解密

    Crypto++安装和简单使用 一.前言 二.下载 三.安装 四.使用 五.RSA加密/解密 (一)生成密钥/公钥 (二)OAEP加密/解密 六.RSA加密/解密的源码 一.前言 能搜索这个的估计都知 ...

  6. 前后端加密解密 【JS加密模块(md5 、 crypto 、 crypto-js、jsencrypt) python RSA加密解密(pycryptodome )模块安装与使用】

    JS加密模块[js-md5(AES) . crypto (AES). crypto-js().jsencrypt(非对称加密.RSA)] 一.安装 npm install js-md5 npm ins ...

  7. RSA加密内容过长导致抛异常javax.crypto.IllegalBlockSizeException: Data must not be longer than 117 bytes

    在进行对内容加密时发现内容长度过长就会导致Data must not be longer than 117 bytes的问题,后来百度的一番才得知由于是RSA的加密长度只能加密117bytes的内容, ...

  8. Python加密—RSA加密

    为什么80%的码农都做不了架构师?>>> 公钥加密,私钥解密. import rsa import base64 from Crypto.PublicKey import RSA # ...

  9. python后端开发框架加密_Flask框架实现的前端RSA加密与后端Python解密功能详解

    本文实例讲述了Flask框架实现的前端RSA加密与后端Python解密功能.分享给大家供大家参考,具体如下: 前言 在使用 Flask 开发用户登录API的时候,我之前都是明文传输 username ...

  10. python3 rsa加密_【Python】Python3 实现 JS 中 RSA 加密的 NoPadding 模式

    前因后果之哗啦啦废话连篇: 这几天本人在 Python 做某网站登陆的时候,发现其登陆时用户名和密码被加密了 F12 仔细看了一下,发现是调用了一个 js 的 rsa 加密库,页面 dom 中有 rs ...

最新文章

  1. html表单颜色选择器,如何在Django管理中使用HTML5颜色选择器
  2. Java内存溢出和内存泄露后怎么解决
  3. 256qam调制星座图_5G调制怎么实现的?一文读懂
  4. oracle 兰贝斯_【咨询/顾问150-500人招聘_最新咨询/顾问150-500人招聘信息】-前程无忧...
  5. 二、ceph编译源码、单机搭建调试环境
  6. html5录像功能限制时间,HTML5拍照和摄像机功能实战详解
  7. Enterprise Library 3.1 简化使用范例一
  8. jquery页面跳转带cookie_python socket编程:实现redirect函数、cookie和session
  9. 关闭IDEA双击shift全局搜索
  10. gmt绘制江苏省高程异常图
  11. 【操作系统】Nachos 多道程序设计
  12. c语言 整数符号,c语言有符号整数
  13. 背景运动补偿具体思路
  14. 这个帖子记录一下java代码转换成易语言代码的坑[持续更新]
  15. php 跳转邮箱,JS点击跳转登陆邮箱功能简单的实现方法
  16. 制作stlink(烧录部分)
  17. 解决win10点击开始按钮无反应
  18. Driller分析与改进(一)
  19. uni-app 微信小程序分享功能河北银丹互联网科技有限公司
  20. 如何使用“GPU 呈现模式”进行卡顿问题定位

热门文章

  1. 1323: 三角形判定
  2. 3.5主存储器与CPU的连接
  3. dnf商人计算机制作,DNF商人3年半时间月入50000 教你赚些零用钱
  4. offsetParent和parentElement的区别
  5. Excel如何直接根据数据画出统计图
  6. 可视化搭建平台的地图组件和日历组件方案选型
  7. ubuntu 安装bazel
  8. proteus8的简单运用
  9. 什么是mysql时间戳_什么是mysql 的时间戳
  10. vb.net 如何文件指定打印机打印文件_大规模使用FDM 3D打印机的三大挑战