密码编码学与网络安全(第五版)答案

https://wenku.baidu.com/view/283a5dbb5727a5e9856a61ff.html

课程网址

2.4题:

  

通过如下代码分别统计一个字符的频率和三个字符的频率,"8"——"e",“;48”——“the”,英文字母的相对使用频率,猜测频率比较高的依此为),t,*,5,分别对应s,o,n,a;由此破出明文。

#include<iostream>
#include<map>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;
int cmp(const pair<string, int>& x, const pair<string, int>& y)
{
    return x.second > y.second;
}

void sortMapByValue(map<string, int>& tMap, vector<pair<string, int> >& tVector)
{
    for (map<string, int>::iterator curr = tMap.begin(); curr != tMap.end(); curr++)
    {
        tVector.push_back(make_pair(curr->first, curr->second));
    }

    sort(tVector.begin(), tVector.end(), cmp);
}
int cmp1(const pair<char, int>& x, const pair<char, int>& y)
{
    return x.second > y.second;
}

void sortMapByValue(map<char, int>& tMap, vector<pair<char, int> >& tVector)
{
    for (map<char, int>::iterator curr = tMap.begin(); curr != tMap.end(); curr++)
    {
        tVector.push_back(make_pair(curr->first, curr->second));
    }

    sort(tVector.begin(), tVector.end(), cmp1);
}
void char_pl()
{
     map<char,int> mapstr;
    char* str = "53ttp305))6*;4826)4t.)4t);8O6*;48p8q60))85;;]8*;:t*8p83(88)5*p;46(;88*96*?;8)*t(;485);5*p2:*t(;4956*2(5*-4)8q8*;4069285);)6p8)4tt;1(t9;48081;8:8t1;48p85;4)485p528806*81(t9;48;(88;4(t?34;48)4t;161;:188;t?;";
    int index = 0;
    while(str[index] != ‘\0‘)
    {
        if(mapstr.find(str[index]) ==mapstr.end())
            mapstr[str[index]] =0;
        mapstr[str[index]] ++;
        index++;
    }
    vector<pair<char,int> > tVector;
    sortMapByValue(mapstr,tVector);
    for(int i=0; i<tVector.size(); i++)
    {
        cout<<tVector[i].first<<": "<<tVector[i].second<<endl;
    }
}
void zimupl()
{
     map<string,int> mapstr;
    char* str = "53ttp305))6*;4826)4t.)4t);8O6*;48p8q60))85;;]8*;:t*8p83(88)5*p;46(;88*96*?;8)*t(;485);5*p2:*t(;4956*2(5*-4)8q8*;4069285);)6p8)4tt;1(t9;48081;8:8t1;48p85;4)485p528806*81(t9;48;(88;4(t?34;48)4t;161;:188;t?;";
    int index = 0;
    char each_str[4];
    string e_s;
    while(str[index] != ‘\0‘)
    {
        each_str[0] = str[index];
        each_str[1] =str[index+1];
        each_str[2] = str[index+2];
        each_str[3] = ‘\0‘;
        e_s = each_str;
        if(mapstr.find(e_s) ==mapstr.end())
            mapstr[e_s] =0;
        mapstr[e_s] ++;
        index++;
    }
    vector<pair<string,int> > tVector;
    sortMapByValue(mapstr,tVector);
    for(int i=0; i<tVector.size(); i++)
    {
        cout<<tVector[i].first<<":  "<<tVector[i].second<<endl;
    }
}
int main()
{
    char_pl();
    zimupl();
    return 0;
}

英文字母的相对使用频率

  

破解出的明文

  

2.14:

  

  

根据上述结果代码如下:不够长补了一个p

#include<cstdio>
#include<iostream>
#include<string>
using namespace std;
int str_to_int(char * s,int * minw_num)
{
    char a = s[0];
    int index = 0;
    while(a != ‘\0‘)
    {
        minw_num[index] = a - ‘a‘;
        a = s[++index];
    }
    cout<<index<<endl;
    return index;
}
void int_to_str(char * s,int * minw_num,int len)
{
    int index = 0;
    while(index < len)
    {
        s[index] = minw_num[index] + ‘a‘;
        index++;
    }
}
int main()
{
    int n = 2;
    int A[n][n] = {{9,4},{5,7}};
    char minwen[100] ="meetmeattheusualpalceattenratherthaneightoclockq";
    int minw_num[100];
    int miw_num[100];
    int string_len = str_to_int(minwen,minw_num);
    int a[n],b[n];
    int index = 0;
    while(index < string_len)
    {
        for (int j = 0; j< n; j++)
        {
            a[j] = minw_num[index + j];
        }
        for (int j = 0; j < n;j++)
        {
            b[j] = 0;
            for (int k = 0; k < n;k++)
                b[j] =(b[j] + A[j][k]*a[k]) % 26;
        }
         for (int j = 0; j< n; j++)
        {
            minw_num[index + j] = b[j];
        }
        index += n;
    }
    int_to_str(minwen,minw_num,string_len);
    cout<< minwen;
    return 0;
}

结果为:

解密求其逆矩阵即可:

  

*分数取模:(a/b)mod k = x ,(b,k)=1时,存在 a (mod k) = bx,即可求解x。

原文地址:https://www.cnblogs.com/yutingmoran/p/8573058.html

时间: 2024-10-26 13:20:32

密码编码学与网络安全(第五版)答案的相关文章

C++ Primer第五版答案

Downloads Download the source files for GCC 4.7.0. Download the source code files for MS Visual Studio 2012 Download the source code files for GCC pre-C++ 11 compilers 2012. Download the source code files for Microsoft pre-C++ 11 compilers. 参考链接: htt

C++ Primer【第五版】习题参考答案——第六章(函数)

本系列文章会不断更新,但是时间不能保证.另外基本上都是自己做的答案,仅供参考,如果有疑问欢迎交流. #include <iostream> #include <initializer_list> using namespace std; int test_Ex_6_27(std::initializer_list<int> li); int main() { cout << test_Ex_6_27({23,78,89,76,90}) << en

c++ primer(第五版)学习笔记及习题答案代码版(第十四章)重载运算与类型转换

笔记较为零散,都是自己不熟悉的知识点. 习题答案至于一个.h 和.cc 中,需要演示某一题直接修改 #define NUM****, 如运行14.30题为#define NUM1430: Alice Emma has long flowing red hair. Her Daddy says when the wind blows through her hair, it looks almost alive, like a fiery bird in flight. A beautiful f

C++ Primer【第五版】习题参考答案——第五章(语句)

#include <iostream> #include <vector> #include <string> using namespace std; /******************************************************************* Ex_5_1: 空语句就是只含有一个分号的语句. 如果在程序的某个地方,语法上要求有一条语句,但是逻辑上不需要, 这时就需要一条空语句. Ex_5_2: 块就是由花括号包围的复合语句

《C++ Primer 第五版》练习9.51参考答案

//Date.h #include <map> #include <string> #include <vector> using namespace std; struct Date {         explicit Date(const string & info){//检测输入格式,尝试初始化,若失败则进行errorInit             if(mymap.empty()){               initMap();         

c++ primer(第五版)学习笔记及习题答案代码版(第十一章)关联容器

笔记较为零散,都是自己不熟悉的知识点. 习题答案至于一个.cc 中,包含Chapter7.h头文件,读入文件包括./test ./rules .需要演示某一题直接修改 #define NUM****, 如运行11.23题为#define NUM1123: chapter 11 1.  关联容器不支持顺序容器的位置相关的操作,例如push_front或push_back.原因是关联容器中元素是根据关键字存储的,这些操作对 关联容器没有意义.而且关联容器也不支持构造函数或插入操作这些接收一个元素值和

c++ primer(第五版)学习笔记及习题答案代码版(第六章)函数

笔记较为零散,都是自己不熟悉的知识点. 习题答案至于一个.cc 中,编译需要包含Chapter6.h头文件. 需要演示某一题直接修改 #define NUM***, 如运行6.23题为#define NUM623: chapter 6 1. 形参初始化的机理与变量初始化一样. 当形参是引用类型时,它对应的实参被引用传递或者函数被传引用调用. 2. const和实参 void fcn(const int i){ /*fcn能够读取i,但是不能向i写值*/} void fcn(int i){ /*.

《Python核心编程》第二版第五章答案

5-1.整型.讲讲Python普通整型和长整型的区别. Python的标准整形类型是最通用的数字类型.在大多数32位机器上,标准整形类型的取值范围是-2**32-2**32 - 1. Python的长整型类型能表达的数值仅仅与你的机器支持的(虚拟)内存大小有关,换句话说,Python能轻松表达很大的整数. 长整型类型是标准整形类型的超集,当程序需要使用比标准整形更大的整型时,可以使用长整型类型,在整型值后面添加L,表示这个为长整型,这两种整形类型正在逐渐统一为 一种. 5-2.操作符.(a)写一

《C++Primer》第五版习题详细答案--目录

作者:cosefy ps: 答案是个人学习过程的记录,仅作参考. <C++Primer>第五版习题答案目录 第一章:引用 第二章:变量和基本类型 第三章:字符串,向量和数组 第四章:表达式 原文地址:https://www.cnblogs.com/cosefy/p/12180771.html