C中的加密函数分配答案

作者: 分类: 编程代码 时间:1970-01-01

C中的加密函数分配答案

Encryption function assignment in CC中的加密函数分配

我有一个大学的任务是创建一个用 C 语言加密的函数。完整信息如下:

<1234565>

加密字母的方案是用 26 填充一个 8 x 8 数组 英文字母的大写字母,26个小写字母 英文,十位数字‘0’到‘9’,空格字符‘’ 和“。”字符。每个角色只出现一次 大批。该数组称为加密密钥。

为了加密一个字母对,两个字母组成的矩形是 用过的。原始对中的每个字母都替换为字母 位于同一行和矩形的另一个角。如果 两个字母碰巧在同一行或同一列,字母是 交换了。

例如,根据下面的键,这对字母 AQ 被加密为 GV。注意由字母 A 和 Q 组成的矩形,

字母 A 替换为 G,即位于 同一行和矩形的另一个角。

字母 Q 替换为 V,即位于同一位置的字母 行和矩形的另一个角。

定义并实现一个名为 encrypt 的函数,它接受 3 个参数:

一个二维字符数组作为加密密钥,

要加密的消息(作为一个以 null 结尾的数组 人物)

字符数组可用于存储加密消息。

该函数根据描述的方案加密消息 上面并将加密的消息存储在第三个参数中。如果 原始消息包含奇数个字母最后一个字母是 不变。

注意:终止的 null 不应加密

例如,单词 COMPUTER 将被加密为 VcrqGc

注意:为简单起见:名为 generate_key 的函数已经 提供了这个任务。您不必创建它。这 函数用 26 个大写字母随机填充一个 8 x 8 数组 英文字母,十位数字“0”的26个小写字母 通过'9',空格''和点'.'。

我已经创建了这个函数,但它返回 -1073741819 (0xC0000005)。

void encrypt(char key[][8],char word[], char done[]){

    int x,y,t,w,z,c=0;

    while(word[c] != '\0'){

        for(int j=0;j<8;j++){

         for(int i=0;i<8;i++){
            

            if(word[c]==key[i][j]){
                x=i;
                y=j;
                }
            if(word[c+1]==key[i][j]){
                    w=i;
                    z=j;
                    }

            t=x;
            x=w;
            w=t;
            done[c]=key[x][y];
            done[c+1]=key[w][z];


            }
                     printf("\n");


        }
        c=c+2;
        printf("\n");
        }
    }

【问题讨论】:

标签: c debugging encryption


【解决方案1】:

在没有看到您如何调用此函数的情况下,我构建了一些支持代码来调用此函数。我确定的是,当找到第一个字符的坐标时,您需要对嵌套在其中的第二个字符执行另一个循环测试,而不是像您的代码那样连续测试字符对中的第一个和第二个字符。以下是一些说明嵌套的重构代码。

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

char key[8][8] = {  {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'},
                    {'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P'},
                    {'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X'},
                    {'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f'},
                    {'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n'},
                    {'o', 'p', 'q', 'r', 's', 't', 'u', 'v'},
                    {'w', 'x', 'y', 'z', '0', '1', '2', '3'},
                    {'4', '5', '6', '7', '8', '9', ' ', '.'},
};

void encrypt(char key[][8],char word[], char done[])
{

    int x = 0, y = 0, t = 0, w = 0, z = 0, c=0;

    while(word[c] != 0)
    {
        for(int j=0; j<8; j++)
        {
            for(int i=0; i<8; i++)
            {
                if(word[c]==key[i][j])
                    if(word[c + 1] == 0)            /* Odd number of letters - switch and exit here */
                    {
                        done[c] = key[j][i];
                        done[c + 1] = 0;            /* Tidy up */
                        return;
                    }
                {
                    printf("i: %d, j: %d ", i, j);  /* Nest the check of the second letter inside the first letter check */
                    for (int m = 0; m < 8; m++)
                    {
                        for (int n = 0; n < 8; n++)
                        {
                            if(word[c+1]==key[m][n])
                            {
                                printf("m: %d, n: %d \n", m, n);
                                w=m;  /* Corrected per comments */
                                z=j;
                                x=i;
                                y=n;
                            }
                        }
                    }
                }
                done[c]=key[x][y];
                done[c+1]=key[w][z];
                if ((x == w) || (y == z))  /* Special case where either the letters are in the same row or same column */
                {
                    done[c + 1]=key[x][y];
                    done[c]=key[w][z];
                }
            }
        }
        c=c+2;
    }
}

int main()
{
    char test_word[32];
    char encrypted_word[32];

    for (int i = 0; i < 32; i++)
    {
        encrypted_word[i] = 0;
    }

    strcpy(test_word, "Products");

    encrypt(key, test_word, encrypted_word);

    printf("Word: %s, Encrypted Word: %s\n", test_word, encrypted_word);

    strcpy(test_word, encrypted_word);

    for (int i = 0; i < 32; i++)
    {
        encrypted_word[i] = 0;
    }

    encrypt(key, test_word, encrypted_word);

    printf("Word: %s, Encrypted Word: %s\n", test_word, encrypted_word);

    return 0;
}

由于理论上,通过这个函数放置加密词应该解密这个词,所以我只是使用特定的文字词调用了两次函数来测试。以下是我终端上的输出证明了这个理论。

@Una:~/C_Programs/Console/Encryption/bin/Release$ ./Encryption 
i: 1, j: 7 m: 5, n: 3 
i: 5, j: 0 m: 3, n: 5 
i: 5, j: 6 m: 3, n: 4 
i: 5, j: 5 m: 5, n: 4 
Word: Products, Encrypted Word: d5rFj1lt
i: 3, j: 5 m: 7, n: 1 
i: 5, j: 3 m: 0, n: 5 
i: 4, j: 3 m: 6, n: 5 
i: 4, j: 5 m: 5, n: 5 
Word: d5rFj1lt, Encrypted Word: Products

【讨论】:

    <1234563>
    感谢您的接受。仅供参考,如果你想让这个函数更健壮,以便它可以处理具有奇数个字母的单词,就在第二个字母的测试块内以及在启动内部 for 循环之前,你可能想要添加一个测试,例如"if(word[c + 1] == 0) { done[c] = key[j][i]; done[c + 1] = 0; return; }" 当有奇数个时优雅退出字母。问候。
    <1234563>
    很抱歉,前两个字符“P”和“r”不编码为“d”和“5”...在代码中的矩阵上绘制矩形。该字母对的“对角”是“L”和“v”......我发布了一个缩短的实现......
    <1234563>
    你是对的先生。我的问题是四个工作指数的人口。实际上,我最初对索引变量的洗牌是一种旋转矩形,然后填充索引值。当我将更新修改为“w=m;z=j;x=i;y=n;”时,我的算法与您的程序一致。接得好。
    <1234563>
    如果我要加密的单词很奇怪,我该如何编辑代码以保持最后一个字母不变?因为我试图在while循环,但它没有工作
【解决方案2】:

这是利用模运算符的(正确)替代解决方案。

内存中的连续字节可以被视为“8x8”或“64x1”......下面的方法调用strchr() 来查找每个输入字母,然后是它的索引。 row & col 可以从字节的索引中导出。将第 1 行与第 2 行“配对”涉及一些仔细的整数和模除法。

while() 条件只会做对,一些额外的代码会处理奇数字符串长度的最终字符。

void encrypt( char key[], char word[], char done[] ) {
    for( int c = 0; word[c] != 0 && word[c+1] != 0 ; c += 2 ) {
        int loc0 = strchr( key, word[ c+0 ] ) - key;
        int loc1 = strchr( key, word[ c+1 ] ) - key;

        done[ c+0 ] = key[ ( loc0 / 8 ) * 8 + ( loc1 % 8 ) ];
        done[ c+1 ] = key[ ( loc1 / 8 ) * 8 + ( loc0 % 8 ) ];
    }
    if( word[c] != 0 ) { done[ c ] = word[ c ]; c += 1; }
    done[ c ] = '\0';

    printf( "'%s' ==> '%s'\n", word, done );
}

char key[] = "ABCDEFGH"
             "IJKLMNOP"
             "QRSTUVWX"
             "YZabcdef"
             "ghijklmn"
             "opqrstuv"
             "wxyz0123"
             "456789 .";

void main( void ) {
    char buf[2][32];

    encrypt( key, "Products", buf[0] );

    encrypt( key, buf[0], buf[1] );
}

这种加密纠正了一些神秘的“转置”,因此它与 NoDakker 的版本不匹配。 (但是,此版本的输出使用 NoDakker 提供的“矩阵”手动签出。)

Output:
'Products' ==> 'LvtYsest'
'LvtYsest' ==> 'Products'

【讨论】: