C 中的 Vigenere 密码不起作用
Vigenere Cipher In C not working
我正在尝试制作 vigenere 密码。
有关它的信息在这里:https://www.youtube.com/watch?v=9zASwVoshiM
我的代码似乎不适用于少数情况。
下面列出了我的代码,请不要向我发送 link 如何制作 vigenere 密码,而是向我发送修复我的代码的方法。例如,如果我将键作为 z,它的值是 25 acc to alphabet。现在,如果我将要加密的文本设为 c,即 2,则新文本的值为 27 并且应该显示 b 但对我而言它没有。因此,如果该值超过 25,它不会显示我想要的,否则它会起作用。对于实际输出示例:
ab 作为键应该将 ca 更改为 cb
#include<stdio.h>
#include<cs50.h>
#include<ctype.h>
#include<string.h>
#include<stdlib.h>
int main( int argc , string argv[]){
//string plaintext;
string key;
if(argc != 2){
printf("Please run the programme again this time using a command line argument!\n");
return 1;
}
key = argv[1];
int keys[strlen(key)];
for(int m = 0; m< strlen(key);m++){
if(isalpha(key[m])==false){
printf("Re-Run The programme without any symbols.\n");
return 1;
}
}
for(int b = 0; b < strlen(key);b++){
if(isupper(key[b]) == false){
keys[b] = key[b] - 'a';
}
else{
keys[b] = key[b] - 'A';
}
}
//printf("Enter a string which should be encrypted: \n");
string plaintext = GetString();
int plength = strlen(plaintext);
int klength = strlen(key);
string ciphertext = key;
for(int u = 0; u<plength;u++){
if(isalpha(plaintext[u])==false){
printf("%c",plaintext[u]);
continue;
}
int value = u % klength;
ciphertext[u] = (keys[value] + plaintext[u]);
//By the more than 90 I am referring to 'z'
if(ciphertext[u]>90){
ciphertext[u] = ciphertext[u] ;
}
printf("%c",ciphertext[u]);
}
printf("\n");
return 0;
}
谢谢
卡莲
您通过始终从其代码中减去大写字母代码 'A'
和小写字母代码 'a'
来正确处理键中的值。它为您提供:A|a => 0, B|b => 1, ... , Z|z => 25。好的到这里...
但是在加密的时候,你只是把这个值加到一个字符的编码上,任何时候都不换行。
让我们使用您的示例:键是 'z' => keys
中的值 25,很好。取字符'c'。它的 ASCII(*) 代码是 0x63 或 99。99+25=124 给出 ascii table '|'
!要正确包装它,您必须确保以任何方式 'z' + 1 => 'a'。你的代码可以是
/* test wrapping for lowercase letters */
if ((islower(plaintext[u]) && (ciphertext[u]>'z')) {
ciphertext[u] = ciphertext[u] - 'z' + 'a' - 1;
}
/* same for uppercase */
if ((isupper(plaintext[u]) && (ciphertext[u]>'Z')) {
ciphertext[u] = ciphertext[u] - 'Z' + 'A' - 1;
}
(*) 这个例子假定了 ASCII 码,因为它是现在最常见的,但是代码只假定所有大写字母都是按顺序排列的,所有小写字母也是按顺序排列的,不需要它们的确切值,也不需要大写和小写序列的顺序。
我正在尝试制作 vigenere 密码。 有关它的信息在这里:https://www.youtube.com/watch?v=9zASwVoshiM 我的代码似乎不适用于少数情况。 下面列出了我的代码,请不要向我发送 link 如何制作 vigenere 密码,而是向我发送修复我的代码的方法。例如,如果我将键作为 z,它的值是 25 acc to alphabet。现在,如果我将要加密的文本设为 c,即 2,则新文本的值为 27 并且应该显示 b 但对我而言它没有。因此,如果该值超过 25,它不会显示我想要的,否则它会起作用。对于实际输出示例: ab 作为键应该将 ca 更改为 cb
#include<stdio.h>
#include<cs50.h>
#include<ctype.h>
#include<string.h>
#include<stdlib.h>
int main( int argc , string argv[]){
//string plaintext;
string key;
if(argc != 2){
printf("Please run the programme again this time using a command line argument!\n");
return 1;
}
key = argv[1];
int keys[strlen(key)];
for(int m = 0; m< strlen(key);m++){
if(isalpha(key[m])==false){
printf("Re-Run The programme without any symbols.\n");
return 1;
}
}
for(int b = 0; b < strlen(key);b++){
if(isupper(key[b]) == false){
keys[b] = key[b] - 'a';
}
else{
keys[b] = key[b] - 'A';
}
}
//printf("Enter a string which should be encrypted: \n");
string plaintext = GetString();
int plength = strlen(plaintext);
int klength = strlen(key);
string ciphertext = key;
for(int u = 0; u<plength;u++){
if(isalpha(plaintext[u])==false){
printf("%c",plaintext[u]);
continue;
}
int value = u % klength;
ciphertext[u] = (keys[value] + plaintext[u]);
//By the more than 90 I am referring to 'z'
if(ciphertext[u]>90){
ciphertext[u] = ciphertext[u] ;
}
printf("%c",ciphertext[u]);
}
printf("\n");
return 0;
}
谢谢 卡莲
您通过始终从其代码中减去大写字母代码 'A'
和小写字母代码 'a'
来正确处理键中的值。它为您提供:A|a => 0, B|b => 1, ... , Z|z => 25。好的到这里...
但是在加密的时候,你只是把这个值加到一个字符的编码上,任何时候都不换行。
让我们使用您的示例:键是 'z' => keys
中的值 25,很好。取字符'c'。它的 ASCII(*) 代码是 0x63 或 99。99+25=124 给出 ascii table '|'
!要正确包装它,您必须确保以任何方式 'z' + 1 => 'a'。你的代码可以是
/* test wrapping for lowercase letters */
if ((islower(plaintext[u]) && (ciphertext[u]>'z')) {
ciphertext[u] = ciphertext[u] - 'z' + 'a' - 1;
}
/* same for uppercase */
if ((isupper(plaintext[u]) && (ciphertext[u]>'Z')) {
ciphertext[u] = ciphertext[u] - 'Z' + 'A' - 1;
}
(*) 这个例子假定了 ASCII 码,因为它是现在最常见的,但是代码只假定所有大写字母都是按顺序排列的,所有小写字母也是按顺序排列的,不需要它们的确切值,也不需要大写和小写序列的顺序。