Advanced Engima Cracking
题目要求
本题目需要模拟当年破解Enigma的过程,现在我们已经知道Plugboard, RingSetting, CipherText 和 Word
已知 PlainText 中一定包含单词 Word, 求破解 MessageKey, PlainText 和 RotorNum
由于完全破解耗时太长,输入还会给出3个齿轮中最左侧那个齿轮的编号。
提示
建议你实现一个加密/解密函数,与http://10.71.45.100/bhh/MyEnigma.exe 产生的结果相对比,完全一致后再考虑破解
可能用到的常量:
char reflector[]="YRUHQSLDPXNGOKMIEBFZCWVJAT";
char rotor_table[5][27] =
{
"EKMFLGDQVZNTOWYHXUSPAIBRCJ",
"AJDKSIRUXBLHWTMCQGZNPYFVOE",
"BDFHJLCPRTXVZNYEIWGAKMUSQO",
"ESOVPZJAYQUIRHXLNFTGKDCMWB",
"VZBRGITYUPSDNHLXAWMJQOFECK"
};
char step_char[5]="RFWKA"; // Royal Flags Wave Kings Above
输入格式:
输入分为5行
第一行给出Plugboard,以空格分隔的10组, 如PO LM IU JK NH YT GB VF RE DC
第二行给出RingSetting,如TIP
(T为左边齿轮内部设置,P为右边齿轮内部设置)
第三行给出需要破解的密文,如MNZUXZEZWCAYJVTODAEFBVKYXW
第四行给出已知明文中包含的单词,如CRYPTO
第五行给出最左侧的齿轮编号,如1
密文长度不超过500,单词长度不超过20
输出格式:
本题保证有且仅有唯一解
假定破解出的MessageKey=XXX, PlainText=YYYYY, RotorNum=123 (1为左边齿轮编号,5为右边齿轮编号),
程序输出格式如下:
MessageKey=XXX
PlainText=YYYYY
RotorNum=123
输入样例:
PO LM IU JK NH YT GB VF RE DC
TIP
MNZUXZEZWCAYJVTODAEFBVKYXW
CRYPTO
1
输出样例:
MessageKey=CRY
PlainText=CRYPTOISSOINTERESTINGISNIT
RotorNum=125
暴力破就行。需要格外注意的是:
- double stepping时,注意条件的限制。正常转动和因double stepping转动不能因同一次敲键产生,这里if语句要尤其注意
- 字母编号(0-25)与ASCII码的转换,很容易就会忘记减去或加上 ‘A’
- 设置一次初始值后,一次性对密文中所有字符依次解码。而不是对每一个字符都设置一次初始值
My Answer:
里面的枚举其实没什么用,用到一半弃坑了。
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
enum rotor_pos {
left, mid, right };
enum rotor_index {
rotor1_index, rotor2_index, rotor3_index, rotor4_index, rotor5_index };
char plugboard[28] = {
"ABCDEFGHIJKLMNOPQRSTUVWXYZ" };
char rotor_table[6][28] =
{
"EKMFLGDQVZNTOWYHXUSPAIBRCJ",
"AJDKSIRUXBLHWTMCQGZNPYFVOE",
"BDFHJLCPRTXVZNYEIWGAKMUSQO",
"ESOVPZJAYQUIRHXLNFTGKDCMWB",
"VZBRGITYUPSDNHLXAWMJQOFECK"
};
char reflector[28] = "YRUHQSLDPXNGOKMIEBFZCWVJAT";
char step_char[7] = "RFWKA";
int base = 'A';
int left_ringsetting, mid_ringsetting, right_ringsetting;
int answ_left_ini, answ_mid_ini, answ_right_ini;
int answ_left_no, answ_mid_no, answ_right_no;
int Rotor1_forward(int input);
int Rotor2_forward(int input);
int Rotor3_forward(int input);
int Rotor4_forward(int input);
int Rotor5_forward(int input);
int Rotor1_back(int input);
int Rotor2_back(int input);
int Rotor3_back(int input);
int Rotor4_back(int input);
int Rotor5_back(int input);
int(*RotorDealforward[5])(int input);
int(*RotorDealback[5])(int input);
int Reflector(int input);
int Plugboard(int input);
void GetPlaintext(char* ciphertext