一、RSA引入:

RSA是什么,嗯,这是一个好问题,有没有兴趣啊

二、RSA的解释:

RSA是一种加密方式,它是现代密码学的代表(什么是现代密码学,这个吗,我感觉就是我们所使用的密码的加密的方式之一可以这么理解)

那么到底什么是RSA,就叫我来给大家说一下吧

RSA加密算法是一种非对称加密算法,所谓非对称,就是指该算法加密和解密使用不同的密钥,即使用加密密钥进行加密、解密密钥进行解密。

在RSA算法中,加密密钥(即公开密钥)PK是公开信息,而解密密钥(即秘密密钥)SK是需要保密的。

如果此时我们有一个极大整数做因数分解的难度决定了RSA算法的可靠性。理论上,只要其钥匙的长度n足够长,用RSA加密的信息实际上是不能被解破的。

RSA算法通常是先生成一对RSA密钥,其中之一是保密密钥,由用户保存;

另一个为公开密钥,可对外公开。

三、RSA的基础数学概念(知识储备),附python的代码表示

1、互斥的概念

  1、任意两个质数构成互质关系,比如13和61

  2、一个数是质数,另一个数只要不是前者的倍数,两者就构成互质关系,比如3和10

  3、如果两个数之中,较大的那个数是质数,则两者构成互质关系,比如97和57

  4、p是大于1的奇数,则p和p-2构成互质关系,比如27和25

  5、p是大于1的整数,则p和p-1构成互质关系,比如53和52

  6、1和任意一个自然数是都是互质关系,比如1和99

将一个大的因数分解成2个质数,可以用以下的代码进行验证运行检验:

a=int(input())
for b in range(100):
for c in range(b,100):
if b%2!=0 and c%2!=0:
if b*c == a :
print(b,c)
#b,c的值可以换,不过要考虑运行时间的问题,也可以使用在线网站进行解密

在线网站的网址:http://www.jsons.cn/quality/

2、欧拉函数

      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。

代码表示:

欧拉函数
import math
a=int(input())
for b in range(10):
for c in range(10):
if a == math.pow(b,c):
print(b,c)
d = math.pow(b,c)-math.pow(b,c-1)
print(d)

  4、如果n可以分解成两个互质的整数之积,即 n=p1×p2,则 φ(n)=φ(p1p2)=φ(p1)×φ(p2)

代码表示:

# 证明n=p1×p2与φ(n)=φ(p1p2)=φ(p1)×φ(p2)相同
import math
n=int(input())
p1=int(input())
p2=int(input())
def hs(w):
for b in range(10):
for c in range(10):
if w == math.pow(b,c):
d = math.pow(b,c)-math.pow(b,c-1)
print(d)

3、欧拉定理

欧拉定理是RSA算法的核心

这个式子的含义为:a的φ(n)次方除以n的余数为1

代码表示:

欧拉定理
import math
a=int(input())
n=int(input())
for b in range(100):
for c in range(b,100):
if n == math.pow(b,c):
print(b,c)
d = math.pow(b,c)-math.pow(b,c-1)
print(d)
if pow(a,d)%n==1:
print("显示正确")
else:
print("报错")

4、模反函数

如果两个正整数a和n互质,那么一定可以找到整数b(不一定唯一),使得 ab-1 被n整除,或者说ab除以n的余数是1。

ab≡1(mod n), 这时,b就叫做a的“乘法逆元(乘法模反元素)”

比如,5和17互质,那么7就是5的模反元素,同时24、41、58...都是5的模反元素,即如果b是a的模反元素,则 b+kn 都是 a的模反元素

代码表示:

模反元素
a=int(input())
for b in range(100):
for c in range(b,100):
if b%2!=0 and c%2!=0:
if b*c == a :
for n in range(100):
if (b*n)%c==1:
print(b,c)
print(n)
如果已经知道两个质数:
a,b=map(int,input().split())
# a=int(input())
# b=int(input())
for n in range(100):
if (a*n) % b == 1:
print(a,b)
print(n)

5、明文and密文

  1、明文(Plain Text):明文,是指没有加密的文字(或者字符串),属于密码学术语。

  2、密文(Cipher Text):密文是加了密的的文字。明文是加密之前的文字。

  3、密文是对明文进行加密后的报文。

四、RSA四大基本公式

RSA小结(根据以上4个公式的小结)

公钥 (E,N)
私钥

(D,N)

密钥对 (E,D,N)
加密 密文=明文EmodN密文=明文EmodN
解密 明文=密文DmodN明文=密文DmodN

RSA我认为的重点:

求p,q,n,e,d,一般情况是已知p,q,e求n,d 这个是我认为最重要的

怎么求:

(1)随机选择两个不相等的质数p和q
我们选择61和53,在实际应用中,这两个质数越大就越难破解。

(2)计算p和q的乘积n
n=61*53=3233
3233写成二进制是110010100001共12位,故该密钥是12位的,目前主流可选值:1024、2048、3072、4096...低于1024bit的密钥已经不建议使用(安全问题)。

(3)计算n的欧拉函数φ(n)
因为n = p*q,由欧拉函数的小性质 ,
如果n=p×q且p、q互质,则φ(n)=φ(pq)=φ(p)φ(q)。
由于我们的p和q都是质数,再一次由欧拉函数的小性质 如果n是质数,则φ(n)=n-1,可得 φ(p)=p-1 , φ(q)=q-1。所以我们的 φ(n)=(p-1)(q-1)
所以我们例子中的 φ(n)=60×52=3120。

(4)按照条件随机选择一个整数e
选择e的条件是 1<e<φ(n),且e与φ(n)互质。
本例中选取e = 17,但实际应用中e常常取65537 。

(5)计算e对于φ(n)的模反元素d
根据欧拉定理我们有: ed≡1(modφ(n))
即 ed–kφ(n)=1
将 e=17, φ(n)=3120代入可得:
17d–3120k=1
这里我们采用拓展欧几里得算法求解d的值。
拓展欧几里得算法可用来求解线性同余方程 a?x≡c(modb)且c=1的情况。我们可以把该方程转换成 a?x+b?y=1这种形式。
e = 17; 满足1< e < φ(n),且e与φ(n) 互质。
d = 2753;e对于φ(n)的模反元素d。
所以我们的公钥就是 (n,e)=(3233,17),私钥就是 (n,d)=(3233,2753)

RSA例题:

题目来源:buuctf crypto rsa

rsa(现代密码学,题目来源buuuctf rsa):
这个题已知p,q,e求d,所以d的值就是flag,我们运用数学方法求d
p=473398607161(题目已知)
q=4511491(题目已知)
n=2,135,733,555,619,387,051(P*Q)
L=2,135,733,082,216,268,400((p-1)*(q-1))
e=17(题目已知)
ed=1(mod L)
17d=1 (mod 2,135,733,082,216,268,400)
17d-2,135,733,082,216,268,400k=1
k=1,整除,k为整数(1<k<L)
d为整数,k的值经过尝试,使d的值是一个整数无余数
d=125631357777427553
所以这个题的flag就是flag{125631357777427553}

这个程序相对应的脚本:

p=int(input())
q=int(input())
e=int(input())
for k in range(100):
a = p-1
b = q-1
c = a*b
d = (c*k+1)/e
if d%1 == 0 :
print(k)
print((c*k+1)//e)
break

可以根据这个题解决这个问题

RSA例题2,含有公钥和私钥的问题如何解决

题目来源:buuctf crypto rsarsa

相对应的脚本:

import gmpy2
p=int(input())
q=int(input())
e=int(input())
# c=int(input())
# m=int(input())
d=gmpy2.invert(e,(p-1)*(q-1))
print(d)
# m=pow(c,d,p*q)
# c=pow(m,e,p*q)
print(m)

注:m是加密,c是解密,可以自己尝试一下

有关RSA基础的东西到这就介绍了,下周在更新RSA的更多知识

小白一个,希望大佬多多指点

什么是RSA的更多相关文章

  1. “不给力啊,老湿!”:RSA加密与破解

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 加密和解密是自古就有技术了.经常看到侦探电影的桥段,勇敢又机智的主角,拿着一长串毫 ...

  2. .NET 对接JAVA 使用Modulus,Exponent RSA 加密

    最近有一个工作是需要把数据用RSA发送给Java 虽然一开始标准公钥 net和Java  RSA填充的一些算法不一样 但是后来这个坑也补的差不多了 具体可以参考 http://www.cnblogs. ...

  3. [C#] 简单的 Helper 封装 -- SecurityHelper 安全助手:封装加密算法(MD5、SHA、HMAC、DES、RSA)

    using System; using System.IO; using System.Security.Cryptography; using System.Text; namespace Wen. ...

  4. PHP的学习--RSA加密解密

    PHP服务端与客户端交互或者提供开放API时,通常需要对敏感的数据进行加密,这时候rsa非对称加密就能派上用处了. 举个通俗易懂的例子,假设我们再登录一个网站,发送账号和密码,请求被拦截了. 密码没加 ...

  5. RSA非对称加密,使用OpenSSL生成证书,iOS加密,java解密

    最近换了一份工作,工作了大概一个多月了吧.差不多得有两个月没有更新博客了吧.在新公司自己写了一个iOS的比较通用的可以架构一个中型应用的不算是框架的一个结构,并已经投入使用.哈哈 说说文章标题的相关的 ...

  6. RSA算法

    RSA.h #ifndef _RSA_H #define _RSA_H #include<stdio.h> #include<iostream> #include<mat ...

  7. 信息安全-5:RSA算法详解(已编程实现)[原创]

    转发注明出处:http://www.cnblogs.com/0zcl/p/6120389.html 背景介绍 1976年以前,所有的加密方法都是同一种模式: (1)甲方选择某一种加密规则,对信息进行加 ...

  8. .net(c#)版RSA加密算法,拿走不谢

    今天有同学对接一个支付平台,涉及到RSA的签名和验签.由于对方是java的sdk,翻成c#语言时,搞了半天也没搞定.网上搜的东西都是各种copy还不解决问题. 碰巧,我之前对接过连连银通的网银支付和代 ...

  9. 4、DES和RSA简介

    DES是分组加密算法,速度快,使用单一密钥,加密解密都使用同一个密钥,一般用于大量数据加密,目前处于半淘汰状态. RSA算法是流式加密算法,速度慢,但是使用成对的密钥,加密解密使用不同的密钥,有利于保 ...

  10. Android数据加密之Rsa加密

    前言: 最近无意中和同事交流数据安全传输的问题,想起自己曾经使用过的Rsa非对称加密算法,闲下来总结一下. 其他几种加密方式: Android数据加密之Rsa加密 Android数据加密之Aes加密 ...

随机推荐

  1. Redmine部署中遇到的问题

    Redmine部署文章: 第一篇:Redmine部署 第二篇:Redmine部署中遇到的问题 上一篇文章我写了Redmine怎样部署(点这里直达上一篇文章),这一篇就写一下在Redmine部署中遇到过 ...

  2. CentOS-查找删除历史文件

    背景:因服务器磁盘空间有限,根据实际情况控制保留指定的几天内的历史文件 find参数说明: /home/tmp        设置查找的目录 -mtime +30       设置修改时间为30天前 ...

  3. Docker:银河麒麟系统/Ubuntu/arm64-离线安装Docker,配置自启

    下载离线包 离线安装包地址:https://download.docker.com/linux/debian/dists/stretch/pool/stable/ 注意: amd64是处理器64位 复 ...

  4. buu signin

    一.拖入ida,来静态分析F5大法好 要注意的点: 1._gmz_init_set_str() 这个函数,也是看师傅的wp,学到的,以后还是得多google, 本质上是这个函数: int mpz_in ...

  5. 深入理解Java并发容器——ConcurrentHashMap

    目录 重要属性和类 put 为什么java8后放弃分段锁,改用CAS和同步锁 初始化 addCount 扩容 树化 参考 重要属性和类 sizeCtl 容量控制标识符,在不同的地方有不同用途,而且它的 ...

  6. 『动善时』JMeter基础 — 55、JMeter非GUI模式运行

    目录 1.JMeter的非GUI模式说明 2.为什么使用非GUI模式运行JMeter 3.怎样使用非GUI模式运行JMeter (1)非GUI模式运行JMeter步骤 (2)其它参数说明 4.CLI模 ...

  7. C语言:监听键盘

    所谓键盘监听,就是用户按下某个键时系统做出相应的处理,本章讲到的输入输出函数也是键盘监听函数的一种,例如 getchar().getche().getch() 等.下面的代码演示了 getche() ...

  8. C语言枚举类型

    在实际编程中,有些数据的取值往往是有限的,只能是非常少量的整数,并且最好为每个值都取一个名字,以方便在后续代码中使用,比如一个星期只有七天,一年只有十二个月,一个班每周有六门课程等.以每周七天为例,我 ...

  9. Java基础00-基础语法3

    1. 注释 1.1 注释概述 1.2 注释分类 1.3 示例 2. 关键字 2.1 关键字概述 2.2 关键字的特点 3. 常量 3.1 常量的概述 3.2 常量分类 以上常量除了空常量都是可以直接输 ...

  10. artTemplate学习

    参考:https://www.2cto.com/kf/201711/699818.html 参考:https://blog.csdn.net/ruisenLi/article/details/8841 ...