Я понимаю код, и он отлично работает, у меня есть только одна важная часть. Мне нужно, чтобы вы объяснили строку "f = d (tolower (b [1] [g% strlen (b [1])]));" Он использует шифрование силы, вы даете слово для шифрования «папа», и вы даете пароль для шифрования «мама» и бросаете зашифрованный код «баба», который может быть расшифрован только с помощью ключевое слово мама.
int f;
int g = -1;
int h;
//get plaintext to encrypt
string plaintext = get_string("plaintext: ");
printf("ciphertext: ");
//iterate through each char of plaintext
for (int j = 0, l = strlen(plaintext); j < l; j++)
{
if (isalpha(plaintext[j]))
{
g++;
f = d(tolower(b[1][g % strlen(b[1])]));
h = (int) plaintext[j] + f;
if ((int) tolower(plaintext[j]) + f > 122)
{
h = h - 26;
printf("%c", (char) h);
}
else
{
printf("%c", (char) h);
}
}
Wikipedia содержит хорошую одну descripciГіn криптографии Vigenere , на примере которого я буду основываться, чтобы объяснять ты cГіdigo.
стараются превращать текст francГ©s "PARIS VAUT BIEN UNE MESSE"
в другую "криптографию". mГ©todo Vigenere очень сходно с криптографией Прекращаться, но улучшенный. Я начинаюсь, из-за того, что объясняет CГ©sar, который mГЎs просто.
В mГ©todo CГ©sar, в каждую букву сообщения складывает установленное количество, которое выбирает тот, кто estГЎ шифруя. Давайте говорить, что его 15. Представь, что алфавит estГЎ упорядоченный в одном cГ-rculo и в каждую букву ты распределяешь ему ту, которая estГЎ 15 положений despuГ©s. "A" конвертирует в "P", "B" в "Q", "K" в "Z", "L" в "A", и т.д.
, Если мы способствуем тому, чтобы к месту он не применялся transformaciГіn, а sГіlo в буквы, сообщение quedarГ - в тогда конвертируемый в "FPHXI LPKJ QXTD KDT CTIIT"
. Чтобы расшифровывать сообщение, которое это получает, будь должен знать использованное количество (15) и уменьшать это в cГіdigo каждой буквы.
mГ©todo Vigenere сходный, sГіlo, что вместо того, чтобы складывать то же количество в каждую букву, складывает количество, отличное от каждой. Существует "ключ", который известен tambiГ©n тем, кто получает сообщение, чтобы этого мочь расшифровывать), что является той, которая показывает quГ© количество, суммировать в каждую букву.
, Если например ключ - "LOUP", это показывает, что количество, которое нужно складывать в первую букву сообщения, должно быть 11 (потому что "L" занимает ее posiciГіn 11 в азбуке, если мы предполагаем, что она "В" es она posiciГіn 0). Количество, которое должно складывать во вторую букву сообщения serГ - 14 (так как "Или" estГЎ в posiciГіn 14), и т.д.
, Так как у ключа только есть четыре буквы и взамен сообщение имеет mГЎs, когда заканчиваются буквы ключа, вновь начинается с первой. Следовательно пятая буква сообщения cifrarГ - в складывая снова 11, равно как первую букву сообщения, и т.д.
QuerГ-Схвати знать значение ее lГ-nea:
f = d(tolower(b[1][g % strlen(b[1])]));
Нужно делать какие-то hipГіtesis, чтобы понимать quГ© это делает:
b[1]
содержит ключ криптографии (или расшифровка, так как это тот же самый). В примере раньше увиденный b[1]
contendrГ - в цепь "LOUP"
g
содержит один nГєmero, что говорит нам quГ© букву сообщения, касается обрабатывать. Например в начало g=0
Тогда то, что его делает b[1][g % strlen(b[1]))
, состоит в том, чтобы соглашаться на букву "LOUP", в частности на ту, которая касается segГєn стоимости g
. Давайте видеть это.
strlen(b[1])
4 в этом примере, так как у "LOUP" есть четыре буквы. Так что она expresiГіn раньше вид равняется b[1][g % 4]
. %
(названный mГіdulo) дает тебе оставшуюся часть ее divisiГіn. В нашем случае, оставшейся части разделения g
из 4. Это прием Гєtil, чтобы гарантировать тебя, которого результат когда бы то ни было serГЎ больше 4. Когда g=0
оставшейся части 0. Когда g=1
оставшейся части 1
, и т.д...., но когда g=4
оставшейся части 0 снова, и для g=5
его вновь является 1, и т.д. b[1][g%4]
дает нам буквы L
, O
, U
, P
, L
, O
, и т.д. по мере того, как g
увеличивает Окончательно, как я сказал, дает нам с quГ© букву нужно шифровать элемент g
-Г©simo сообщения.
tolower()
перемещает эту букву в minГєsculas (l
, o
, u
, p
, l
, o
...) и в конце концов результат envГ - funciГіn d()
, которые мы не знаем quГ©, делает ей, потому что ты не включил Ваш cГіdigo.
, Но так как мы знаем то, что его должно делать , мы можем предполагать, что он делает правильное, и это состоит в том, чтобы возвращать нам один nГєmero, который он показывает cuГЎnto, нужно суммировать в букву g
-Г©sima сообщения, чтобы шифровать ее. В нашем случае, если мы перемещаем его l
deberГ, - чтобы возвращать 11
, которые уже мы увидели, что то, что нужно складывать в первую букву сообщения. Этот результат сохраняет в f
.
Действительно ты можешь видеть в них lГ-neas следующие, что эта f
он прибавляется к соответствующей букве сообщения:
h = (int) plaintext[j] + f;
не использует plaintext[g]
, по вине которых мы нарушаем место во время шифрования, а следовательно буква g
-Г©sima сообщения не соответствует с характером j
-Г©simo array. Например, в сообщении "ПАРИЖ VAUT..." шестой буквы сообщения "V", но шестым carГЎcter является место. j
соглашается на символы (и он увеличивается снова, если находится место), в то время как g
считает буквы (и sГіlo он увеличивается, когда шифруется одна).
h
следовательно cГіdigo криптография, но в форме nГєmero. Нужно превращать это снова в букву, что делается в принципе с простым print("%c", h)
, но остается наладить случай, в котором шифрованная буква "вытекает из алфавита", что является тем, что делается в if смотря, cГіdigo вытекающий больше ли он 122 (cГіdigo Американский стандартный код обмена информацией "z"
), в случае которых отрицают у него 26 (nГєmero букв в алфавите Американский стандартный код обмена информацией).
я увидел код и я это интерпретирую следующего способа:
b - вектор Strings. Давайте предполагать, что b [1] он содержит String, "ешь".
Вычисляет длину string, помещенного в b [1], в этом случае strlen(b[1]);
он был бы должен возвращать 4.
Вычисляет оставшуюся часть операции между g и информация, полученная в предыдущей точке, что возвращает как оставшаяся часть 4.
Используя 4 оставшейся части, вводит информацию в компьютер в характер b[1][4]
, который в нашем случае является буквой 'в'.
Этот характер это перемещает как параметр в функцию tolower()
для того, чтобы в случае, если она будет прописной, он это переместил в строчную букву.
Возврат tolower () - характер, перешедший в строчную букву, и этот характер это перемещает в функцию d (), который получает как аргумент char и возвращает int, который хранится в f.
Надеялся, что ты смог понимать, так как он реализует несколько операций внутри той же линии и немного смущен.
máquina enigma
, má хина, чтобы кодировать и декодировать сообщения, использованная немцами в 2-ой мировой войне. Так не поддающийся расшифровке, что того, чтобы не быть что англичане нашли подводную лодку в преддверии проваливания с учебником с ключами для нескольких недель (на которые их меняли все dí эксперт) никогда они не расшифровали ее. Он не был одиноким mé обряд Тьюринга.
– Juan Rom
30.11.2019, 07:07