文章内容由本人编写,人工智能,道友摘录 组构而成。
如内容有出错,可联系邮箱:1478928343@qq.com、halibaduoxiansheng@gmail.com,俺将第一时间进行修改~
密钥分析
经典密码体制(上)
第1关 移位密码
#include<bits/stdc++.h>
using namespace std;
char S[100];
int main()
{
int K;
int i,len;
scanf("%d",&K);
cin>>S;
len=strlen(S);
for(i=0;i<len;i++){
S[i]=(S[i]-'a'+K)%26+'a';
cout<<S[i];
}
}
第2关 代换密码
#include<bits/stdc++.h>
using namespace std;
char A[27],B[27],M[100];
map<char,char>MAP;
//在下面Begin和End之间补全代码,对输入的字符串进行代换表置换
int find(char A[27], char ch){ // 找出是第几个(下标)
for(int i = 0; i <= 26; i++){
if(A[i]==ch){
return i;
}
}
return 0;
}
int main()
{
cin>>A;
cin>>B; // 是下面的兑换上面的
cin>>M; // M是先提取下面的B 再去找对应的A
string str = "\0";
/*********** Begin ***********/
for(int i = 0; i < strlen(M); i++){
int num = find(A, M[i]); // 找出下标了
str += B[num];
}
cout<<str;
/*********** End ***********/
}
第3关 仿射密码
#include<bits/stdc++.h>
using namespace std;
char A[103];
constexpr int mod=26;
//在下面Begin和End之间补全代码,对输入的字符串进行仿射密码解密
/*********** Begin ***********/
size_t quick(size_t x,size_t y)
{
size_t ans=x;
while(y)
{
if(y&1)
ans=ans*x%mod;
x=x*x%mod;
y>>=1;
}
return ans;
}
int main()
{
int a,b;
cin>>a>>b;
cin>>A;
int x=quick(a,15);
for(int i=0; i<strlen(A); i++)
printf("%c",'a'+(x*((A[i]-'a'-b+mod)%mod)%mod));
return 0;
}
/*********** End ***********/
第4关 维吉尼亚密码
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <string>
#include <istream>
using namespace std;
/* 存在大小写的问题 */
#define ALPHANUMBER 26
int main(void)
{
string inputStr; // 输入的明文字符串
string keyStr; // 用作加密的密钥字符串
string outputStr; // 密文字符串
cin >> keyStr;
cin >> inputStr;
for (int i = 0; i < keyStr.length(); i++)
if (keyStr[i] >= 'A' && keyStr[i] <= 'Z')
keyStr[i] = keyStr[i] + 32;
// cout << keyStr.length() << endl;
// cout << keyStr << endl;
int j = 0;
for(int i = 0; i < inputStr.length(); i++)
if(isalpha(inputStr[i]))
{
if(inputStr[i] >= 'A' && inputStr[i] <= 'Z')
outputStr[i] = ((inputStr[i] - 65) + (keyStr[j++] - 97)) % ALPHANUMBER;
else if (inputStr[i] >= 'a' && inputStr[i] <= 'z')
outputStr[i] = ((inputStr[i] - 97) + (keyStr[j++] - 97)) % ALPHANUMBER;
j = j % keyStr.length();
}
for(int i =0 ; i < inputStr.length(); i++)
if(isalpha(inputStr[i]))
{
if (inputStr[i] >= 'A' && inputStr[i] <= 'Z'){
printf("%c", tolower(outputStr[i] + 65));
}
else if (inputStr[i] >= 'a' && inputStr[i] <= 'z')
printf("%c", tolower(outputStr[i] + 97));
else
printf("%c", tolower(inputStr[i]));
}
return 0;
}
经典密码体制(下)
第1关 希尔密码
#include<bits/stdc++.h>
using namespace std;
#define MAX 60
int n;
int main()
{
int K1[2][2] = {0}, K2[2][2] = {0};
int Temp1[2] = {0}, Temp2[2] = {0};
char text[MAX] = {0},result[MAX] = {0};
int T1[MAX] = {0}, T2[MAX] = {0};
int len, flag=0, temp, temp1, i, j, num=0;
cin>>n;
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
cin>>K1[i][j];
}
}
cin>>text;
/**加密**/
len = strlen(text);
// 当长度为奇数时补齐一位
if(len % 2 == 1)
{
text[len] = 'a';
len = strlen(text);
flag = 1;
}
// 将大写转成小写,并赋值给T1数组
for(i=0; i<len; i++)
{
if(text[i] >= 'A' && text[i] <= 'Z')
{
text[i] = text[i] + 32;
}
T1[i] = text[i] - 'a';
}
// 得到加密后结果,存储在T2中
for(i=0; i<len; i+=2)
{
Temp1[0] = T1[i];
Temp1[1] = T1[i + 1];
// Temp2存储密文int值
Temp2[0] = (Temp1[0] * K1[0][0] + Temp1[1] * K1[1][0]) % 26;
Temp2[1] = (Temp1[0] * K1[0][1] + Temp1[1] * K1[1][1]) % 26;
T2[i] = Temp2[0];
T2[i + 1] = Temp2[1];
}
if(flag == 1)
{
len = len - 1;
}
for(i=0; i<len; i++)
{
result[i] = T2[i] + 'a';
}
cout<<result;
return 0;
}
第2关 置换密码
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
int K1[200], K2[200];
for (int i = 0; i < n; ++i) {
cin >> K1[i];
K2[K1[i] - 1] = i;
}
string plaintext;
cin >> plaintext;
string ciphertext = plaintext;
for (int i = 0; i < plaintext.length(); i += n) {
string group = plaintext.substr(i, n);
string encryptedGroup = group;
for (int j = 0; j < n; ++j) {
encryptedGroup[K2[j]] = group[j];
}
ciphertext.replace(i, n, encryptedGroup);
}
cout<<ciphertext;
return 0;
}
第3关 流密码
#include<bits/stdc++.h>
using namespace std;
#define mod 26
char A[100];//明文串
char B[100]; // 结果
int n;//密钥
int main()
{
cin>>n;
cin>>A;
//在下面Begin和End之间补全代码,对输入的字符串进行置换表置换
/*********** Begin ***********/
int length = strlen(A);
int nums1[length];
int nums2[length];
int nums3[length];
for (int i = 0; i < length; i++){ // 得到整数序列
nums1[i] = A[i] - 'a';
}
nums2[0] = n;
for (int i = 1; i < length; i++){ // 得到密钥
nums2[i] = nums1[i-1];
}
// 得到需要的数字转化为字母
for(int i = 0; i < length; i++) {
B[i] = 'a' + (nums1[i]+nums2[i])%26;
}
cout<<B;
/*********** End ***********/
}
RSA密码体制
第1关 RSA密码体制
#include<bits/stdc++.h>
using namespace std;
using ll=long long ;
ll n,b,x;
/*********** Begin ***********/
/*********** End ***********/
//在下面Begin和End之间补全代码,输出相应的结果
ll modularExponentiation(ll base, ll exponent, ll modulus) {
ll result = 1;
base = base % modulus;
while (exponent > 0) {
if (exponent % 2 == 1) {
result = (result * base) % modulus;
}
exponent = exponent >> 1;
base = (base * base) % modulus;
}
return result;
}
int main() {
cin >> n >> b >> x;
ll encrypted = modularExponentiation(x, b, n);
cout <<encrypted;
return 0;
}
第2关 素性检测
#include<bits/stdc++.h>
using namespace std;
const int maxn = 10010;
int MAP[maxn];
vector<int> G;
bool isPrime(int num) {
if (num < 2) {
return false;
}
for (int i = 2; i * i <= num; ++i) {
if (num % i == 0) {
return false;
}
}
return true;
}
void quadraticResidue(int p) {
G.clear();
memset(MAP, 0, sizeof(MAP));
for (int i = 1; i < p; ++i) {
int residue = (i * i) % p;
if (MAP[residue] == 0) {
MAP[residue] = 1;
G.push_back(residue);
}
}
sort(G.begin(), G.end());
}
int main() {
int p;
cin >> p;
if (!isPrime(p)) {
cout << "输入的数不是素数" << endl;
return 0;
}
quadraticResidue(p);
//cout << "模 " << p << " 的二次剩余为:";
for (int i = 0; i < G.size(); ++i) {
cout << " " << G[i];
}
cout << endl;
return 0;
}
第3关 二次剩余
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int INF_INT = 0x3f3f3f3f;
const LL INF_LL = 0x3f3f3f3f3f3f3f3f;
bool isPrime(LL n) {
if (n <= 1 || (n > 2 && n % 2 == 0)) {
return false;
}
LL d = n - 1;
int s = 0;
while (d % 2 == 0) {
d /= 2;
s++;
}
// Miller-Rabin算法进行素性检测
vector<LL> bases = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37};
for (LL base : bases) {
if (base >= n - 2) {
break;
}
LL x = 1;
LL exp = d;
while (exp > 0) {
if (exp & 1) {
x = (x * base) % n;
}
base = (base * base) % n;
exp >>= 1;
}
if (x == 1 || x == n - 1) {
continue;
}
for (int r = 1; r < s; r++) {
x = (x * x) % n;
if (x == n - 1) {
break;
}
if (r == s - 1) {
return false;
}
}
}
return true;
}
int main() {
LL n;
cin >> n;
if (isPrime(n)) {
cout << "YES" << endl;
} else {
cout << "NO" << endl;
}
return 0;
}
漏洞扫描
nmap的使用
22,23,5901,6001,6901
这个任务自己看着办 直接copy上面的也是可以通过
Windows的cmd命令
#!bin/bash
#//打开资源管理器
#/********* Begin *********/
explorer
#/********* End *********/
#//打开记事本
#/********* Begin *********/
notepad
#/********* End *********/
#//扫描错误并复原
#/********* Begin *********/
sfc /scannow
#/********* End *********/
信息安全概述
第一题:AB
第二题:B
防火墙
1.点击图形化,等待实验环境准备完成
2.鼠标右击,选择“再此打开终端”,准备输入下面讲的三行代码
3.从上往下依次输出以下三行代码,每输出完成一行就回车一次(输入完三层后点击评测即可)
iptables -A INPUT -s 0.0.0.0 -j DROP
iptables -nL --line-number
iptables -nL --line-number > iptables.txt
数字签名
RSA、ElGamal、Schnorr签名技术
第1关 RSA签名方案
#include<bits/stdc++.h>
using namespace std;
#define ll long long
// 计算模幂运算,即 (base^exponent) % modulus
ll modPow(ll base, ll exponent, ll modulus) {
ll result = 1;
base = base % modulus;
while (exponent > 0) {
if (exponent & 1) {
result = (result * base) % modulus;
}
base = (base * base) % modulus;
exponent >>= 1;
}
return result;
}
/*********** Begin ***********/
int main() {
ll p, q, b, x;
cin >> p >> q >> b >> x;
ll n = p * q;
ll phi_n = (p - 1) * (q - 1);
// 计算签名 s = (x^b) % n
ll s = modPow(x, b, n);
cout << s << endl;
return 0;
}
/*********** End ***********/
第2关 ElGamal签名方案
#include<bits/stdc++.h>
using namespace std;
#define ll long long
//在下面Begin和End之间补全代码,输出相应的结果
/*********** Begin ***********/
ll quick(ll a,ll b, ll p)
{
ll ans=1;
while(b)
{
if(b&1)
ans=ans*a%p;
a=a*a%p;
b>>=1;
}
return ans%p;
}
ll eular(ll n)
{
ll ans = n;
for(int i=2; i*i <= n; ++i)
{
if(n%i == 0)
{
ans = ans/i*(i-1);
while(n%i == 0)
n/=i;
}
}
if(n > 1)
ans = ans/n*(n-1);
return ans;
}
/*********** End ***********/
int main()
{
ll p,alp,a,k,x;
cin>>p>>alp>>a>>k>>x;
/*********** Begin ***********/
ll beta=quick(alp,a,p)%p;
ll gamma=quick(alp,k,p)%p;
ll delta=(((x-a*gamma)*quick(k,eular(p-1)-1,p-1)%(p-1))+p-1)%(p-1);
cout<<gamma<<' '<<delta<<endl;
/*********** End ***********/
return 0;
}
第3关 Schnorr签名方案
#include<bits/stdc++.h>
using namespace std;
#define ll long long
//在下面Begin和End之间补全代码,输出相应的结果
int main()
{
ll k,a,q,h;
cin>>k>>a>>q>>h;
/*********** Begin ***********/
cout<<(k+a*h)%q<<endl;
/*********** End ***********/
return 0;
}
数字签名、椭圆曲线DSA、一次签名
第1关 数字签名算法
#include<bits/stdc++.h>
using namespace std;
#define ll long long
//在下面Begin和End之间补全代码,输出相应的结果
/*********** Begin ***********/
ll quick(ll a,ll b, ll p)
{
ll ans=1;
while(b)
{
if(b&1)
ans=ans*a%p;
a=a*a%p;
b>>=1;
}
return ans%p;
}
/*********** End ***********/
int main()
{
ll a,q,alp,p,k,sha;
cin>>a>>q>>alp>>p>>k>>sha;
/*********** Begin ***********/
ll beta=quick( alp,k, p)%q;
cout<<beta<<' '<<(sha+a*beta)*quick( k,q-2, q)%q<<endl;
/*********** End ***********/
return 0;
}
第2关 椭圆曲线DSA(ECDSA)
#include<bits/stdc++.h>
using namespace std;
#define ll long long
//在下面Begin和End之间补全代码,输出相应的结果
/*********** Begin ***********/
ll quick(ll a,ll b, ll p)
{
ll ans=1;
while(b)
{
if(b&1)
ans=ans*a%p;
a=a*a%p;
b>>=1;
}
return ans%p;
}
/*********** End ***********/
int main()
{
ll u,v,q,k,SHA,m;
cin>>u>>v>>q>>k>>SHA>>m;
/*********** Begin ***********/
ll r=u%q;
cout<<r<<' '<<quick(3,q-2,q)*(SHA+m*r)%q<<endl;
/*********** End ***********/
return 0;
}
第3关 一次签名
#include<bits/stdc++.h>
using namespace std;
#define ll long long
//在下面Begin和End之间补全代码,输出相应的结果
/*********** Begin ***********/
ll quick(ll a,ll b, ll p)
{
ll ans=1;
while(b)
{
if(b&1)
ans=ans*a%p;
a=a*a%p;
b>>=1;
}
return ans%p;
}
/*********** End ***********/
ll y[1000][3];
char s[1000+10];
int main()
{
ll q,c,k;
scanf("%lld%lld%lld",&q,&c,&k);
for(int i=0; i<k; i++)
scanf("%lld%lld",&y[i][0],&y[i][1]);
scanf("%s",s);
/*********** Begin ***********/
for(int i=0; i<strlen(s); i++)
{
if(s[i]=='0')
printf("%lld",quick(c,y[i][0],q));
else
printf("%lld",quick(c,y[i][1],q));
if(i==strlen(s)-1)
printf("\n");
else
printf(" ");
}
/*********** End ***********/
return 0;
}
全域Hash、不可否认的签名、fail−stop签名
第1关 全域Hash
#include<bits/stdc++.h>
using namespace std;
#define ll long long
//在下面Begin和End之间补全代码,输出相应的结果
int main()
{
double epsilon,q;
int k;
scanf("%lf%d%lf",&epsilon,&k,&q);
/*********** Begin ***********/
printf("%.6f\n",(epsilon-1.0/(1LL<<k)/q));
/*********** End ***********/
return 0;
}
第2关 不可否认的签名
#include<bits/stdc++.h>
using namespace std;
#define ll long long
//在下面Begin和End之间补全代码,输出相应的结果
/*********** Begin ***********/
ll quick(ll a,ll b, ll p)
{
ll ans=1;
while(b)
{
if(b&1)
ans=ans*a%p;
a=a*a%p;
b>>=1;
}
return ans%p;
}
/*********** End ***********/
int main()
{
ll x,q,a;
cin>>x>>q>>a;
/*********** Begin ***********/
cout<<quick(x,a, q)<<endl;
/*********** End ***********/
return 0;
}
第3关 fail−stop签名
#include<bits/stdc++.h>
using namespace std;
#define ll long long
//在下面Begin和End之间补全代码,输出相应的结果
/*********** Begin ***********/
ll quick(ll a,ll b, ll p)
{
ll ans=1;
while(b)
{
if(b&1)
ans=ans*a%p;
a=a*a%p;
b>>=1;
}
return ans%p;
}
ll eular(ll n)
{
ll ans = n;
for(int i=2; i*i <= n; ++i)
{
if(n%i == 0)
{
ans = ans/i*(i-1);
while(n%i == 0)
n/=i;
}
}
if(n > 1)
ans = ans/n*(n-1);
return ans;
}
/*********** End ***********/
int main()
{
ll alpha,p,k,beta,a_1,a_2,b_1,b_2,x,x_1,x_2;
cin>>alpha>>p>>k>>beta>>a_1>>a_2>>b_1>>b_2>>x>>x_1>>x_2;
/*********** Begin ***********/
ll gamma_1=quick(alpha,a_1,p)*quick(beta,a_2,p)%p;
ll gamma_2=quick(alpha,b_1,p)*quick(beta,b_2,p)%p;
ll _x1=(a_1+x*b_1)%k;
ll _x2=(a_2+x*b_2)%k;
ll a_0=((x_1-_x1)*quick(_x2-x_2,eular(k)-1,k)%k+k)%k;
cout<<a_0<<endl;
/*********** End ***********/
return 0;
}
😶🌫️