kasiski测试法 c语言,维吉尼亚密码C语言实现.doc

维吉尼亚密码C语言实现

2016春 密码学原理 软件学院

密码学原理作业报告

作业1:古典密码体制的实践与分析

姓名

查志华

院系

软件学院

学号

1133710313

任课教师

刘绍辉

指导教师

刘绍辉

实验地点

哈尔滨工业大学

实验时间

2016.3.15-2016.3.18

一、实验目的

要求:综述本次实验的基本目的。

1.了解古典密码的基本体制,掌握维吉尼亚密码的加解密方式,能对文件进行加解密。

2. 掌握重合指数的计算方法,了解掌握Kasiski’s 的计算方法,能对明文以及密文进行重合指数的计算以及Kasiski’s 计算方法;

二、实验内容

要求:对如下内容进行详细描述。

弗吉尼亚密码加密解密算法;

明文 =(密文-密钥+26)/26;

密文 = (明文+密钥)/26;

具体实现见下代码。

重合指数计算算法;

先统计出各个字母出现的频数,f(a),f(b),……,f(z)f(a)+f(b)+……+f(z)=X (X就是密文长度),然后把所有的 f(字母)*(f(字母)-1) 的和求出来,假设为sum ,sum/(X*(X-1))就是重合指数

具体实现见下代码。

Kasiski’s 计算方法;

在密文中标出重复的三个或多个字符结构;

对每一个字符结构,记下结构的起始位置;

计算相邻的起始点的距离;

对每个距离求出所有因数;

若使用多字母替换密码,则密钥的长度为步骤4种出现的某一因数;

三、实验结果及分析

要求:将实验获得的结果进行描述,涉及不同的密钥以及密钥长度,不同密文长度情况下的Kasiski分析及重合指数分析得出的结果。

选择文件进行操作,对于不同的密钥以及不同长度的密钥,情况如下:

(文件选取为英文原著阿兹卡班的囚徒1.txt,大小为21K)

各字符频率统计:

密钥长度为4时,即n=4时:

密钥长度为16时,即n=16时:

重合指数计算:

n=1时:

n=2时:

n=4时:

n=8时:

n=16时:

n=32时:

n=64时:

n=128时:

n=256时:

n=9000时:

结论:当密钥的长度足够大时,发现密文的重合指数会趋向于3.84%,也就是1/26。

代码如下:

#include

#include

#include

#include

#include

void Genkey(int len);

void DenKey();

int main()

{

int len = 0;

int select =0;

while(1)

{

printf("请选择操作:加密(1);解密(2):退出(3)\n");

scanf("%d",&select);

if(select ==1)//加密操作

{

printf("请输入密钥长度\n");

scanf("%d",&len);

Genkey(len);

}

else if(select ==2)//解密操作

{

DenKey();

}

else if(select ==3)

{

exit(0);

}

else

{

printf("输入有误!\n");

}

}

return 0;

}

void Genkey(int len)

{

srand((unsigned) time(NULL)); //用时间做种,每次产生随机数不一样

int number=0,i=0,j=0,len1;

len1=len;

char ch;

char key1[10000]= "";

char alp[26] = {'A','B','C','D','E','F','G',

'H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'

};

while(len >0)//随机生成密钥

{

number= rand() % 26; //产生0-25的随机数

key1

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
以下是基于C++编写的Kasiski测试法代码,用于破解维吉尼亚密码: ``` #include <iostream> #include <string> #include <map> #include <vector> #include <algorithm> using namespace std; // 计算两个字符串的最长公共子串 int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); } // 计算两个字符串的最长公共子串 int gcd(string a, string b) { int len1 = a.length(); int len2 = b.length(); int len = min(len1, len2); for (int i = 0; i < len; i++) { if (a[i] != b[i]) { return gcd(i, len1 - (i + 1)) + 1; } } return gcd(len, abs(len1 - len2)); } // 计算字符串中所有可能的重复序列和距离 vector<pair<string, int>> get_repeating_sequences(string text, int min_len) { vector<pair<string, int>> sequences; for (int len = min_len; len < text.length(); len++) { for (int i = 0; i <= text.length() - len; i++) { string seq = text.substr(i, len); for (int j = i + len; j <= text.length() - len; j++) { if (text.substr(j, len) == seq) { sequences.push_back(make_pair(seq, j - i)); } } } } return sequences; } // 计算可能的秘钥长度 vector<int> get_key_lengths(string text, int min_len, int max_len) { vector<pair<string, int>> sequences = get_repeating_sequences(text, min_len); map<int, int> distances; for (auto seq : sequences) { distances[seq.second] += 1; } vector<int> key_lengths; for (auto dist : distances) { if (dist.second > 1) { key_lengths.push_back(dist.first); } } sort(key_lengths.begin(), key_lengths.end()); vector<int> factors; for (auto len : key_lengths) { for (int i = min_len; i <= max_len; i++) { if (len % i == 0) { factors.push_back(i); } } } sort(factors.begin(), factors.end()); auto last = unique(factors.begin(), factors.end()); factors.erase(last, factors.end()); return factors; } // 使用频率分析法破解维吉尼亚密码 string decrypt_vigenere(string text, string key) { string decrypted = ""; for (int i = 0; i < text.length(); i++) { int ki = key[i % key.length()] - 'A'; int ci = text[i] - 'A'; int pi = (ci - ki + 26) % 26; decrypted += 'A' + pi; } return decrypted; } int main() { string ciphertext = "QOPXKMCOXZLPPVXDOHDJTFKZAZWSZJYRFDJYGVYRJQ"; int min_len = 3; int max_len = 10; vector<int> key_lengths = get_key_lengths(ciphertext, min_len, max_len); for (auto len : key_lengths) { cout << "Possible key length: " << len << endl; string key = ""; for (int i = 0; i < len; i++) { string column = ""; for (int j = i; j < ciphertext.length(); j += len) { column += ciphertext[j]; } map<char, int> freq; for (auto c : column) { freq[c] += 1; } char most_common = 'A'; for (auto f : freq) { if (f.second > freq[most_common]) { most_common = f.first; } } int ki = (most_common - 'A' + 26 - 4) % 26; key += 'A' + ki; } cout << "Decrypted text: " << decrypt_vigenere(ciphertext, key) << endl; } return 0; } ``` 在这个代码中,我们首先定义了三个函数。函数 `gcd` 用于计算两个字符串的最长公共子串,函数 `get_repeating_sequences` 用于计算字符串中所有可能的重复序列和距离,函数 `get_key_lengths` 用于计算可能的秘钥长度。 在 `main` 函数中,我们使用 `get_key_lengths` 函数计算可能的秘钥长度,对于每个秘钥长度,我们使用频率分析法破解密码并输出解密后的明文。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值