RSA公钥密码体制的简介及例题

2023-10-30

传统密码体制

传统的对称密码体制

• 对称密码体制(例如DES, AES) 允许两个用户利用提前共享的 秘密来建立“安全信道”
• 通信双方共享秘密并不容易…

密钥管理

• 考虑一个具有N个用户的团体,如果用户两两之间都需要进行 安全通信:
• 采用对称密码体制来保护用户之间的通信: • 每个用户需要与其余的N -1个用户共享私钥 • 整个系统需要管理N(N -1)/2个密钥

密钥分发

• 用户之间如何在安全通信前共享秘密? • 需要一个安全信道来共享密钥…
• 尽管密钥分发可以采用如下方式解决… • 例如, 物理接近, 可信“快递”

不支持“开放系统”

• 如果两个没有预先建立关系的用户需要建立安全通信, • 他们什么时候共享密钥呢?
• 这个场景并不遥远! • 顾客发送信用卡信息给商家 • 用户发送电子邮件给单位中的所有同事
“传统的”对称密码体制无法解决上述问题!

公钥密码体制

主要思想:

• 一些问题呈现出“非对称性”– 从一个方向计算非常容易,而从另一 个方向计算则很困难
• 例如:计算任意给定整数的乘积很容易,而计算给定大整数的因子则 非常困难
• 每个用户生成一个密钥对:一个公钥pk和一个对应的私钥 sk • 公钥将在系统内被公开 • 私钥由用户本人安全保管
• 私钥由用户本人使用,而公钥则由系统中其他用户使用 • 公钥密码体制也被称为:非对称密码体制

公钥密码体制的优势:

密钥分发:

• 公钥能够采用公开(认证的)信道进行传输;

密钥管理:

• 在用户N个用户的系统中,每个用户只需安全保管自己的私钥和N-1 个其他用户的公钥。整个系统仅仅需要维护N个公钥;

开放系统:

算法原理

(1)随机生成两个质数p和q

(2) 大整数 n=p*q

(3)欧拉函数 φ(n)=φ( p )*φ(q) = (p - 1)(q - 1)

​ 欧拉函数是求小于x并且和x互质的数的个数。其通式为:φ(x) = x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)……(1-1/pn)

​ 欧拉函数性质:

  • 若n是素数p的k次幂,img,因为除了p的倍数外,其他数都跟n互质
  • 欧拉函数是积性函数——若m,n互质,img
  • 当n为奇数时,img
  • p是素数,img,φ§称为p的欧拉值

(4)随机选择一个整数e,满足1<e<φ(n)且gcd(e,φ(n))=1

(5)模反元素 e*d≡ 1 (mod φ(n));等价于ed - 1 = kφ(n) (k∈Z);于是,找到模反元素d,实质上就是对下面这个二元一次方程求解。

ex + φ(n)y = 1 求解此二元一次方程使用“扩展欧几里得算法”,算法自行研究;

(6)公钥(n,e),私钥(n,d);

​ 总共六个数据:p,q,e,d,φ(n),n;只有公钥(n,e)对外公开,其他数据不公开;其中最关键的是d,因为n和d组成了私钥,一旦d泄漏,就等于私钥泄漏。实际上就是计算n,e,d的过程;

那么,有无可能在已知n和e的情况下,推导出d?

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

结论:如果n可以被因数分解,d就可以算出,也就意味着私钥被破解。

可是,大整数的因数分解,是一件非常困难的事情。目前,除了暴力破解,还没有发现别的有效方法。维基百科这样写道:"对极大整数做因数分解的难度决定了RSA算法的可靠性。换言之,对一极大整数做因数分解愈困难,RSA算法愈可靠。

(7)加密明文m,密文c

加解密原则:公钥加密,私钥解密。

加密算法:m^e ≡ c (mod n)

解密算法:c^d ≡ m (mod n)

• 即使是没有预先建立关系的用户也能通过对方的公钥建立 安全通信
在这里插入图片描述简单来说就是:每位用户都会有自己的公钥和私钥,公钥在公开信道,私钥自己保管。Bob可以获取Alice的公钥,并用Alice的公钥加密信息后发送给Alice,Alice拥有的私钥可以解密。这样就完成了在不安全信道条件下,安全传输信息。

练习

https://ctf.show/challenges

crypto4

​ exp

import gmpy2
p = 447685307
q = 2037
e = 17
nn = (p-1)*(q-1)
d = gmpy2.invert(e,nn)
print(d)

crypto5

​ exp

import gmpy2
import binascii

e = 17
c = 704796792
p = 447685307
q = 2037
n=pq
phi = (p-1)
(q-1)
d = gmpy2.invert(e,phi)
m = gmpy2.powmod(c,d,n)

print(m)

easyrsa1

​ 分解大整数n

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nWTNQN1s-1602503795097)(C:\Users\董玉\AppData\Roaming\Typora\typora-user-images\image-20201009174710573.png)]

​ exp

import gmpy2
import binascii //binascii模块包含很多在二进制和ASCII编码的二进制表示转换的方法

e = 65537
n = 1455925529734358105461406532259911790807347616464991065301847
c = 69380371057914246192606760686152233225659503366319332065009
p = 1201147059438530786835365194567
q = 1212112637077862917192191913841

phi = (p-1)*(q-1)
d = gmpy2.invert(e,phi) //e mod phi的逆元
m = gmpy2.powmod(c,d,n) //c的d次方对n取余

print(binascii.unhexlify(hex(m)[2:]))

在线分解大整数n网站:http://www.factordb.com/index.php

安装gmpy2模块及其依赖库gmp mpfr mpchttps://blog.csdn.net/qq_28573835/article/details/86164877

解决rsa问题,要理解费马小定理,欧拉函数,同余类

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RSA公钥密码体制的简介及例题 的相关文章

  • Python 将私钥转换为 RSA 密钥

    我有一个具有以下格式的私钥 BEGIN ENCRYPTED PRIVATE KEY MIIE6TAbBgkqhki END ENCRYPTED PRIVATE KEY 如何将其转换为 RSA 格式的密钥 BEGIN RSA PRIVATE
  • 从 Cpanel git 克隆项目,显示此错误“ssh 远程主机标识已更改”

    我知道类似的问题已经被问过很多次了 但这里有一个区别 尝试从 cpanel 共享托管服务器克隆项目 如果尝试使用此命令sudo git clone ssh email protected cdn cgi l email protection
  • 如何通过 RSA 生成唯一的公钥和私钥

    我正在构建一个自定义购物车 其中 CC 编号和到期日期将存储在数据库中直至处理 然后删除 我需要加密这些数据 显然 我想使用 RSACryptoServiceProvider 类 这是我创建密钥的代码 public static void
  • Android KeyStore私有指数无法提取

    我想在 Android 密钥库中生成 RSA 密钥对 从 Android 4 3 开始 应该可以在 Android 系统密钥库中生成 RSA 密钥 我通过 工作正常 生成我的 RSA 密钥 Calendar notBefore Calend
  • 为什么 KeyPairGenerator.genKeyPair() 这么慢

    我有一些 Java 代码 当我运行函数时KeyPairGenerator genKayPair 工作时间为 40 秒或更长时间 如何改变这种现状呢 如果我跑 openssl req x509 nodes days 365 newkey rs
  • RSA可以同时用作加密和签名吗?

    抱歉 我的脑子突然空白了 编辑 场景 如果我想要信息绕过简单的过滤器 例如f ck 用公钥加密信息 用私钥签名可以吗 公钥可能已经被双方交换过了 而且公钥也很难得到 EDIT 2 这些信息本身可能并没有那么大的凭据 加密和签名的目的是为了绕
  • Git和ssh授权

    我无法使用生成的 ssh 密钥登录 github 我已经按照本手册进行操作 http help github com linux key setup http help github com linux key setup但在步骤 ssh
  • 如何从 SSL 证书中提取密钥?

    我有一个在以下网站购买的 SSL 证书 pem crt der格式 我想知道如何从证书中获取密钥文件 有什么办法可以做到这一点吗 您可以提取公钥 这的用处有限 也许您将在其他不使用证书的工具 例如 SSH 或 PGP 中使用相同的密钥 使用
  • 如何使用 RSAEncryption 创建带有 SHA1 摘要的 PKCS7/CMS?

    我创建了一个pkcs7块 可以自己验证 但是结果和我使用OpenSSL的伙伴不一样 我创建的p7块无法被我的伙伴验证 我们仔细检查代码 只找到c 中找不到对应项的代码 OPENSSL signInfo gt digest enc alg g
  • .NET 私​​钥 Rsa 加密

    我需要使用 RSA 1 5 算法加密字符串 我已获得私钥 然而 我一生都无法弄清楚如何将这个密钥添加到班级中 看来密钥必须是 RSAParameter 结构类型 然而 这需要一组我尚未给出的值 例如模数 指数 P Q 等 我拥有的只是私钥
  • 在OpenSSL中使用RSA公钥生成相应的私钥?

    我知道可以使用这个链接 https www ibm com support knowledgecenter en SSWHYP 4 0 0 com ibm apimgmt cmc doc task apionprem gernerate s
  • 在 C 语言中用于 RSA 解密的 OpenSSL EVP api 的 EVP_OpenInit() 中出现错误

    我在使用 OpenSSL 库 EVP api 进行 RSA 解密时遇到问题 这是我的密钥生成代码 include
  • RSA 加密 AES 密钥的强度

    我目前正在开发一个在客户端和服务器之间传输数据的系统 并且想知道我计划使用的加密强度是多少 我的想法是拥有一个私钥 公钥 RSA 密钥对 并将公钥分发给每个客户端 将私钥仅保留在服务器上 然后 每个客户端将生成自己的 AES 密钥并使用 R
  • 解码 Base64urlUInt 编码值

    我通常想做的是验证id token从 OpenID Connect 提供商 例如 Google 获得的值 令牌使用 RSA 算法进行签名 公钥从发现 https openid net specs openid connect discove
  • Android 和 Java 中的 RSA 加密

    我想用 RSA 加密来加密字符串 我的公钥 私钥已生成并存储在数据库中 在android中 我使用这段代码 public static String encryptRSAToString String text String strPubl
  • 在 Android 中解密从 .net 生成的 RSA 加密值

    我在这里浏览了很多帖子 但没有找到正确的解决方案 我想从 Android 解密在 c net 中加密的值 我已使用以下代码片段在 net平台中成功解密 public static void Main string privateKey Ba
  • 从 X.509 证书中提取 PEM 公钥

    我已经创建了一个包含公钥 DER 文件的证书 但我现在需要 PEM 格式的公钥用于不同的平台 目的是使用相同的公钥 我使用创建它iOS 中的 RSA 加密并使用 PHP 解密 http jslim net blog 2013 01 05 r
  • 来自公共字符串的 Android RSA 加密

    我正在开发一个 Android 应用程序 我希望用户能够使用其他人的公钥加密消息 系统将生成公钥 私钥对 然后可以将消息秘密发送给其他用户 我正在创建一个加密类 它将处理消息的加密 解密 不幸的是我遇到了一些问题 在这种方法中 我想传递用户
  • PHP服务器端IAB验证openssl_verify总是返回0

    我使用以下函数 服务器端 php 来验证 IAB v3 事务 我从 Android 应用程序传递过来 Override protected void onActivityResult int requestCode int resultCo
  • 我可以在本地使用 RSA 密钥测试身份验证吗?

    有没有办法在本地检查您是否为 RSA 密钥提供了正确的密码 最近 我在将一些提交推送到 github 时遇到了麻烦 因为推送提示输入密码 然后身份验证失败 我验证了 github 具有正确的公钥id rsa文件在我的 ssh目录 并且我验证

随机推荐

  • 电脑打开计算机显示远程过程调用失败,win7系统电脑弹出提示“远程过程调用失败且未执行”的解决方法...

    win7系统使用久了 好多网友反馈说win7系统电脑弹出提示 远程过程调用失败且未执行 的问题 非常不方便 有什么办法可以永久解决win7系统电脑弹出提示 远程过程调用失败且未执行 的问题 面对win7系统电脑弹出提示 远程过程调用失败且未
  • java 原始套接字编程_套接字编程原理

    6 多路复用 select 功能 用来检测一个或多个套接字状态 格式 int PASCAL FAR select int nfds fd set FAR readfds fd set FAR writefds fd set FAR exce
  • android里面layer-list中的inset和clip到底有什么作用

    Inset Drawable 用于通过指定的间距把图片插入到XML中 它在View需要比自身小的背景时常用 有些像padding的作用 例子 第一步 drawable文件中建立inset drawable xml
  • DB与缓存一致性

    一般方案中的设计均有其缺陷 要么会产生脏数据 要么会产生不一致 不同的是代价和概率 更新数据时 是先删除缓存再更新DB 还是先更新DB再删除缓存 https blog csdn net qq 33999844 article details
  • unity 如何获取到屏幕中间_Unity UGUI获取鼠标在屏幕的准确点击位置

    想要获取鼠标在屏幕的准确点击位置 千万不要胡乱写 什么转化坐标系 什么Ray射线检测都是浮云 1 转化坐标系只是相对而言 并不能准确实现当前鼠标点击在屏幕的位置 2 Ray检测 hit是需要碰撞的 没碰撞 获取的是什么 0 0 0 所以 请
  • css的选择器

    一 基本标签 标签选择器 格式 标签名 h1 文本内容 h1 类名选择器 格式 类名
  • Eclipse中断点调试详解

    小编是刚学习Java两个月 在学习视频中看到老师玩断点6到飞起 自己也就各种查资料 实施并总结了一下断点的调试 找到需要设置断点的位置 你可能会问 我怎么知道在哪设置断点呢 如果你实在不知道在哪设置断点 那你完全可以多设置几个断点 单步调试
  • Power小型机概念输理

    一 基本概念 一 Power System服务器POWER AIX RISC CISC SMT QCM SP Hypervisor LPAR POWER Performance Optimization With Enhanced RISC
  • Vue的样式绑定

    一 绑定class 1 第一种 样式和数据的绑定 通过对象方式 v bind class设置一个对象 当isActivated为true的时候 div上会增加一个class属性 属性名称为activated 如果再在css里加上activa
  • 推荐10个堪称神器的学习网站,IT学习网站

    挑选了 10 个堪称神器的学习网站 推荐给大家 如果觉得不错的话 文末请点赞 01 大学资源网 大学资源网是一个完全免费并且功能非常强大的学习网站 它免费提供了丰富并且全面的学习视频教程 并且视频课程一直在更新 非常良心 我比较看重的是它里
  • 前几天面了个32岁的测试员,年薪50w问题基本都能回答上,应该刷了不少八股文···

    互联网行业竞争是一年比一年严峻 作为测试工程师的我们唯有不停地学习 不断的提升自己才能保证自己的核心竞争力从而拿到更好的薪水 进入心仪的企业 阿里 字节 美团 腾讯等大厂 所以 大家就迎来了一堆问题 自己目前的能力能不能够支撑自己晋升 如果
  • php原生发送邮件

  • C++(24)——语言级别提供的四种类型强转的方式

    前言 不同于C语言的类型转换的不安全性 无检查机制 比如没有关系的类型间的转换 C 提供了更多的类型转换方式 语言级别提供的四种类型强转的方式 const cast 去掉 指针或引用 常量属性的类型转换 static cast 提供编译器认
  • 深入理解Plasma(3):Plasma MVP

    这一系列文章将围绕以太坊的二层扩容框架 介绍其基本运行原理 具体操作细节 安全性讨论以及未来研究方向等 本篇文章主要介绍 Plasma 的一个最小实现 Plasma MVP Minima Viable Plasma 在上一篇文章中我们已经理
  • 默认显示DrawDefaultInspector and OnInspectorGUI

    Unity Trick 1 Make an inspector for any ScriptableObject Mark Wahnish on Aug 31 2015 Over the course of development I m
  • 恢复Redis中主、从库宕机

    1 什么是哨兵 哨兵是对Redis的系统的运行情况的监控 它是一个独立进程 功能有二个 监控主数据库和从数据库是否运行正常 主数据出现故障后自动将从数据库转化为主数据库 2 原理 单个哨兵的架构 多个哨兵的架构 多个哨兵 不仅同时监控主从数
  • JAVA获取html页面中表格的数据,并把它转存到数据库

    一 使用技术 java mysql 需要实现的功能 获取html页面中表格的数据 并且把它转存到mysql数据库中 实现思路 1 通过java url处理中的url和urlconnection获取到html页面的信息 java url学习链
  • 前端页面之间的传值

    有两种方法cookie和localStorage sessionStorage cookie 工具方法封装 var operator function getCookieValue keyStr var value null var s w
  • C++图书馆管理系统源码

    define CRT SECURE NO DEPRECATE include
  • RSA公钥密码体制的简介及例题

    目录 传统密码体制 传统的对称密码体制 密钥管理 密钥分发 不支持 开放系统 公钥密码体制 主要思想 公钥密码体制的优势 密钥分发 密钥管理 开放系统 算法原理 练习 传统密码体制 传统的对称密码体制 对称密码体制 例如DES AES 允许