tl;dr
破解问题和思考的过程总是有趣的,唯一的问题是要有调试的耐心,把细节问题处理得更好一些。实现方法依然是 c 语言,过程中所需要考虑的要点记录在此。
背景
Caesar cipher 和 Vigenère cipher 是一对亲密的兄弟算法,在密码学家族中占据了最久远而传统的地位。
相同的是,他们两个都依靠的是字母移位旋转替换,将明文转变成加密内容。而差别在于 Caesar 中的 key 是简单的数字,Vigenère 中的 key 也是一串字母。转换过程中,仅对字母(大小写敏感)进行处理。
当然对现代密码学来说,这两个算法都是古董级别的了,但他们依旧会出现在某些好玩的密码系统中,例如论坛中出现的回转13位(ROT-13)。
检验命令行参数
检查命令行参数是否符合要求,如都只需要用户输入key,Caesar 中 key 是数字,Vigenere 中 key 是纯字母序列。
获得文本替换
注意 alphabet Ring 的存在
1 | p[i] = 'a' + (p[i] - 'a' + key) % 26 |
按照字母序列进行替换
在 Vigenere 中,我们按照 key 中的字母循环得到替换的位数,原理和Caesar一致,只是在plaintext中需要留意当前处理的字母数量,因此引入了新的计数变量 num——valid。
1 | int key = tolower(str_key[num_valid % strlen(str_key)]) - 'a'; |
实现中的注意点
- 类型转换(例如,int k = atoi(argv[1]);)
- 字母的大小写敏感处理(保留原来)
- 不纳入转换的有数字和其他符号(不计入)
Code Solution
1 | // this is the vigenere cipher program |