#include<stdio.h>
#include<stdlib.h>
#include<string.h>
const int lowRol[2][26] = { {24, 25, 26, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23 } ,
{ 21, 3, 15, 1, 19, 10, 14, 26, 20, 8, 16, 16, 7, 22, 4, 11, 5, 17, 9, 12, 21, 22, 23, 24, 25, 26} };
const int midRol[2][26] = { {26, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 1} ,
{ 20,1, 6, 4, 15, 3, 14, 12, 23, 5, 16, 2, 22, 19, 11, 18, 25, 24, 13, 7, 10, 8, 21, 9, 26, 17} };
const int fastRol[2][26] = { {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26} ,
{ 8, 26, 17, 20,22,10, 3, 13, 11, 4, 23, 5, 24, 9, 12, 25, 16, 19, 6, 15, 21, 2, 7, 1, 4, 14} };
// 实现转轮功能
void m_change(int word[2][26]) {
int temp_a, temp_b;
int i;
temp_a = word[0][0];
temp_b = word[1][0];
for (i = 0; i < 25; i++) {
word[0][i] = word[0][i + 1];
word[1][i] = word[1][i + 1];
}
word[0][25] = temp_a;
word[1][25] = temp_b;
}
void get_ciper(char text[100], char output[100], int lowrol[2][26], int midrol[2][26], int fastrol[2][26]) {
int i;
int fcnt = 0; int mcnt = 0;
int input_i, low_flag, mid_flag, fast_flag;
//第一层循环 ,遍历全部的字符
for (i = 0; i < strlen(text); i++) {
input_i = (int)(text[i] - 97);
if (text[i] == '') break;
//慢轮
for (low_flag = 0; low_flag < 26; low_flag++) {
if (lowrol[1][low_flag] == lowrol[0][input_i]) break;
}
// 中轮
for (mid_flag = 0; mid_flag < 26; mid_flag++) {
if (midrol[1][mid_flag] == midrol[0][low_flag]) break;
}
// 快轮
for (fast_flag = 0; fast_flag < 26; fast_flag++) {
if (fastrol[1][fast_flag] == fastRol[0][mid_flag]) break;
}
// 快轮转动
fcnt++;
// 中轮
if (fcnt % 26 == 0) {
mcnt++;
m_change(midrol);
}
//慢轮
if (mcnt % 26 == 0) {
m_change(lowrol);
}
//保存加密字符串
output[i] = (char)(fast_flag + 96);
//putchar((char)(fast_flag + 96));
}
// 维持字符串格式
output[i] = '';
}
void get_plain(char text[100], char output[100], int lowrol[2][26], int midrol[2][26], int fastrol[2][26]) {
int i;
int fcnt = 0; int mcnt = 0;
int input_i, low_flag, mid_flag, fast_flag;
//第一层循环 ,遍历全部的字符
for (i = 0; i < strlen(text); i++) {
input_i = (int)(text[i] - 97);
if (text[i] == '') break;
//快轮
for (fast_flag = 0; fast_flag < 26; fast_flag++) {
if (lowrol[1][fast_flag] == lowrol[0][input_i]) break;
}
// 中轮
for (mid_flag = 0; mid_flag < 26; mid_flag++) {
if (midrol[1][mid_flag] == midrol[0][fast_flag]) break;
}
// 慢轮
for (low_flag = 0; low_flag < 26; low_flag++) {
if (fastrol[1][low_flag] == fastRol[0][mid_flag]) break;
}
// 快轮转动
fcnt++;
// 中轮
if (fcnt % 26 == 0) {
mcnt++;
m_change(midrol);
}
//慢轮
if (mcnt % 26 == 0) {
m_change(lowrol);
}
//保存加密字符串
output[i] = (char)(low_flag + 97);
//putchar((char)(low_flag + 97));
}
// 维持字符串格式
output[i] = '';
}
int main() {
char alphabet[26] = "abcdefghijklmnopqrstuvwxyz";
int fcnt =0, mcnt = 0;
int i;
char user_input[100] = { 0 };
char user_output[100] = { 0 };
char get_user_input[100] = { 0 };
int temp_low[2][26], temp_mid[2][26], temp_fast[2][26];
memcpy(temp_low, lowRol, sizeof(lowRol));
memcpy(temp_mid, midRol, sizeof(midRol));
memcpy(temp_fast, fastRol, sizeof(fastRol));
scanf("%s", user_input);
get_ciper(user_input, user_output, temp_low, temp_mid, temp_fast);
printf("%s", user_output);
printf("密文是:
");
//恢复被更改的轮的顺序
memcpy(temp_low, lowRol, sizeof(lowRol));
memcpy(temp_mid, midRol, sizeof(midRol));
memcpy(temp_fast, fastRol, sizeof(fastRol));
get_plain(user_output, get_user_input, temp_low, temp_mid, temp_fast);
printf("解密是:%s", user_input);
printf("
");
//printf("%s", user_input);
return 0;
}