У меня возникли некоторые проблемы, пытаясь заставить мой код работать. Он печатает ПОЧТИ правильные данные, но, возможно, он не зацикливается правильно? Я не думаю, что это повторяет ключ через алфавит. Это все строчные и не превышает 26.
void vigenereEncrypt( const char plaintext[], char ciphertext[], const char key[] )
{
int idx;
int j;
for( idx = 0, j = 0; idx <= strlen(plaintext); idx++ )
{
if ( CHAR_OUT_OF_RANGE(plaintext[idx]) )
{
ciphertext[idx] = plaintext[idx];
}
else
{
ciphertext[idx] = plaintext[idx];
ciphertext[idx] += key[j] - MIN_ASCII_VALUE;
if (ciphertext[idx] >= MAX_ASCII_VALUE) ciphertext[idx] += -MAX_ASCII_VALUE + MIN_ASCII_VALUE - 1;
}
j = (j + 1) % strlen(key);
}
ciphertext[idx] = 0;
}
Например: если я введу текстовый тонер с ключом Джерри, вывод будет csevé. Это должно изменить его на csevp
Сделайте всем (особенно себе) одолжение, и используйте std::string
вместо строк в стиле C Тогда используйте стандартный алгоритм вместо пишу испортить петли самостоятельно.
#include <iostream>
#include <iterator>
#include <algorithm>
class crypt {
std::string key;
size_t pos;
public:
crypt(std::string const &k) : key(k), pos(0) { }
char operator()(char input) {
char ret = input ^ key[pos];
pos = (pos + 1) % key.size();
return ret;
}
};
int main() {
std::string input("This is some input to be encrypted by the crappy encryption algorithm.");
std::transform(input.begin(), input.end(),
std::ostream_iterator<char>(std::cout),
crypt("This is the key"));
return 0;
}
Ваш цикл идет от одного до далеко. Вы должны использовать < вместо <знак равно И я предполагаю, что вы должны тестировать для> MAX_ASCII_VALUE, а не> = (но вы не показали, что такое MAX_ASCII_VALUE).
Но ваша основная проблема — это проблема со знаком и без знака. В случае знаков со знаком, когда оно превышает 127, оно оборачивается и становится отрицательным, поэтому тест> не пройдёт, когда он должен был пройти.
void vigenereEncrypt(const char plaintext[], char ciphertext[], const char key[])
{
size_t i, j;
for(i = 0, j = 0; i < strlen(plaintext); ++i )
{
ciphertext[i] = plaintext[i];
if (!CHAR_OUT_OF_RANGE(plaintext[i]))
{
ciphertext[i] += (uchar)key[j] - (uchar)MIN_ASCII_VALUE;
if ((uchar)ciphertext[i] > (uchar)MAX_ASCII_VALUE)
ciphertext[i] -= (uchar)MAX_ASCII_VALUE - (uchar)MIN_ASCII_VALUE + 1;
}
j = (j + 1) % strlen(key);
}
ciphertext[i] = 0;
}