[PE182]RSA encryption
https://projecteuler.net/problem=182
题意:
找出满足下列条件的所有$e$ 的和,
- $1 < e < \varphi \left( {1009,3643} \right)$
- $gcd(e,φ)=1$
- 满足${m^e} \equiv m{\rm{ }}\bmod {\rm{ }}n$ 的$m$的个数最小
解答:
这道题最重要的就是解决这个问题:
${m^e} \equiv m{\rm{ }}\bmod {\rm{ }}n$ 中$e$确定时,$m$的取值的个数。
由于n是合数,且 $n = p*q$ ,所以先考虑${m^e} \equiv m{\rm{ }}\bmod {\rm{ }}p$ 和 ${m^e} \equiv m{\rm{ }}\bmod {\rm{ }}q$ ,
$m({m^{e - 1}} - 1) \equiv 0{\rm{ }}\bmod {\rm{ }}p$ , $p$ 是质数
- $m==0$ ,恒成立
- $m!=0$ ,${m^{e - 1}} \equiv 1\bmod {\rm{ }}p$
考虑 ${a^b} \equiv 1\bmod p$ ,$a$ 、$p$ 互素,此式中$b$确定时,$a$的个数
因为$p$ 为素数,所以必存在原根$r$ ,使得$ a= {r^k}$ ,
${r^{kb}} = 1{\rm{ }}\bmod {\rm{ }}p$
这里很容易联想到关于${a^k}\bmod {\rm{ }}p$的阶那个公式,
$ord({r^b}) = \frac{{\varphi (p)}}{{(\varphi (p),b)}},(r,p) = = 1$
变换一下位置,
$(\varphi (p),b) = \frac{{\varphi (p)}}{{ord({r^b})}},(r,p) = = 1$
${r^{ord({r^b})}}$ ,${r^{2ord({r^b})}}$ ,...,${r^{(\varphi (p ),b )ord({r^b})}}$就是使上式成立的$a$的可能取值,
所以左边就是解的个数。
所以最初的解为$\gcd (\varphi (p),b) = \gcd (p - 1,b)$
回到上面,还有$m==0$ 的情况,
所以解为$\gcd (\varphi (p),b)+1 = \gcd (p - 1,b)+1$
再看如何解决模数不为质数的问题,这里 就需要用到中国剩余定理,根据中国剩余定理,每一对$p$ 和 $q$ ,就会产生一个解,依据乘法原理,所以最后的解为$[\gcd (p - 1,e - 1) + 1]*[\gcd (q - 1,e - 1) + 1]$
接下来:就是枚举$e$ 的问题了
- 直接进行暴力
- 观察$e$,因为$\gcd ((p - 1)(q - 1),e ) = = 1$ ,故$e$ 为奇数,$e-1$ 为偶数, $\gcd (e - 1,p - 1) > = 2$ ,
$\gcd (e - 1,q - 1) > = 2$ ,这里确定了两个gcd的下界的最小值,而且显然这两个下界在枚举$e$ 的过程中是可以取到的,所以这里可以直接判断最小的情况。
复杂度:$O(n\log n)$ ,其中$logn$ 是辗转相除的复杂度,证明见维基百科。
代码1:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll inf=<<;
ll p=,q=,factor[];
ll n=q*p,phi=(p-)*(q-),mi=inf,ans;
int main(){
for(ll i=;i<phi;++i) if(__gcd(i,phi)==) factor[i]=(__gcd(i-,p-)+)*(__gcd(i-,q-)+),mi=min(mi,factor[i]);
for(ll i=;i<phi;++i) if(factor[i]==mi) ans+=i;
printf("%lld\n",ans);
}
代码2:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll inf=<<;
ll p=,q=;
ll n=q*p,phi=(p-)*(q-),ans;
int main(){
for(ll i=;i<phi;++i) if(__gcd(i,phi)==&&__gcd(i-,q-)==&&__gcd(i-,p-)==) ans+=i;
printf("%lld\n",ans);
}
[PE182]RSA encryption的更多相关文章
- PKCS #1 RSA Encryption Version 1.5
PKCS #1 RSA Encryption Version 1.5 在进行RSA运算时需要将源数据D转化为Encryption block(EB).其中pkcs1padding V1.5的填充模式 ...
- PKCS #1 RSA Encryption Version 1.5 填充方式
在进行RSA运算时需要将源数据D转化为Encryption block(EB).其中pkcs1padding V1.5的填充模式安装以下方式进行 (1) EB = 00+ BT+PS +00 + D ...
- RSA算法
RSA.h #ifndef _RSA_H #define _RSA_H #include<stdio.h> #include<iostream> #include<mat ...
- Windows phone应用开发[19]-RSA数据加密
在这个系列的第十六章节中Windows phone应用开发[16]-数据加密 中曾详细讲解过windows phone 常用的MD5,HMAC_MD5,DES,TripleDES[3DES] 数据加密 ...
- rsa && sha1 js code
jsbn.js /* * Copyright (c) 2003-2005 Tom Wu * All Rights Reserved. * * Permission is hereby granted, ...
- Go加密解密之RSA[转]
安全总是很重要的,各个语言对于通用的加密算法都会有实现.前段时间,用Go实现了RSA和DES的加密解密,在这分享一下.(对于RSA和DES加密算法本身,请查阅相关资料) 在PHP中,很多功能经常是一个 ...
- RSA (cryptosystem)
https://en.wikipedia.org/wiki/RSA_(cryptosystem) RSA is one of the first practical实用性的 public-key cr ...
- Java 进行 RSA 加解密时不得不考虑到的那些事儿
1. 加密的系统不要具备解密的功能,否则 RSA 可能不太合适 公钥加密,私钥解密.加密的系统和解密的系统分开部署,加密的系统不应该同时具备解密的功能,这样即使黑客攻破了加密系统,他拿到的也只是一堆无 ...
- OpenSSL中的大数接口与基于其的自用RSA加密接口设计
本文记录了初次接触OpenSSL中的大数模块,重温了RSA加密流程,使用OpenSSL的接口包装成自用RSA加密接口,并且利用自己的接口演示了Alice与Bob通过RSA加密进行通讯的一个示例. 概览 ...
随机推荐
- maven nexus 搭建
http://www.cnblogs.com/adolfmc/archive/2012/08/21/2648415.html http://www.cnblogs.com/dingyingsi/p/3 ...
- YII框架学习(一)
1.安装: windows:将php命令所在的文件夹路径加入到环境变量中,通过cmd命令:进入yii框架中的framework目录,执行: php yiic webapp ../cms linux:类 ...
- Android发送验证码的倒计时button
1 直接上图 2 原理 原理非常easy,就是把对应的倒计时逻辑等封装到一个控件中,并向外部提供接口. 3 代码 import java.util.Timer; import java.util.Ti ...
- LoadRunner性能测试过程/流程
用LoadRunner进行负载测试的流程通常由五个阶段组成:计划.脚本创建.场景定义.场景执行和结果分析.(1)计划负载测试:定义性能测试要求,例如并发用户的数量.典型业务流程和所需响应时间.(2)创 ...
- MongoDB的对象的创建
package com.voice.db; import com.mongodb.DB; import com.mongodb.DBCollection; import com.mongodb.Mon ...
- 洛谷 2261 [CQOI2007]余数求和
题目戳这里 一句话题意 求 \(\sum_{i=1}^{n} (k ~~\texttt{mod} ~~i)\) Solution 30分做法: 说实话并不知道怎么办. 60分做法: 很明显直接一遍o( ...
- Flask:模板
模板是一个包含响应文本的文件,其中包含用占位变量表示的动态部分,具体值只在请求的上下文中才能知道.使用真实值替换变量,再返回最终得到的响应字符串.这个过程称为渲染,为了渲染模板,Flask使用了一个名 ...
- linux c编程:网络编程
在网络上,通信服务都是采用C/S机制,也就是客户端/服务器机制.流程可以参考下图: 服务器端工作流程: 使用socket()函数创建服务器端通信套接口 使用bind()函数将创建的套接口与服务器地址绑 ...
- win7下搭建nginx+php的开发环境(转)
在win7下用的是IIS做web服务器,但近来因项目需求的原因,需要在服务器遇到404错误的时候自动做转向(不是在客户端的跳转,而是在服务器收到客户端请求去某目录下读取文件返回时,如果发现目录或目录下 ...
- 【windows】更改最大动态端口数
最近业务遇到一个奇怪的问题,一台iis服务器,居然报端口不足的错误,分析应该是服务器可用的动态端口数不够了,windows默认的动态端口范围为:1024-5000,也就是最多3977个动态端口可用,如 ...