Mobile Internet Security Experimental Assignment for Jingdezhen Ceramic University -2023

文章内容由本人编写,人工智能,道友摘录 组构而成。
如内容有出错,可联系邮箱: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;
}

😶‍🌫️
thanks

  • 13
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值