超全内容(除了前面3个)都放一起了,方便看~
整理不易,如果对你有用,不妨滑下去给个三连😋
1 2 3暂时没布置,就没写~如果有需要可以评论区留言
1 古典密码学
1-1经典密码体制(上)
1-2经典密码体制(下)
2 Shannon理论
2-1Shannon理论
3 分组密码与高级加密标准
3-1分组密码与高级加密标准(一)
3-2分组密码与高级加密标准(二)
3-3分组密码与高级加密标准(三)
4 Hash函数
4-1Hash函数
第1关:Hash函数的安全性
任务描述
Hash,一般翻译为散列、杂凑,或音译为哈希,是把任意长度的输入通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
本关任务:给定输入的_x_和_y_,输出线性函数的_Hash_值。
#include<bits/stdc++.h>
using namespace std;
int X1,Y1,f1;
int X2,Y2,f2;
int X3,Y3;
//在下面Begin和End之间补全代码,输出相应的结果
int main()
{
cin>>X1>>Y1>>f1;
cin>>X2>>Y2>>f2;
cin>>X3>>Y3;
/*********** Begin ***********/
int resB=(f1*X2-f2*X1)/(Y1*X2-Y2*X1);
int resA=(f1*Y2-f2*Y1)/(Y2*X1-Y1*X2);
cout<<resA*X3+resB*Y3<<endl;
/*********** End ***********/
return 0;
}
第2关:随机预言模型中的算法
任务描述
1993年,Bellare 和 Rogaway 两位学者正式提出了随机预言模型(Random OracleModel,ROM)方法论,使得过去纯做理论研究的可证明安全方法论迅速在实际应用领域取得重大进展,一大批快捷有效的安全方案相继提出,同时,还产生了“具体安全性(concrete security or exact security)”。其意义在于,我们不再仅仅满足安全性的渐近度,而且可以确切地得到较准确的安全度量。
本关任务:编写一个能计算碰撞成功率的程序。
#include<bits/stdc++.h>
using namespace std;
int M,q;
//在下面Begin和End之间补全代码,输出相应的结果
int main()
{
cin>>M>>q;
/*********** Begin ***********/
double E=1;
for(int i=1; i<q; i++){
E*=(M-i)*1.0/M;
}
printf("%.2f\n",1-E);
/*********** End ***********/
return 0;
}
第3关:Merkle-Damgard结构
任务描述
因为所需的安全散列长度越来越长,所以我们可以使用有限定义域上的散列函数(俗称压缩函数)通过迭代方式拓展为具有无限定义域的散列函数。而最为代表性的就是 Merkle-Damgard 结构。 本关任务:编写计算_compress_最多被计算的次数的程序。
#include<bits/stdc++.h>
using namespace std;
int n,t;
//在下面Begin和End之间补全代码,输出相应的结果
int main()
{
cin>>n>>t;
/*********** Begin ***********/
int ans = -1;
if(t>=2){
ans = (1+(int)ceil(n/(t-1)));
}else {
ans = (2*n+2);
}
printf("%d\n",ans);
/*********** End ***********/
return 0;
}
5 RSA密码体制和整数因数分解
5-1 RSA的一些数论知识
第1关:欧几里得算法
任务描述
欧几里德算法是用来求两个正整数最大公约数的算法。古希腊数学家欧几里德在其著作《TheElements》中最早描述了这种算法,所以被命名为欧几里德算法。
本关任务:用扩展欧几里得算法求解逆元。
#include <bits/stdc++.h>
using namespace std;
/*********** Begin ***********/
int gcd(int a,int b,int &x,int &y)
{
if(b==0)
{
x=1;
y=0;
return a;
}
int ans=gcd(b,a%b,x,y);
int temp=x;
x=y;
y=temp-a/b*y;
return ans;
}
/*********** End ***********/
int a,b; //用欧几里得算法求解a关于b的逆元
//在下面Begin和End之间补全代码,输出相应的结果
int main()
{
cin>>a>>b;
/*********** Begin ***********/
int x,y;
gcd(a, b, x, y);
while(x<0)
x+=b;
cout<<x<<endl;
/*********** End ***********/
return 0;
}
第2关:中国剩余定理
#任务描述
中国剩余定理又叫孙子定理,孙子定理是中国古代求解一次同余式组(见同余)的方法。是数论中一个重要定理。又称中国余数定理。一元线性同余方程组问题最早可见于中国南北朝时期(公元 5 世纪)的数学著作《孙子算经》卷下第二十六题,叫做“物不知数”问题,原文如下: 有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二。问物几何?即,一个整数除以三余二,除以五余三,除以七余二,求这个整数。《孙子算经》中首次提到了同余方程组问题,以及以上具体问题的解法,因此在中文数学文献中也会将中国剩余定理称为孙子定理。 本关任务:求解给定模方程组的解。
#include<bits/stdc++.h>
using namespace std;
/*********** Begin ***********/
//扩展欧几里得算法
void gcd(int a,int b,int &d,int &x,int &y)
{
if(b==0)
{
d=a;
x=1,y=0;
}
else //else不能省略
{
gcd(b,a%b,d,y,x);
y-=(a/b)*x;
}
}
//中国剩余定理
int China(int n,int *m,int *a)
{
int M=1,d,y,x=0;
for(int i=0; i<n; i++)
M*=m[i];
for(int i=0; i<n; i++)
{
int w=M/m[i];
gcd(m[i],w,d,d,y);
x=(x+y*w*a[i])%M;
}
return (x+M)%M;
}
/*********** End ***********/
//在下面Begin和End之间补全代码,输出相应的结果
int m[15],a[15];
int main()
{
int n;
cin>>n;
for(int i=0; i<n; i++)
cin>>m[i]>>a[i];
/*********** Begin ***********/
cout<<China(n,m,a)<<endl;
/*********** End ***********/
return 0;
}
第3关:拉格朗日定理
任务描述
拉格朗日定理存在于多个学科领域中,分别为:微积分中的拉格朗日中值定理;数论中的四平方和定理;群论中的拉格朗日定理 (群论),这里提出群论中的拉格朗日定理。
本关任务:计算一个素数 _p_的所有本原元素。
#include<bits/stdc++.h>
using namespace std;
int p;
//在下面Begin和End之间补全代码,输出相应的结果
int main()
{
cin>>p;
/*********** Begin ***********/
for(int i=2; i<p; i++)
{
if(__gcd(p-1,i)==1)
cout<<i<<' ';
}
cout<<endl;
/*********** End ***********/
return 0;
}
5-2 RSA密码体制
第1关:RSA密码体制
任务描述
RSA 加密算法是一种非对称加密算法。在公开密钥加密和电子商业中 RSA 被广泛使用。RSA 是 1977 年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的,当时他们三人都在麻省理工学院工作。RSA 就是他们三人姓氏开头字母拼在一起组成的。
本关任务:对输入的明文进行 RSA 加密。
#include<bits/stdc++.h>
using namespace std;
using ll=long long ;
ll n,b,x;
/*********** Begin ***********/
ll solve(ll x,ll y)
{
ll ans=1;
while(y)
{
if(y%2)
ans*=x;
y/=2;
x*=x;
while(ans>=n)
ans-=n;
while(x>=n)
x-=n;
}
return ans%n;
}
/*********** End ***********/
//在下面Begin和End之间补全代码,输出相应的结果
int main()
{
cin>>n>>b>>x;
/*********** Begin ***********/
cout<<solve(x,b)<<endl;
/*********** End ***********/
return 0;
}
第2关:素性检测
任务描述
素数又称质数,是在大于 1 的整数中,只能被 1 和其自身整除的数。素性测试是检验一个给定的整数是否为素数的测试。
本关任务:计算并输出模一个奇素数的二次剩余。
#include<bits/stdc++.h>
using namespace std;
const int maxn=10010;
int MAP[maxn];
vector<int>G;
//在下面Begin和End之间补全代码,输出相应的结果
int main()
{
int p;
cin>>p;
/*********** Begin ***********/
for(int i=1; i<p; i++)
if(!MAP[i*i%p]&&i*i%p!=0)
{
G.push_back(i*i%p);
MAP[i*i%p]