繁体   English   中英

C - 加密算法

[英]C - Encryption Algorithm

我正在尝试使用C进行简单的加密程序。我的目标是将abc (可以是任何单词)转换为123 然后乘以2得到246然后再转换为文本,然后在屏幕上写入bdf 这是我的算法无法正常工作。 我进入了abc并获得了cbc 你能帮助我吗?

int main()
{
    int z,o,c,l,i,j,k,*D;
    char word[10];
char alfabe[24]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','r','s','t','u','v','y','z','\0'};

    printf("enter word");
    scanf("%s",word);

    c=strlen(word);
    printf("has %d letters ", c);
    D = (int *) malloc( sizeof(int)*c ); 
    for(i=0;i<c;i++) {
        for(j=0;j<26;j++) {
            if(word[i]==alfabe[j]) {  
                 D[i]=2*(j+1);
                 break;
            }
        }
    }
     printf("\nlast form before translation ");
     for(l=0;l<c;l++) {
       printf("%d",D[l]);  /*it s just for control */

    }

    for(z=0;z<c;z++){
printf("%c",alfabe[o]);
                      o=D[z];
                      word[z]=alfabe[o] ; break; }   




    printf("\nnew form of word: ");
    for(k=0;k<c;k++) {
       printf("%c",word[k]);

    }
scanf("%d");


}

问题出在以下循环中。

for(z=0;z<c;z++){
    printf("%c",alfabe[o]);
    o=D[z];
    word[z]=alfabe[o] ; 
    break; 
}   

你为什么打破? 它只是翻译第一个字符。 其次,您需要减去1以获得正确的字母数组索引(重做您所做的添加)。

 word[z]=alfabe[o-1];

第三,你在初始化之前使用o 您的编译器应该警告您。 第四,为什么要在24个字符的char数组中存储27个字符?

char alfabe[24]={'a','b',...........,'\0'}

最后但并非最不重要的是,您需要使用模块化算法,如果用户输入类似xyz ,这将不起作用。

好的,首先'\\0'标志着一个输入字符串的结束,你不需要加密这个特殊的字符,我的建议是把它放在alfabet这样你就得到:

alfabet[24] = {'\0', 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','r','s','t','u','v','y','z'};

这将为您省去减1的麻烦,因此您将拥有:

for (i = 0; i < c; i++)
{
    for (j = 0; j < 24; j++)
    {
        if (word[i] == alfabet[j])
        {  
            D[i] = 2 * j;
        }
    }
}

在您对输入进行编码的部分中。 当您生成输出字时:

for (z = 0; z < c; z++)
{
    printf("%c", alfabet[D[z]]);
    word[z] = alfabet[D[z]];
}

不需要o ,尤其不需要break; 在循环。

一种更有效的方法是创建一个处理传递的字符串加密的函数:

char* getEncryptedWord(char* word)
{
    char alfabet[25]={'\0', 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','r','s','t','u','v', 'x', 'y','z'};

    int i, j;
    int size = strlen(word);

    char* encryptedWord = (char*) malloc(size + 1);

    for (i = 0; i < size; i++)
    {
            for (j = 0; j <= 25; j++)
            {
                    if (word[i] == alfabet[j])
                    {
                            if (2 * j > 25)
                                    encryptedWord[i] = alfabet[2 * j % 25];
                            else
                                    encryptedWord[i] = alfabet[2 * j];

                            break;
                    }
            }
    }

    encryptedWord[size] = '\0';

    return encryptedWord;
}

我在alfabet添加了'x' - 这就是为什么现在有25个元素的原因。 我确定缺少一个英文字母的字符,但是凌晨3点,英语不是我的主要语言。 此外,此解决方案正在假设您提供的alfabet是输入和输出中应该存在的唯一字符。

(提示:如果你只想要字母AZ,你不需要遍历数组来找到相应的数字,你可以通过减去'a'的数值来得到数字,如果你想要的话,可以加1字母'a'映射到1.)

提到了模数运算,但这会给你带来问题,因为你将失去1:1映射,即两个字母最终可以被转换为相同的数字。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM