RSA算法的实现

RSA密码算法的原理和编程实现 【实验目的】 1) 学习RSA密码算法的原理 2) 学习RSA密码算法的编程实现 【实验原理】 RSA公钥加密算法是1977年由Ron Rivest、Adi Shamirh和LenAdleman在美国麻省理工学院开发的。RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。 算法原理 解... 阅读详情
AI摘要

本文深入探讨RSA公钥加密算法的实现细节,包括质数生成、密钥生成、加密解密过程及大数运算等问题。

RSA算法是公钥密码学中的重要部分。关于RSA算法的原理部分,阮一峰讲的很清楚,具体可以阅读他的博客:

http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html
http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html

但是,网上很多都是原理的讲解,很难找到一个具体的实现案例。我找了一个Python的源代码,分析源代码加深理解。

代码下载的地址为:

https://pypi.python.org/pypi/rsa

打开源代码,找到key.py,这个文件中实现了RSA算法的核心部分。

找到其中的函数gen_key,源代码如下:

def gen_keys(nbits, getprime_func, accurate=True, exponent=DEFAULT_EXPONENT):

在这个函数里面实现了生成公钥和私钥的方法。

具体流程如下:

(1)生成质数p和q

函数的参数nbits也就是算法原理里面n的位数,可以是1024位或者2048位。这里以1024位为例。然后调用函数find_p_q生成p和q。

 
(p, q) = find_p_q (nbits/2, getprime_func, accurate)
这个函数生成了nbits/2=512位的质数(其实p、q不是严格为512位,在本文后半部分有解释),这样可以保证p*q为1024位。其中生成p和q的函数是:
 p = getprime_func(pbits)
 q = getprime_func(qbits)

在prime.py中可以找到getprime(nbits)函数。这个函数的具体实现是:先随机生成一个数字,然后判断是不是质数。

生成随机数的方法如下:

 integer = rsa.randnum.read_random_odd_int(nbits)

那么如何判断p和q是不是质数呢,这里用到了Miller Rabin算法,这个算法的实现在prime.py文件中。

miller_rabin_primality_testing(n, k):

关于Miller Rabin算法可以阅读相关资料。

维基百科:https://en.wikipedia.org/wiki/Miller%E2%80%93Rabin_primality_test

(2)计算e和d

调用函数calculate_keys_custom_exponent(p, q, exponent=exponent)。根据p和q的值生成e和d。其中e的默认值是65537。

(e, d) = calculate_keys_custom_exponent(p, q, exponent=exponent)

当calculate_keys_custom_exponent函数不再出现异常的时候,算法将停止,并返回p,q,e,d。

现在已经生成了p,q,n,e,d,也就是获得了公钥和私钥。下面介绍如何加密和解密。

(3)加密、解密

从原理可以看出,加密的时候需要对明文计算幂,解密时候也需要求幂。加密解密的实现在pkcs1.py中。encrypt函数实现加密,decrypt函数实现解密。

def encrypt(message, pub_key):
def decrypt(crypto, priv_key):

在加密函数encrypt中,对加密算法的直接实现是

encrypted = core.encrypt_int(payload, pub_key.e, pub_key.n)

于是,打开core.py,找到encrypt_int函数,最后一行是对求幂的实现。

return pow(message, ekey, n)

这个加密实现直接使用了pow函数,但是在一般的实现中,需要计算高次幂,直接使用pow会导致计算性能问题。

求完幂还需要进行取模的计算,这一步是在下一行代码中,在int2bytes的时候做了取模的计算,代码如下所示:

 encrypted = core.encrypt_int(payload, pub_key.e, pub_key.n)
 block = transform.int2bytes(encrypted, keylength)

计算大整数的大整数次幂是非常麻烦的,上面的求幂计算和取模计算可以合并成一步,直接使用快速求指数模算法。

在RSA实现中,还需要考虑大文件的加密问题,一般是把大文件分割成小文件,分块加密,代码中bigfile.py中有具体实现,就不赘述了。

(4)总结

由源代码可以看出,算法的实际实现比原理稍微复杂一点。在实现时候注意需要考虑以下问题:

(1)大数的存储和运算问题,int型能保存31位二进制数或者9位的十进制数,但是当1024位的时候需要重新定义大数的数据结构。在java里面有一个java.math.BigInteger封装了一个实现,而且其中也实现了大数的四则运算和模反等操作,使得基于BigInteger的RSA实现异常方便。可以通过阅读Java中的BigInteger的源代码理解其实现。BigInteger源代码阅读可以参考这篇博客:

http://www.hollischuang.com/archives/176

(2)质数的生成问题。为了保证质数相乘不能超过1024位,采取的方法是先生成两个512位的质数p和q,这样就可以保证不会溢出。其实在具体实现的时候,并不需要两个质数严格的是512位 ,可以做适当的移位,但是需要保证两个数相乘为1024位。在代码find_p_q函数中,有如下代码

 shift = nbits // 16
 pbits = nbits + shift
 qbits = nbits - shift

可以看出,pbits和qbits可以允许进行适当移位,这里shift表示移位512/16=32位,也就是pbits为544位,而qbits为480位。因为默认p>q,所以p的位数多于q的位数。这样的话pbits+qbits仍然为1024位。

(3)质数的分布问题。如果大质数比较稀疏,那么RSA算法就可以通过穷举质数的方法来攻破。但是512位大质数的分布没有想象的那么稀疏,所以能够保证安全性。

在学习理论的时候,如果有不明白的地方,可以找一份源代码阅读,帮助理解。

正如Linus Torvalds所说,Read The Fucking Source Code

ACM_素数筛法 唯一分解定理 欧拉函数(附容斥) 引言本文将介绍素数筛法: 主要从他的原理, 证明, 代码, 优化来介绍 随后介绍和它有关的唯一分解定理, 以及相似的欧拉函数素数筛法: 一个同辗转相除法同样古老的算法 原理: 如果x 是素数 那么2x, 3x, 4x……都不是素数, 所以如果我们从2开始往后筛, 筛到n, 这时候n没有被前面的任何数标记成不是素数, 那么n就是素数 证明: 第一点: 如果x 是素数 那么2x, 3x, 4 阅读详情

相关推荐

PYTHON实现RSA算法之简洁代码

写在前面  RSA算法,在现代密码学中真的是算得上么么哒了。它是第一个既能用于数据加密也能用于数字签名的算法。它易于理解和操作,也很流行。算法的名字以发明者的名字命名:Ron Rivest, Adi Shamir 和Leonard Adleman。   一.算法简介(写得浅显易懂,基础理论请自己查询~) 1. 三个数, p, q, r, 其中 p, q 是两个相异的质数, r 是与 (p-

花木匠#blog 4411

2021-11-01

RSA #!/usr/bin/env python3 import gmpy2 from Crypto.Util.number import getPrime from Crypto.PublicKey import RSA from Crypto.Cipher import PKCS1_v1_5 from base64 import b64encode flag = open('flag', 'r').read().strip() * 23 def encrypt(p, q, e, msg):

m0_57291352的博客 3616

getprime(512)CTF中的RSA基本方法

getprime介绍getprime(512)首先,我这边就不放冗长的百度百科的东西了,我概括一下我自己对RSA的看法。 RSA是一种算法,并且广泛应用于现代,用于保密通信。 RSA算法涉及三个参数,n,e,d,其中分为私钥和公钥,私钥是n,d,公钥是n,en是两个素数的乘积,一般这两个素数在RSA中用字母p,q表示e是一个素数d是e模 varphi(n) 的逆元,CTF的角度看就是,d是由e,p,q可以求解出的一般CTF就是把我们想要获得的flag作为明文,RSA中表示为m。然后通过RSA加密,得到

计算机毕业论文源码,学生个人网页制作html源码。贴近用户做网络推广和互联网优化。 7755

python—求范围以内的素数(质数)

这道题目之前面试zjtd的时候问过,很简单 素数:一个大于1的自然数,除了1和它本身外,不能被其他自然数(质数)整除(2, 3, 5, 7等),换句话说就是该数除了1和它本身以外不再有其他的因数 话不多说,直接上代码 def getPrime(x): res = [] if x <= 1: return for i in range(2,x+1): for j in range(2, i): if i % j == 0: break else: res.appen

qq_36581961的博客 2753

8.2【指针编程】编写一个函数,用指针保存小于或等于lim的所有素数。

【问题描述】 编写一个函数,用指针保存小于或等于lim的所有素数。 要求: 1、不要在子函数中输出。 2、不要修改子函数。 使用子函数void GetPrime(int lim,int *num,int *x) 【输入形式】 输入lim 【输出形式】 输出满足条件的个数及所有素数 【样例输入】 20 【样例输出】 num=8 2,3,5,7,11,13,17,19 【样例说明】 【评分标准】 看实现的子函数和输出结果 #inclu

qq_39977056的博客 480

XR Interaction Toolkit实战:为HTC Vive Cosmos打造抓取、投掷与UI交互(Unity 2023教程)

本文详细介绍了如何使用Unity 2023和XR Interaction Toolkit为HTC Vive Cosmos开发抓取、投掷与UI交互系统。通过实战案例'VR投掷训练室',从基础配置到高级功能实现,涵盖物理抓取、精准投掷机制和VR UI交互设计,帮助开发者提升VR交互开发技能。

weixin_30562507的博客 256

RSA加密算法Python实现

RSA加密算法Python实现,最详细的RSA算法简介

天天学安全专属博客 2万+

告别昂贵硬件!用Unity3D 2023 + ROS2 Humble搭建你的第一个SLAM仿真实验室(保姆级教程)

本文提供了一份详细的教程,介绍如何使用Unity3D 2023和ROS2 Humble搭建SLAM仿真实验室,无需昂贵硬件即可实现虚拟传感器模拟和算法测试。通过Docker容器配置、ROS2安装优化及Unity插件集成,开发者可以快速构建高精度的仿真环境,适用于自主导航、多传感器标定等场景。

weixin_42526353的博客 434

rsa数字签名算法c语言实现,RSA算法的C++实现

RSA算法的C++实现[摘要]公钥密码体制出现以前,所有的密码算法基本上都是基于代替和置换。而公钥密码体制则是基于新的理论和技术:它突破了传统的代替与置换,是数学函数;它以非对称的形式提供两个密钥。两个密钥的出现对于保密性、密钥分配、认证等都有划时代的意义。非对称密码体制在加密和解密操作中使用不同的密钥,从而构成不对称体制。加密密钥可以公开,解密密钥必须保密。其密钥分发简单,可以通过一般的通信渠道...

weixin_27310985的博客 6796

C语言从句柄到对象 (一) —— 全局变量的噩梦与“多实例”的救赎

本文探讨了嵌入式开发中句柄(Handle)的概念与应用。通过电机控制案例,分析了传统单例模式在扩展性上的局限,并展示了如何通过句柄实现代码复用:将电机状态封装为结构体,通过指针(句柄)传递实例数据,使同一套逻辑可操作多个实例。文章比较了单例模式与句柄模式的适用场景,建议底层驱动库默认采用句柄模式以提高扩展性。最后指出当前实现仍存在数据暴露风险,预告下期将介绍不透明指针技术实现更安全的封装。全文揭示了句柄作为C语言实现模块化和面向对象设计的关键作用。

一路往蓝-Anbo 的博客 1341

3D视觉实战之双目相机物体尺寸实时测量

视差图滤波能够将稀疏视差转变为稠密视差,并在一定程度上降低视差图噪声,改善视差图的视觉效果,但是比较依赖初始视差图的质量。的目标是获得左右两个相机的内参、外参和畸变系数,其中内参包括左右相机的fx,fy,cx,cy,外参包括左相机相对于右相机的旋转矩阵和平移向量,畸变系数包括径向畸变系数(k1, k2,k3)和切向畸变系数(p1,p2)以及其他一些畸变类型。:相比于昂贵的专业设备,便宜的双目摄像头可以显著降低成本,使得实时点云生成技术更加普及和经济实惠。

qq_53545309的博客 2100

【算法】Java实现RSA算法

RSA(Rivest-Shamir-Adleman)是一种非对称加密算法,它是目前最广泛使用的公钥加密算法之一。RSA算法是由三位密码学家(Ron Rivest、Adi Shamir、Leonard Adleman)在1977年提出的。RSA算法基于大数因子分解的数学难题,它使用一对密钥:公钥和私钥。公钥用于加密数据,私钥用于解密数据。公钥可以公开分享给其他人,而私钥必须保密。选择两个不同的大素数p和q。计算n = p * q,n被称为模数(modulus)。

分享Java硬核干货 1万+

从零开始讲DDR(7)——modelsim独立仿真DDR4

本文主要内容为DDR4 MIG ip核仿真,modelsim独立仿真DDR4。在进行DDR仿真的时候,我们会面临一个以往常规仿真不存在的问题:DDR本身并不是一个我们通过RTL代码设计出来的部件,常规的模块或者IP仿真,都是基于RTL代码就能进行的,但是回顾一下我们DDR的开发流程,调用的IP核也只是MIG ip,其本质是一个DDRC+DDRPYH的组合,并不能模拟任何DDR本身的行为,因此,在进行仿真之前,我们首先要做的就是获取DDR的仿真模型。

apple_53311083的博客 3228

RSA算法实现

理解 RSA 算法原理:通过实现 RSA 算法,深入理解公钥加密、私钥解密以及密钥对生成的原理。掌握如何通过大数分解难题来保证数据安全。实现加密与解密过程:通过编写 C 语言程序,实现 RSA 加密和解密的过程,了解如何使用公钥加密消息,使用私钥解密消息,验证加解密的正确性。实现不同的填充机制:实现 RSAES-OAEP 和 RSAES-PKCS1-V1_5 两种常见的填充机制,理解它们如何增强 RSA 算法的安全性。

luli____的博客 2325

【Dify】36氪新闻热榜智能自动化采集与AI处理

本文介绍如何利用Dify等自动化工具实现36氪新闻热榜的智能采集与处理。通过HTTP请求节点获取数据,JSON解析节点结构化处理,AI处理节点生成智能摘要,最终格式化输出结果。工作流程包含数据获取、解析、AI摘要、文本整理和内容输出五个环节,支持批量化、定制化的新闻处理需求。该方案适用于行业监测、内容创作、舆情管理等场景,显著提升信息获取效率,实现"所需即得"的自动化新闻服务。系统采用OpenAI GPT和Dify API作为核心模型,无需复杂人工干预即可完成全流程处理。

Mr数据杨 600

SAP_SD模块销售开票计划预收款系统配置及前台操作说明

在 SAP SD 中,开票计划(Billing Plan)是一种允许根据时间节点或里程碑对销售订单进行分期开票的功能。其中最常见的一种应用就是预收款(Down Payment Billing),即在销售订单中直接定义某个百分比或金额作为预收款,系统在开票时自动生成预收账单。大额合同或长期项目型销售(先收 20%,交货前收 30%,交货后收 50%)。分期付款模式(分阶段收款)。必须预收款才能安排生产或交货的业务。后台路径:SPRO—销售与分享—销售—销售凭证—销售凭证项目—定义项目类别。

我小时候很黑的博客 1409

RSA算法详解及C语言实现

1、什么是RSA RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。1987年首次公布,当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。 RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击,已被ISO推荐为公钥数...

qq_38365116的博客 10万+

【AI大模型应用开发实战】大型语言模型评估指南白皮书(LLM Eval)

近年来,大型语言模型(LLM)在自然语言处理领域取得了重大进展,例如 GPT-3 和 Chat-GPT。这些模型经过大型数据集的训练,在文本相关任务中表现出卓越的能力,甚至超越了人类。本文将简要介绍如何验证 LLMs 性能的评估指标。自然语言处理(NLP)是人工智能的一个领域,涉及计算机和人类语言之间的交互。NLP 的基本任务之一是语言建模 (LM),它涉及构建统计模型来分析和生成自然语言。LM 已成为推进机器语言智能的关键方法,使机器能够执行机器翻译、情感分析和对话系统等任务。

AI天才研究院 1015

C++ 实现 RSA算法

一. RSA算法 RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。 RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击,已被ISO推荐为公钥数据加密标准。 ...

chupi7359的博客 1482

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Python实现RSA算法

一、RSA算法 RSA是第一个比较完善的公开密钥算法,它既能用于加密,也能用于数字签名。RSA的安全基于大数分解的难度。其公钥和私钥是一对大素数(100到200位十进制数或更大)的函数。从一个公钥和密文恢复出明文的难度,等价于分解两个大素数之积。 RSA的公钥、私钥的组成,以及加密、解密的公式可见于下表: 公钥KU n: 两素数p和q的乘积 -----e: 与(p-1)(...

qq_36944952的博客 1万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

RSA加密算法c++简单实现

点击打开原文 RSA是一种非对称加密算法,在公开密钥和电子商业中RSA被广泛使用。它是基于一个很简单的数论事实,两个素数相乘很容易,对两素数乘积因式分解很困难。原理就不再阐述了,我谈谈算法的编程实现过程。 一、RSA加密和解密过程是基于以下形式,其中明文为M,密文为C,公匙PU={e, n},密匙PR={d, n}。 1、准备工作,选择两个大素数p和q,计算p和q的乘积n,计算p-1和q-...

mpp_king的博客 1万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

基于Java的RSA加密算法实现

一、RSA算法描述(1)选取长度相等的两个大素数p、q,计算其乘积n=p.q(2)计算n的欧拉数Φ(n)=(p-1).(q-1)(3)随机选择加密密钥e,使得e与(p-1)、(q-1)互素(4)用欧几里得扩展算法计算解密密钥d,满足:ed=1modΦ(n),(e,n)是公钥,d是私钥。(5)加密明文:Ci=mi^e(modn)(6)解密密文:mi=Ci^d(modn)二、RSA实现的Java代码1...

sinat_41880528的博客 3223

rsa算法 java实现_RSA算法介绍及JAVA实现详解

最近处理RSA算法,找了一些相关的资料和代码,整理了一下,汇总成这篇文章。基础RSA算法非常简单,概述如下:找两素数p和q取n=p*q取t=(p-1)*(q-1)取任何一个数e,要求满足e取d*e%t==1这样最终得到三个数: n d e设消息为数M (M 设c=(M**d)%n就得到了加密后的消息c设m=(c**e)%n则 m == M,从而完成对c的解密。注:**表示次方,上面两式中的d和e可...

weixin_34002071的博客 1306

详解RSA加密算法 | Java模拟实现RSA算法

本文旨在分析讲解RSA加密算法,并且用Java模拟实现

luming的博客 1291

c++实现rsa算法_RSA简介

RSA简介什么是RSARSA算法是应用最广泛的公钥密码算法。 1977年,RSA算法由MIT的罗纳德 · 李维斯特(Ron Rivest)、阿迪 · 萨莫尔(Adi Shamir)和伦纳德 · 阿德曼(Leonard Adleman)共同设计,于1978年正式发布,以他们三人的首字母命名。 在这之前所用的对称加密方式只采用一个密钥,知道加密密钥就可以知道解密密钥。但是由于双方需要事先...

weixin_31874577的博客 1173

RSA算法的简单实现

文章目录原理和所需用到的技术java实现代码一道RSA题解 对于RSA算法的原理进行简单讲述和阉割版的实现???? 原理和所需用到的技术 java实现代码 import java.math.BigInteger; import java.nio.charset.StandardCharsets; public class RSA { /** * 对以下参数作用和设置进行说明: * 对于p,q为已设定的质数 * fin为根据p,q求出的值 * n为p,q乘

wr456wr的博客 1079
上一篇: SurfaceView中lockCanvas返回值为null
下一篇: Python中的异步与多进程
tinyzhao
博客等级 码龄10年 184粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值