C 解密Vernam密码
我正在为Vernam Cipher创建一个加密和解密代码 最初,要加密消息,我必须使用生成OTP的函数。此函数生成1-26之间的随机数(表示英文字母),并存储在整数数组中。大小等于要加密的消息的长度 我能做到。我的问题是如何解密它 我有这个密码 我的OTP数组,因为每个元素在1-26之间随机化,将表示字母表的第n个字母。e、 g.25表示字母“y”等。 我的加密逻辑是,由于我的OTP数组的大小等于我的消息的长度,我将对我的消息和我的OTP的每个字符执行异或。这是在根据每个元素的随机分配编号将我的OTP数组转换为字母表中相应的字母之后。 我已经可以做加密部分了。但每当我尝试解密时,我得到的信息与我最初输入的不同C 解密Vernam密码,c,C,我正在为Vernam Cipher创建一个加密和解密代码 最初,要加密消息,我必须使用生成OTP的函数。此函数生成1-26之间的随机数(表示英文字母),并存储在整数数组中。大小等于要加密的消息的长度 我能做到。我的问题是如何解密它 我有这个密码 我的OTP数组,因为每个元素在1-26之间随机化,将表示字母表的第n个字母。e、 g.25表示字母“y”等。 我的加密逻辑是,由于我的OTP数组的大小等于我的消息的长度,我将对我的消息和我的OTP的每个字符执行异或。这是在根据每个元素的随机分配编号将我的
void encryptiondecryption(char msg[], char key[]){
int i,j=0,x,m=0;
char output[100];
char output2[100];
/* Loop to remove all spaces in the message here*/
/*Encryption*/
int modd;
for(x = 0; msg[x]!='\0'; x++) {
printf("\nletter:%c - key:%c",msg[x], key[x] );
modd = (msg[x] ^ key[x]);
if(modd == 26){
output[x] = 'a'+ (modd%26)+25;
}else{
output[x] = 'a'+ (modd%26)-1;
}
}
output[x]='\0';
printf("\nEncrypted Message:\n");
for(x = 0; output[x]!='\0'; x++) {
printf("%c",output[x]);
}
/* decryption */
int modd2,diff,sum, toXOR;
printf("\n\ndecryption\n");
for(x = 0; output[x]!='\0'; x++) {
printf("\nletter:%c - key:%c",output[x], key[x] );
diff = output[x] - 'a';
if(diff == 25){
sum = diff - 25;
toXOR = sum + 26;
output2[x] = toXOR ^ key[x];
}else{
sum = diff + 1;
toXOR = sum + 26;
output2[x] = toXOR ^ key[x];
}
}
output2[x]='\0';
printf("\n Output for Decryption\n");
for(i = 0; output2[i]!='\0'; i++) {
printf("%c",output2[i]);
}
}
此外,这是我的generateOTP函数
char* generateKey(char msg[]){
srand(time(NULL));
int len = strlen(msg);
int numbers[len];
int x,y=0, m=0,a;
for(x=0;x<len;x++){
if(msg[x]!='_') m++;
}
printf("generated key is . . .\n");
int *getOTP = malloc (sizeof (int)*len);
for(x=0;x<m;x++){
getOTP[x] = rand() % (26 - 1 + 1) + 1;
}
for(x=0;x<m;x++){
printf("%d ", getOTP[x]);
}
char *letterOTP = malloc (sizeof (char) * len);
int getOTP2[m];
for(x=0;x<m;x++){
getOTP2[x] = getOTP[x];
}
int md;
for(x=0;x<m;x++){
md = (getOTP2[x]) % 26;
if(md ==0){
letterOTP[x] =( 97 + (md));
}else{
letterOTP[x] =( 97 + (md) - 1);
}
}
letterOTP[x] = '\0';
return letterOTP;
}
char*generateKey(char msg[]){
srand(时间(空));
int len=strlen(msg);
整数[len];
int x,y=0,m=0,a;
对于(x=0;xyo在用密钥对消息进行异或运算后应用模26。这会不会导致信息松散?@Emanuel P我也是这么想的。例如,我在加密后得到了“c”,可能会有多种可能性。因为在应用模26之前,我可能得到了4或30左右。是的,但我认为这正是问题所在。如果“c”代表e示例是30,“z”是4,然后在mod 26之后,它们都是4。因此,您无法知道将4解密为什么。@rinrin我真的不明白为什么您在加密期间执行%26
。对于Vernam cipher,只需将密钥与加密输出进行异或即可解密。这就是全部内容。可以吗你解释模运算的原因吗?@Zoso我在课堂上讨论了它是如何被加密的。我应用了mod 26,这样我就可以用字母来显示它了