每日一练RSA (20 分)

简介: RSA公开密钥密码体制是一种使用不同的加密密钥与解密密钥,在密钥长度足够长的时候“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制。在公开密钥密码体制中,加密密钥(即公开密钥,简称公钥)PK是公开信息,而解密密钥(即秘密密钥,简称私钥)SK是需要保密的。加密算法E和解密算法D也都是公开的。信息具有时效性,假如你获得了某同桌所接收到的密文信息,辛苦一周破译出来上面的信息是“今晚机房钥匙会插在门上,想去刷题可以自己随便去。”,这个信息对于你来说没有价值,因为机房钥匙可能早就不在门上了。

RSA:

RSA公开密钥密码体制是一种使用不同的加密密钥与解密密钥,在密钥长度足够长的时候“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制。在公开密钥密码体制中,加密密钥(即公开密钥,简称公钥)PK是公开信息,而解密密钥(即秘密密钥,简称私钥)SK是需要保密的。加密算法E和解密算法D也都是公开的。


信息具有时效性,假如你获得了某同桌所接收到的密文信息,辛苦一周破译出来上面的信息是“今晚机房钥匙会插在门上,想去刷题可以自己随便去。”,这个信息对于你来说没有价值,因为机房钥匙可能早就不在门上了。


公开密钥密码体制中虽然解密密钥SK是由公开密钥PK决定的,但密钥长度足够长的时候却不能在有意义的时间内根据PK计算出SK。


基于这种理论,1978年出现了著名的RSA算法,它通常是先生成一对RSA密钥,其中之一是保密密钥,由用户保存;另一个为公开密钥,可对外公开,甚至可在网络服务器中注册。外界任何一个人都可以使用该公钥对信息加密,该密文只有拥有保密密钥的人才可以有能力短 时间内解密。为提高保密强度,RSA密钥一般至少为500位长,一般推荐使用1024位。这就使加密的计算量很大。为减少计算量,在传送信息时,常采用传统加密方法与公开密钥加密方法相结合的方式。


RSA是被研究得最广泛的公钥算法,从提出到现在已近三十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。1983年麻省理工学院在美国为RSA算法申请了专利。


RSA具体流程如下(mod表示整除求余,相当于C/C++语言当中的%):


STEPS


1.随机选择两个不相等的质数p和q。


2.计算n=p∗q。


3.选择一个整数e,使得e和(p−1)(q−1)互质


4.找出正整数d,使得(e∗d)mod((p−1)∗(q−1))=1


5.公开(e,n)作为RSA公钥。


6.保留(d,n)作为RSA私钥。

将明文m看成是一个正整数,任何人知道公钥后可以按下面的公式进行加密得到密文c: c=me mod n

拥有保密密钥的人按下面的公式进行解密: m=cd mod n

举例说明:取两个素数p=7, q=13,再取e=5,可以计算出一对密钥:p=7, q=13, n=91, e=5,d=29, (n,e)=(91,5), (n,d)=(91,29)

以数据加密为例:

A向B发送机密数据信息m=15,并已知B的公钥(n,e)=(91,5),于是可计算出密文:   

c=me mod n=71

A将c发送至B, B利用私钥(n,d)=(91,29)对c进行解密:

m=cd mod n=15


显然,上述关于RSA的描述大部分来源于网络...


真正的问题来了:不懂RSA原理和使用条件的彼得同学对外发布了他的公钥(e,n)=(10931, 17113),小白截获了彼得收到的N个密文信息,请求你帮助其破译出明文。

输入格式:

第一行一个整数N,表示小白截获的密文数量,接下来每行一个正整数m表示一个密文信息。

输出格式:

输出N行,每行一个整数,表示对应的明文信息。

输入样例:

1. 1
2. 1
3. 复制代码

输出样例:

1. 1
2. 复制代码

思路

首先枚举小于n的质数,放进数组p中。再从p中取出两个数字满足互不相等且p*q==N。得到p,q。

(在求p,q的方面,假如去枚举n的因数再检查是否是质数,时间复杂度很大很大,这道题就会超时。)


接着求出x,再根据e * d % x == 1,枚举求出d。

如果直接使用pow会溢出,所以得使用快速幂。

代码如下:

#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
const int N = 17113, E = 10931;
typedef long long LL;
int P, Q, D;
vector<int> p;
bool is_prime(int x)  // 判定质数
{
    if (x < 2) return false;
    for (int i = 2; i <= x / i; i ++ )
        if (x % i == 0)
            return false;
    return true;
}
void init()
{
    for(int i = 2; i < N; i++) {
        if(is_prime(i)) {
            p.push_back(i);//枚举所有小于N的质数,并且放进p里。
        }
    }
    for(int i = 0; i < p.size(); i++) {
        for(int j = i + 1; j < p.size(); j++) {
            if(p[i] * p[j] == N) {
                P = p[i], Q = p[j];//得到P,Q的值
                break ;
            }
        }
    }
    int x = (P - 1) * (Q - 1);
    for(int d = 1; ; d++) {
        if(E * d % x == 1) {//枚举得到私钥D的值
            D = d;
            break;
        }
    }
}
int quick_power(int a, int k, int p)  // 求a^k mod p 快速幂
{
    int res = 1 % p;
    while (k)
    {
        if (k & 1) res = (LL)res * a % p;
        a = (LL)a * a % p;
        k >>= 1;
    }
    return res;
}
int main()
{
    init();
    int t, x;
    cin >> t;
    while(t--)
    {
        cin >> x;
        cout << quick_power(x, D, N) << endl;//得到明文。
    }
    return 0;
}



相关文章
|
5月前
|
存储 监控 算法
又快又省:SLS 新版日志聚类,从海量日志发现模式的智能引擎
新版日志聚类通过自动发现日志模板解决海量日志分析难题,提升日志排查效率。
421 44
|
7月前
|
运维 监控 Cloud Native
Linux Kernel:云原生时代的操作系统内核
Linux Kernel是1991年Linus创建的开源内核,作为云计算与容器技术的基石,支撑进程隔离(Namespace/Cgroups)、K8s资源限制、eBPF监控等核心能力。掌握其五大子系统,是运维深入云原生的关键。(239字)
684 10
|
机器学习/深度学习 传感器 安全
从传统到智能:2025年安全管理系统分析与工具选型
本系统基于工业4.0技术,融合物联网、边缘计算与AI,构建分层防御架构,支持实时态势感知与自适应学习。采用多模态感知层、TSN网络与微服务架构,集成计算机视觉与多传感器融合算法,结合知识图谱与智能工作流,实现高效安全管理。
715 4
|
Web App开发 前端开发 JavaScript
鸿蒙5开发宝藏案例分享---Web适配一多开发实践
这是一份实用的鸿蒙Web多设备适配开发指南,针对开发者在不同屏幕尺寸下的布局难题提供了解决方案。文章通过三大法宝(相对单位、媒体查询和窗口监听)详细介绍如何实现智能适配,并提供了多个实战案例,如宫格布局、对话框变形和自适应轮播图等。此外,还分享了调试技巧及工具推荐,帮助开发者快速上手并优化性能。最后鼓励读者实践探索,并提示更多官方资源等待发现。
|
数据采集 机器学习/深度学习 监控
训练数据的质量
【10月更文挑战第13天】
464 10
Java系列 之除字符串中的空格(trim())
这篇文章介绍了Java中`String`类的`trim()`方法,用于去除字符串首尾的空格,并指出`trim()`只能去除半角空格,对于全角空格需要先用`replace()`方法替换成半角空格再进行去除。
数学符号ln
ln在数学里表示的是以常数e(无理数,约等于2.71828...)为底的自然对数符号。即lnm=loge(m)其中,log (英语名词:logarithms)表示的是对数运算。当a^b=n时,也可表示为log(a)(n)=b。
5335 0
|
存储 Kubernetes 负载均衡
一句话总结Kubernetes的Headless服务
Kubernetes的概念很多,有的着实让人费解,比如说Headless服务,听名字就很拗口。那Headless服务是什么,使用场景是什么。一句话总结:Headless服务就是一组Pod组成的只供集群内访问(没有ClusterIP)的Service,一般结合StatefulSet用于部署有状态应用的场景。
一句话总结Kubernetes的Headless服务
|
运维
查看调整cpu频率及模式
查看调整cpu频率及模式
685 2