C中的密文,如何重复关键字符
Cipher text in C,How to repeat key characters
说明
密文是由明文通过将明文的相应字符和密钥“相加”而生成的。如果明文比密钥短,则只使用密钥的一部分。同样,如果明文比密钥短,密钥将被多次使用。
例如,使用密钥“CAT”对明文“HELLO”进行编码:
明文:你好
密钥:CATCA
密文:KFFOP
并用密钥“FIDO”对明文“DOG”进行编码:
明文:DOG
密钥:FID
密文:JXK
要将两个字母相加,请使用以下约定:A=1, B=2, …, Z=26。如果两个字母的和大于 26,则从和中减去 26。例如:A + E = 1 + 5 = 6 = F,D + X = 4 + 24 = 28 = 2 = B。
- 现在我的代码的问题是,如果关键字符较少,我无法重复关键字符以进一步编码纯文本,如何重复关键字符,以便进一步编码?
帮帮我。
这是我的代码:
#include<stdio.h>
#include<string.h>
int main()
{
char str[100],k[50],str1[100];
int i,n;
gets(str);// Input plain text.
gets(str1);//Input key.
for(i=0;str[i]!='[=10=]';i++)
{
n=(str[i]-65+1)+(str1[i]-65+1);//Extracting the numerical position and adding them.
if(n>26) //if numerical value exceeds 26 then subtracting 26 from it and getting the numerical value.
{
n=n-26;
}
str[i]=n+64;//storing the ciphered character.
}
for(i=0;str[i]!='[=10=]';i++)//printing the ciphered characters.
printf("%c",str[i]);
return 0;
}
在编写循环时,用于索引键的变量应重置为 0 以重复键(如果原始文本长度较大)。
for(int i = 0, j = 0; input[i] != '[=10=]'; ++i, ++j) {
new_char = (input[i] - 64) + (key[j] - 64);
new_char = adjust(new_char);
cipher[i] = new_char + 64 ;
if(j == (key_length - 2)) // if j is at the end, excluding null character, then make j = -1, which gets incremented to j = 0 in the next loop iteration
j = -1;
}
也使用 fgets
进行字符串输入,不要 使用 gets
。 C 中的字符串可以使用 %s
格式说明符打印,而无需编写显式循环来输出字符。为此,将 cipher char 数组的最后一个元素设为 [=14=]
字符。
您可以使用另一个循环变量,并在每次达到其长度时将键的索引设为 0。在这种情况下,我使用了变量 j。试试这个代码:
#include<stdio.h>
#include<string.h>
int main()
{
char str[100],k[50],str1[100];
int i,n;
gets(str);// Input plain text.
gets(str1);//Input key.
int lenk=strlen(str1),j; //calculate length of key
for(i=0,j=0;str[i]!='[=10=]';i++,j++)
{
if(j==lenk) j=j-lenk; //make j=0
n=(str[i]-65+1)+(str1[j]-65+1); // add str1[j] instead
if(n>26)
{
n=n-26;
}
str[i]=n+64;//storing the ciphered character.
}
for(i=0;str[i]!='[=10=]';i++)
printf("%c",str[i]);
return 0;
}
请注意,这仅适用于大写字母,您必须更改小写字母的代码
您也可以使用模运算来重复字符。
for(i=0;str[i]='[=10=]';i++)
{
n = (str[i]-65+1 + (str1[i % lenk]-65 +1);
n = (n % 26) + 1;
str[i] = n+64;
//storing the ciphered character.
}
表达式 i % 26
自动将值从 0 循环到 25。
这同样适用于将 n 从 1 旋转到 26。
说明 密文是由明文通过将明文的相应字符和密钥“相加”而生成的。如果明文比密钥短,则只使用密钥的一部分。同样,如果明文比密钥短,密钥将被多次使用。
例如,使用密钥“CAT”对明文“HELLO”进行编码:
明文:你好
密钥:CATCA
密文:KFFOP
并用密钥“FIDO”对明文“DOG”进行编码:
明文:DOG
密钥:FID
密文:JXK
要将两个字母相加,请使用以下约定:A=1, B=2, …, Z=26。如果两个字母的和大于 26,则从和中减去 26。例如:A + E = 1 + 5 = 6 = F,D + X = 4 + 24 = 28 = 2 = B。
- 现在我的代码的问题是,如果关键字符较少,我无法重复关键字符以进一步编码纯文本,如何重复关键字符,以便进一步编码?
帮帮我。
这是我的代码:
#include<stdio.h>
#include<string.h>
int main()
{
char str[100],k[50],str1[100];
int i,n;
gets(str);// Input plain text.
gets(str1);//Input key.
for(i=0;str[i]!='[=10=]';i++)
{
n=(str[i]-65+1)+(str1[i]-65+1);//Extracting the numerical position and adding them.
if(n>26) //if numerical value exceeds 26 then subtracting 26 from it and getting the numerical value.
{
n=n-26;
}
str[i]=n+64;//storing the ciphered character.
}
for(i=0;str[i]!='[=10=]';i++)//printing the ciphered characters.
printf("%c",str[i]);
return 0;
}
在编写循环时,用于索引键的变量应重置为 0 以重复键(如果原始文本长度较大)。
for(int i = 0, j = 0; input[i] != '[=10=]'; ++i, ++j) {
new_char = (input[i] - 64) + (key[j] - 64);
new_char = adjust(new_char);
cipher[i] = new_char + 64 ;
if(j == (key_length - 2)) // if j is at the end, excluding null character, then make j = -1, which gets incremented to j = 0 in the next loop iteration
j = -1;
}
也使用 fgets
进行字符串输入,不要 使用 gets
。 C 中的字符串可以使用 %s
格式说明符打印,而无需编写显式循环来输出字符。为此,将 cipher char 数组的最后一个元素设为 [=14=]
字符。
您可以使用另一个循环变量,并在每次达到其长度时将键的索引设为 0。在这种情况下,我使用了变量 j。试试这个代码:
#include<stdio.h>
#include<string.h>
int main()
{
char str[100],k[50],str1[100];
int i,n;
gets(str);// Input plain text.
gets(str1);//Input key.
int lenk=strlen(str1),j; //calculate length of key
for(i=0,j=0;str[i]!='[=10=]';i++,j++)
{
if(j==lenk) j=j-lenk; //make j=0
n=(str[i]-65+1)+(str1[j]-65+1); // add str1[j] instead
if(n>26)
{
n=n-26;
}
str[i]=n+64;//storing the ciphered character.
}
for(i=0;str[i]!='[=10=]';i++)
printf("%c",str[i]);
return 0;
}
请注意,这仅适用于大写字母,您必须更改小写字母的代码
您也可以使用模运算来重复字符。
for(i=0;str[i]='[=10=]';i++)
{
n = (str[i]-65+1 + (str1[i % lenk]-65 +1);
n = (n % 26) + 1;
str[i] = n+64;
//storing the ciphered character.
}
表达式 i % 26
自动将值从 0 循环到 25。
这同样适用于将 n 从 1 旋转到 26。