logo资料库

东北大学软件学院密码学Vigenere实验报告.doc

第1页 / 共5页
第2页 / 共5页
第3页 / 共5页
第4页 / 共5页
第5页 / 共5页
资料共5页,全文预览结束
一、 实验目的与意义 利用编程实现 Vigenere 密码的加解密。通过编程进一步掌握 Vigenere 密码 的原理与加解密过程。 二、 实验环境 操作系统:Windows 7 实验环境:Microsoft Visual C++6.0 三、 实验的预习内容 实验前主要学习 C 语言的文件和指针操作,以及 Vigenere 密码的加解密方法。 利用数学公式在不生成字母表的情况下,进行加解密操作。 预计程序分为加密和解密两大部分。还有涉及到如何读取存储文件。尽量做到结构化 编程,使之各个子模块之间干扰小,代码利用率高。 四、 实验的步骤与调试方法 (1) 获取到用户输入的关键字,对获取到的关键字进行处理,使之只保留小写 字母,利用处理后的关键字对明文进行加密。 (2) 生成字母表 (3) 将关键字和明文一一比对,查表获取到密文,对明文中的特殊字符不做加 密处理,直接保存到密文。 (4) 文件操作涉及到打开关闭文件,从文件中读写字符。以及对字符串的相关 处理,识别。 (5) 实验过程中经常发生内存引用错误的情况,数组越界,字符串的结束符添 加位置不确定的情况。采用单步调试的方法,着重观察关键位置,从而找
到解决方法。 (6) 解密时没有像加密时那样建立字母表,而是采用了计算的方法直接根据密 文和关键字计算出密文。 (7) 一下是程序运行过程中的一些步骤截屏: 初始界面: 加密界面: 完成存储操作后的界面: (8) 以下是本程序的函数清单,以及各自的作用: void print(); //完成程序开始界面的打印工作 void initlize(char alphabet[][26]); //完成对字母表的初始化 char *encrypt(char *plaintext,char alphabet[][26],char *key); //已知字母表,关键字对明文加密,返回加密结果的首地址 int alpha_num(char ch); //将字符转换为数字
void encryptfile(char *filename,char alphabet[][26],char *key); //加密文件中的内容,并且将加密后的字符串放入 test.txt int strTrue(char *string); //判断该字符是否为小写字母。如果是大写字母转为小写字母返回值为 1 两者都不是则返回值为 0 char *StrHandle(char *string); //字符串处理函数 char *readfile(char *filename); //从文件中读取字符串,并返回首地址 char getPlain(char cipher,char key); //已知密文,关键字得到密文的一个字符 char *decrypt(char *ciphertext,char *key); //对密文解密 void decryptfile(char *filename,char *key); //对文件中的数据进行解密 五、 实验数据与实验结果 明文:No matter the ending is perfect or not, you cannot disappear from my world. Love is a carefully designed lie. Promises are often like the butterfly, which disappear after beautiful hover. Fading is true while flowering is past. Why I have never catched the happiness? Whenever I want you ,I will be accompanyed by the memory of... If you weeped for the missing sunset,you would miss all the shining stars. No one indebted for others,while many people don't know how to cherish others. Within you I lose myself, without you I find myself wanting to be lost again. Dreaming in the memory is not as good as waiting for the paradise in the hell. Where there is great love, there are always miracles. Precious things are very few in this world. That is the reason there is just one you. You don't love a woman because she is beautiful, but she is beautiful because you love her. In the very smallest cot there is room enough for a loving pair. Your kiss still burns on my lips, everyday of mine is so beautiful. I feel happy at times we have had angry words but these have been kissed away. But if the while I think on thee, dear friend, all losses are restored, and sorrows end. 经过 Vigenere 加密后的密文: uc xdahpu avp hurtqn wd slfqhjh zu uce, bvi ndubzw kwddwdpdy tcrt aj zvfwg.
scgh pg l fhfpibzwb ksdlnbpg swp. sycxlzsd dys ziasy opyp wos mxahpumzj, zownk kwddwdpdy oqwlf mhhielmiw kvjpu. mooluu tv affh dvtol twrdscluu tv wodw. dvj l oogh usghy qlwjvpg avp khdalusdv? dvpqljpu p klqa mzx ,p ktos pp djqzpwoyblr mb avp plazuf cq... lm mzx dspslr qry hsh twdvpbr vbbdha,mzx dcfok atvz owo avp vowyluu dwhfd. qv cyh pbohihpg mcc ravpuz,kslss xdum ahvdwh kcy'w rbzz och wv qshywdk vhshyg. hlavtq fcf l scdh tmdhst, hlavzxa mzx p ttqk ajvlzq zhbeluu er is wrzh ljhwy. gyslppbr lu hsh tsxrym tv uce dz uzrk od zhweluu qry hsh wocdkwdh pb ekl vpos. kshys eklfp lz uchhh wrcs, eklfp dys lodojv twcdjzpv. wfpfpcfv avtqng lul jpuf tpz pb ekpg hryzo. wooe lz hsh yslvvb eklfp lz xfva cyh fcf. bvi oru'h wrcs l zvalq isndbgp vos tv islxawqxs, pfw zvp lz ppdbhtibz mhjofvl mzx scgh osc. lu hsh cscb zalossdw jce wosch pg crva pqvirk mcc d scgluu adpf. jrbf vlzg dwpzw ebfyv vb xb swav, ljpufrlb vt xlus tv zc mhhielmiw. l mspo ooasf oe wpapv ds sdcs sdk oyjym hryrd ebh eklgp khjp elsy npgdhk ohdf. pfw pt ekl kslss t wowyn vb ekls, ohhf qupsyg, hzw ovgdhz och ysdwvfpg, hbo vvfcrdg pqk. 六、 实验用程序清单(要有注释) void print(); //完成程序开始界面的打印工作 void initlize(char alphabet[][26]); //完成对字母表的初始化 char *encrypt(char *plaintext,char alphabet[][26],char *key); //已知字母表,关键字对明文加密,返回加密结果的首地址 int alpha_num(char ch); //将字符转换为数字 void encryptfile(char *filename,char alphabet[][26],char *key); //加密文件中的内容,并且将加密后的字符串放入 test.txt int strTrue(char *string); //判断该字符是否为小写字母。如果是大写字母转为小写字母返回值为 1 两者都不是则返回值为 0 char *StrHandle(char *string); //字符串处理函数 char *readfile(char *filename); //从文件中读取字符串,并返回首地址 char getPlain(char cipher,char key); //已知密文,关键字得到密文的一个字符 char *decrypt(char *ciphertext,char *key); //对密文解密 void decryptfile(char *filename,char *key); //对文件中的数据进行解密 七、 思考题(必需回答)写明如下问题
1. 2. Vigenere 密码的原理是什么? 答:Vigenere 加密法是基于关键词的加密系统,但不是像单码关键词加密法那样 使用关键词来定义替换模式的,关键词写在明文的上面,并不断重复书写,这样 每个明文字母都与一个关键词的字母关联。例如,如果关键词为"hold",而明文 为"this is the plaintext",那么,关键词——明文的关联如下所示: h o l d h o l d h o l d h o l d h o t h i s i s t h e p l a i n t e x t 每个明文字母与关键词的一个字母对应。例如,第一个明文字母"t"与关键词的 字母"h"配对。利用如下图所示的 Vigenere 表,在密钥字母确定的行和明文字母 确定的列交叉处的字母即为用来替代明文字母的密文字母。例如上面例子中第一 对是"h--t",在下表中查找"h"行和"t"列的交叉处,即为密文字母"a"。重复以 上过程可以生成以下的密文: 密钥 h o l d h o l d h o l d h o l d h o 明文 t h i s i s t h e p l a i n t e x t 密文 a v t v p g e k l d w d p b e h d h Vigenere 密码的主要缺陷有哪些? 如果得到关键词的长度就可以将 Vigenere 密码问题转换为破解 n 个不同单码加 密问题。 3. 对 Vigenere 密码的分析方法有哪几种? Vigenere 密码是一个基于单表置换的分块对称加密算法。将明文 T 分为长度为 n 的若干块(若最后一块不足则用随机数补满),密钥 K 长度为 n。在加密时对每个 明文分块 Ti 做 Ci=(Ti+Ki)%m,解密时对每个密文分块 Ci 做 Ti=(Ci-Ki)%m,其 中 m 为字符空间大小。显然,该加密算法是一个不安全的加密算法。Vigenere 算 法有着致命的缺陷 Ki=(Ci-Ti)%m,使得他可以被已知明文攻击完全破解。同时, 利用 Friedman 攻击也能够完全破解该算法,只是破解难度稍大。但是,我们也 可以看到,这两种破解都有着一个共同的假设:密钥长度 n 小于明文的长度,即 相同的明文字符可能多次被相同的密钥字符加密,生成相同的密文字符。 4. 对 Vigenere 密码的改进方法是什么? 使用长度分别为 m 和 n 的两个密钥来进行两轮加密,等效于使用密钥长度为 m 和 n 的最小公倍数的一个密钥进行一轮的加密(证明略)。这样,如果 m、n 互质, 我们实际上就做到了使用长度为 m+n 的密钥来代替长度为 m*n 的密钥,从而大大 的降低了密钥的长度 八、 结束语 通过本次编程实践,再一次的体会到了结构化编程的好处:可以最大程度的做到代码 重用,是程序看起来清晰明了,思路清楚。例如在编程中很多地方都用到了对字符串进行处 理这个功能,所以就把这个功能做成一个函数,每次只需调用此函数即可,很大程度上简化 了代码。另外有一个将字母转换为相应数字,以便在字母表中检索加密后结果的代码段,代 码实际并不长,但是将这些写成单独一个函数之后,虽然代码长度和之前一样,甚至更多些, 但是看起来清晰明了,达到了最初的目的。 此外,通过本次编程实践加强了对 Vigenere 密码加密解密过程的理解与认识。 九、 参考文献 C 语言程序设计第三版(谭浩强 著)
分享到:
收藏