一、RSA算法概述

rsa算法是一种非对称加密算法,其安全性是建立在大素数难以分解的基础上的,即将两个大素数相乘十分容易,但想对其乘积进行分解却很困难,所以可以将其乘积公开作为加密密钥

二、RSA算法设计理念

根据数论,寻求两个大素数比较简单,而将它们的乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥

三、加解密过程及密钥生成

1、加解密过程

此处从明文和密文加密和解密开始,然后讲密钥的生成

(1). 对于明文M,则有密文C=M^e mod n  (获得密文是明文的e次方再模n,即求余数)

(2). 对于密文C,则有明文M=C^d mod n   (获得明文是密文的d次方再模n,即求余数)

明文和密文的产生是建立在一对密钥的基础上的,即(e,n)和(d,n) ,(e,n)称为公钥 , (d,n)称为私钥   (先记下公钥和私钥的概念,有个印象)

下面是一个形象的例子

假设A要与B通信:

 A————————————————————————————B

(e,n)                                                                                             (d,n)

A握着(e,n)对想发送的明文M加密C=M^e mod n形成密文C,再将C发送给B

B拿到密文C,再用自己的私钥(d,n)对密文C解密还原明文M

现在我们只需要知道(e,n)和(d,n)即(e,d,n)三个密钥怎么来的就搞定了RSA算法

2、密钥生成过程  (e,d,n)

(1).求n

准备两个素数p,q(最好准备较大的素数)   (注:素数 质数是同一个东东)

n=p*q

至此n得到了

(2).根据第一步准备的p和q计算 n的欧拉函数φ(n)

φ(n)=(p-1)*(q-1)

(3).选取公钥e

选取条件:质数,1<e<φ(n)  ,  (e,φ(n))=1(e与φ(n)互质)

至此e得到了,在实际应用中,e一般为65537,(ctfer应该比较敏感吧hhh

(4).计算私钥d,计算e对于φ(n)的模反元素d。

d应满足:ed ≡ 1 (mod φ(n))             (即 (d*e)mod φ(n)=1)

至此(e,d,n)全部得出

带具体例子的视频在这里:

数学不好也能听懂的算法 - RSA加密和解密原理和过程_哔哩哔哩_bilibili

安全性推荐看这篇,此处不讲了,因为本文主要内容只是给大家讲解原理

python实现RSA算法-Python教程-PHP中文网

四、python实现

明白了算法的原理,代码实现也就变的简单了

具体思路就是,按照p,q得到密钥e,d,n后,执行加密和解密的式子。

import random'''
Euclid's algorithm for determining the greatest common divisor
Use iteration to make it faster for larger integers
'''def gcd(a, b):while b != 0:a, b = b, a % breturn a'''
Euclid's extended algorithm for finding the multiplicative inverse of two numbers
'''def multiplicative_inverse(e, phi):d = 0x1 = 0x2 = 1y1 = 1temp_phi = phiwhile e > 0:temp1 = temp_phi//etemp2 = temp_phi - temp1 * etemp_phi = ee = temp2x = x2 - temp1 * x1y = d - temp1 * y1x2 = x1x1 = xd = y1y1 = yif temp_phi == 1:return d + phi'''
Tests to see if a number is prime.
'''def is_prime(num):if num == 2:return Trueif num < 2 or num % 2 == 0:return Falsefor n in range(3, int(num**0.5)+2, 2):if num % n == 0:return Falsereturn Truedef generate_key_pair(p, q):if not (is_prime(p) and is_prime(q)):raise ValueError('Both numbers must be prime.')elif p == q:raise ValueError('p and q cannot be equal')# n = pqn = p * q# Phi is the totient of nphi = (p-1) * (q-1)# Choose an integer e such that e and phi(n) are coprimee = random.randrange(1, phi)# Use Euclid's Algorithm to verify that e and phi(n) are coprimeg = gcd(e, phi)while g != 1:e = random.randrange(1, phi)g = gcd(e, phi)# Use Extended Euclid's Algorithm to generate the private keyd = multiplicative_inverse(e, phi)# Return public and private key_pair# Public key is (e, n) and private key is (d, n)return ((e, n), (d, n))def encrypt(pk, plaintext):# Unpack the key into it's componentskey, n = pk# Convert each letter in the plaintext to numbers based on the character using a^b mod mcipher = [pow(ord(char), key, n) for char in plaintext]# Return the array of bytesreturn cipherdef decrypt(pk, ciphertext):# Unpack the key into its componentskey, n = pk# Generate the plaintext based on the ciphertext and key using a^b mod maux = [str(pow(char, key, n)) for char in ciphertext]# Return the array of bytes as a stringplain = [chr(int(char2)) for char2 in aux]return ''.join(plain)if __name__ == '__main__':'''Detect if the script is being run directly by the user'''print("===========================================================================================================")print("================================== RSA Encryptor / Decrypter ==============================================")print(" ")p = int(input(" - Enter a prime number (17, 19, 23, etc): "))q = int(input(" - Enter another prime number (Not one you entered above): "))print(" - Generating your public / private key-pairs now . . .")public, private = generate_key_pair(p, q)print(" - Your public key is ", public, " and your private key is ", private)message = input(" - Enter a message to encrypt with your public key: ")encrypted_msg = encrypt(public, message)print(" - Your encrypted message is: ", ''.join(map(lambda x: str(x), encrypted_msg)))print(" - Decrypting message with private key ", private, " . . .")print(" - Your message is: ", decrypt(private, encrypted_msg))print(" ")print("============================================ END ==========================================================")print("===========================================================================================================")

懒得写了,git上co的)

RSA密码原理详解及算法实现(六步即可掌握)相关推荐

  1. 扩展Euclidean算法求乘法逆原理详解与算法实现

    [利用扩展Euclidean算法求乘法逆] 1. Equipment (1) operating system version :WIN 10 (2) CPU instruction set: x 6 ...

  2. Hector SLAM 原理详解、算法解析

    目录 1.原理详解 2.算法解析 1.原理详解 Hector整体算法很直接,就是将激光点与已有的地图"对齐",即扫描匹配.扫描匹配就是使用当前帧与已经有的地图数据构建误差函数,使用 ...

  3. 多目标遗传算法NSGA-II原理详解及算法实现

    在接触学习多目标优化的问题上,经常会被提及到多目标遗传算法NSGA-II,网上也看到了很多人对该算法的总结,但真正讲解明白的以及配套用算法实现的文章很少,这里也对该算法进行一次详解与总结.会有侧重点的 ...

  4. RSA加密原理详解,以及RSA中的数论基础

    文章目录 1. RSA加密算法介绍 2. RSA密钥生成 3. RSA加密和解密 4. RSA的安全性 5.涉及到的数论基础 5.1. 模的逆元 5.1.1. 扩展欧几里得算法计算模逆元 5.1.2. ...

  5. 强化学习之原理详解、算法流程及Python代码

    开头先附上强化学习(reinforcement learning)的学习视频:https://morvanzhou.github.io/tutorials/machine-learning/reinf ...

  6. 加工中心如何对刀步骤详解,会这六步妈妈再也不担心不会对刀了

    首次使用数控加工中心对刀存在疑问,随后小编就将如何对刀告诉大家吧. 1,回零(返回机床原点) 对刀之前,一定要进行回零(返回机床原点)的操作,刹车于清除掉上次操作的坐标数据.注意:X,Y,Z三轴都需要 ...

  7. 朴素贝叶斯算法和拉普拉斯平滑详细介绍及其原理详解

    相关文章 K近邻算法和KD树详细介绍及其原理详解 朴素贝叶斯算法和拉普拉斯平滑详细介绍及其原理详解 决策树算法和CART决策树算法详细介绍及其原理详解 线性回归算法和逻辑斯谛回归算法详细介绍及其原理详 ...

  8. 决策树算法和CART决策树算法详细介绍及其原理详解

    相关文章 K近邻算法和KD树详细介绍及其原理详解 朴素贝叶斯算法和拉普拉斯平滑详细介绍及其原理详解 决策树算法和CART决策树算法详细介绍及其原理详解 线性回归算法和逻辑斯谛回归算法详细介绍及其原理详 ...

  9. K近邻算法和KD树详细介绍及其原理详解

    相关文章 K近邻算法和KD树详细介绍及其原理详解 朴素贝叶斯算法和拉普拉斯平滑详细介绍及其原理详解 决策树算法和CART决策树算法详细介绍及其原理详解 线性回归算法和逻辑斯谛回归算法详细介绍及其原理详 ...

最新文章

  1. 为什么找不到Flash Builder 4.6 for Eclipse插件
  2. 蓝桥杯 2011年第二届C语言初赛试题(2)
  3. mysql题目_MySQL练习题
  4. 编程中的蛇形填空问题_PCB—蛇形线的作用,这次真的是把你搞懂了
  5. myEclipse背景控制插件方案 内附使用说明
  6. 【Java】浅谈Java的I/O体系
  7. c语言堆栈基本代码入栈出栈_几道和「堆栈、队列」有关的面试算法题
  8. 谈谈以前那位研发总监错在哪里
  9. 【数字信号调制】基于matlab QAM信号产生和解调【含Matlab源码 1684期】
  10. phoenix 根据条件更新_教您一步步升级Phoenix BIOS
  11. 蓝牙MESH学习笔记
  12. Python修改图片格式
  13. [每日一氵] Harris代码
  14. 【立创EDA开源推荐】10期基于PCB彩印教程(水转印)
  15. 小米HTML查看器记住密码,小米路由器3管理密码_默认密码是多少?-192路由网
  16. 微信浏览器内打开App Store链接,并跳转到App指定安装页面
  17. Oracle Primavera Unifier文档管理器(Document Manager)
  18. 城市“智慧发展”的核心是人性化
  19. Linux中国微信,「Linux 中国」2018 微信文章排行榜 | Linux 中国
  20. 天津轻工职业技术学院计算机,天津轻工职业技术学院怎么样,说实际的,别复制学校介绍啊...

热门文章

  1. linux用于暂时锁定用户帐号的命令是,linux用于暂时锁定用户帐号的命令是()
  2. 银行计算机系统考试成绩,银行从业资格考试后电脑得分,是考试成绩吗?
  3. Eclipse: The superclass “jakarta.servlet.http.HttpServlet“ was not found on the Java Build Path
  4. python爬取豆瓣电影top250的代码_Python爬虫——爬取豆瓣电影Top250代码实例
  5. JS reduce方法对后台数据的处理案例(秒解决)
  6. 说说国产电影,烂片赚大钱时代来临
  7. 问号表达式 a?b:c
  8. 聊天气泡框模块源码 (高仿微信、QQ聊天的气泡聊天框)
  9. XCTF Mary_Morton
  10. 【杂文随笔】2022年总结 送自己一个字