如何在C中加密文本?

时间:2012-03-30 18:07:27

标签: c cryptography

我正在解决一个问题,我有点陷入困境,所以我想请求你的帮助。我想制作一个具有以下功能的程序。用户将给出一个4位密码密钥和一个文本。

然后使用以下方法将文本转换为密码。 假设文本输入为'ABC',密钥为123.然后,使用ASCII表,'ABC'将转换为'BDF'。文本将在ASCII表中向前移动K个位置,其中K是键的相应数字。考虑文本无限。我的第一个动作是将密钥转换为数组。

//scanning the cypher key
scanf("%d", &cypherkey);

//converting the cypher key into an array using a practical mathematic method for extracting its digit
int keyarray[4];
keyarray[0]= cypherkey/1000;
keyarray[1]= (cypherkey-keyarray[0]*1000)/100;
keyarray[2]= ((cypherkey-keyarray[0]*1000)- keyarray[1]*100)/10;
keyarray[3]= ((cypherkey-keyarray[0]*1000)- keyarray[1]*100)-keyarray[2]*10;

所以,现在我有一个数组中的键。但是,我找不到一个好的方法来阅读文本然后加密它。我不能使用数组,因为我们不知道文本的长度。

我将不胜感激任何帮助!

3 个答案:

答案 0 :(得分:1)

最简单的答案是忽略所有性能问题,一次只处理一个字符。

基本上,

  1. 从您的输入中读取一个字符。
  2. 根据您的算法对其进行转换&你现在的'关键数字'
  3. 提升您在关键阵列中的位置,必要时循环播放
  4. 重复直到输入结束
  5. 出于性能原因,实际实现可能会将输入读入缓冲区,对整个缓冲区进行操作,然后重复。

答案 1 :(得分:1)

我拍了一张照片,输入文字在应用程序中硬编码。以下示例不是生产代码,仅用于教育目的。

在我的方法中有两个挑战:

  • 编写计算数字中有多少位数的函数:

  • 实现检索数字特定数字的函数;

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

int count_digits(int number) // // http://stackoverflow.com/questions/1489830/efficient-way-to-determine-number-of-digits-in-an-integer
{
    int digits = 0;
    if (number < 0) 
    digits = 1; 

    while (number) 
    {
        number /= 10;
        digits++;
    }

    return digits;
}

char get_digit(int number, int index) // starts at index 0
{
    if (number == 0)
        return (char)0;

    int n_digits = count_digits(number);
    if (index > n_digits)
        return (char)-1;

    char digit = -1;
    int i;
        for (i = 0; i < (n_digits-index); i++)
    {
        digit = number % 10;
        number /= 10;
    }

    return digit;   
}

int main()
{
    printf("* Type the encoding key (numbers only): ");
    int key = 0;
    scanf("%d", &key);

    int key_digits = count_digits(key);
    //printf("* The key has %d digits.\n", key_digits);

    char input_msg[] = "ABCABC"; // This is the input text
    int input_sz = strlen(input_msg);
    //printf("* Input message [%s] has %d characters.\n", input_msg, input_sz);

    int i, d = 0;   
    for (i = 0; i < input_sz; i++)
    {       
        if (d >= key_digits)
            d = 0;

        input_msg[i] += get_digit(key, d);      
        d++;
    }

    printf("* Encoded text is: %s\n", input_msg);

    return 0;
}

输出以下内容......

输入文字ABC

$ ./cypher 
* Type the encoding key (numbers only): 123
* Encoded text is: BDF

$ ./cypher 
* Type the encoding key (numbers only): 234
* Encoded text is: CEG

输入文字ABCABC

$ ./cypher 
* Type the encoding key (numbers only): 123
* Encoded text is: BDFBDF

答案 2 :(得分:0)

我相信有一种更简单的方法可以做到这一点。您描述的算法称为广义凯撒密码。密文的同余关系是C = rP + s(mod 26),其中P是纯文本,r是乘数,s是移位。在您描述的情况下,您的乘数为2且移位为1.如果您想避免使用表,您可以只获取纯文本中每个字母的unicode,并从unicode中减去一致的偏移量,以便你总是得到一个26以下的数字。要解密密文,你需要将密文乘以r的模数倒数加上你应用的偏移量,然后转换回数字unicode表示中的一个字符。

简而言之,你需要得到一个字符的unicode,减去一些偏移量,乘以2,加2并取这个数字mod 26的mod来加密一些东西。

要反转该过程,请将密文(减1)乘以模数逆,添加偏移并转换回字符。