Самодельный Vigenere шифр; работа с acsii персонаж манипулирования

Как следует из названия поста, я работаю над тем, чтобы лучше понять C ++ и манипулирование персонажами, на этот раз путем создания Vigenere Cipher. Для тех, кто не знаком с ним, это довольно простой способ зашифровать текстовый файл.

Основной способ, которым он работает, состоит в том, что существует строка «ключ», и каждый символ (по крайней мере, в моем случае) представляет собой строчный алфавитный символ. Они хранятся в массиве и используются для «сдвига» значения кодируемого файла. Символ «a» сместит цель на 0, а «z» сместит ее на 25. «Сдвиг» является циклическим, что означает, что если «z» смещается на «b» (1), это должно привести к «а».


Мой текущий метод найден ниже:

//Assume cipher[] contains "[a][b][c][x ][y ][z ]" Cipher is a <string> object
//Assume ptr[] contains    "[0][1][2][23][24][25]
#A whole bunch of includes
char c;
ifstream is;
ofstream os;
is.open(argv[3]) //"myinput.txt"os.open(argv[4])  //"myoutput.txt"
int i = 0;

while( is.good() ) {

c = is.get();

if( is.good() ) { //did we just hit the EoF?

c = tolower( c - 0 ); //just make sure it's lowercase

c = c + ptr[ i % cipher.size() ] % 26;

if( c> 122 )
c = ( c % 123 ) + 97;

i++;
os.put( c );
}
}

Я считаю, что моя проблема заключается в моих операциях по модулю. Может быть, это потому, что я потратил так много времени на хеширование, но вчера я потратил много часов на написание этого, а затем еще час лежал в постели, пытаясь понять, как эффективно создавать то, что я хочу:

grab char.
check char.                            //let char = 'z'
check the cipher.                      //let the cipher = 'y'
eval cipher shift                      //'y' shift value = 24
shift z 24 places (cyclically)         //'z'==25, 25+24=49, 49%26=23. 23='x'

ЗДЕСЬ ВОПРОС: Как это сделать с ACSII? («а» = 97, z = «121»)

0

Решение

Представьте, что вы хотите «перемешать» цифры «0-9» между 20 и 29 двумя шагами, так что 20 становится 22, а 29 становится 21. Как бы Вы это сделали?

Что ж, я бы вычел 20 [наше базовое число], а затем перетасовал оставшуюся цифру, а затем снова добавил 20.

newnum = num — 20;
newnum% = 10;
newnum + = 20;

Тот же принцип будет применяться для ASCII — просто это, конечно, база не 20.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]