转轮加密机 加解密 (C语言实现)

#include<stdio.h>
#include<stdlib.h>
#include<string.h>


const int lowRol[2][26] = { {2425261234567891011121314151617181920212223 } ,
                        { 213151191014262081616722411517912212223242526} };
const int midRol[2][26] = { {2623456789101112131415161718192021222324251} ,
                    { 20,16415314122351622219111825241371082192617} };
const int fastRol[2][26] = { {1234567891011121314151617181920212223242526} ,
                    { 8261720,22,103131142352491225161961521271414} };

// 实现转轮功能
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 = 0int 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 = 0int 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;
}
原文地址:https://www.cnblogs.com/wangyv/p/12528196.html