Crypto-PTA-Enigma破解

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

暴力破就行。需要格外注意的是:

  1. double stepping时,注意条件的限制。正常转动和因double stepping转动不能因同一次敲键产生,这里if语句要尤其注意
  2. 字母编号(0-25)与ASCII码的转换,很容易就会忘记减去或加上 ‘A’
  3. 设置一次初始值后,一次性对密文中所有字符依次解码。而不是对每一个字符都设置一次初始值

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
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值