我正在解决一个问题,我有点陷入困境,所以我想请求你的帮助。我想制作一个具有以下功能的程序。用户将给出一个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;
所以,现在我有一个数组中的键。但是,我找不到一个好的方法来阅读文本然后加密它。我不能使用数组,因为我们不知道文本的长度。
我将不胜感激任何帮助!
答案 0 :(得分:1)
最简单的答案是忽略所有性能问题,一次只处理一个字符。
基本上,
出于性能原因,实际实现可能会将输入读入缓冲区,对整个缓冲区进行操作,然后重复。
答案 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)乘以模数逆,添加偏移并转换回字符。