Мне нужно хорошо объяснить, что происходит в строке «f = d (tolower (b [1] [g% strlen (b [1])])));»

Я понимаю код, и он отлично работает, у меня есть только одна важная часть. Мне нужно, чтобы вы объяснили строку "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);
            }
        }
1
задан 30.11.2019, 02:05
2 ответа

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, равно как первую букву сообщения, и т.д.

Ты cГіdigo

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, и т.д.
  • AsГ - так как 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 букв в алфавите Американский стандартный код обмена информацией).

0
ответ дан 01.12.2019, 10:33
  • 1
    Большое спасибо, очень ú til твой ответ. Не, потому что я tranque в этой линии и я даже остаюсь, не схватывая ее в воздухе. – jonattangonzalez 30.11.2019, 16:17

я увидел код и я это интерпретирую следующего способа:

b - вектор Strings. Давайте предполагать, что b [1] он содержит String, "ешь".

Вычисляет длину string, помещенного в b [1], в этом случае strlen(b[1]); он был бы должен возвращать 4.

Вычисляет оставшуюся часть операции между g и информация, полученная в предыдущей точке, что возвращает как оставшаяся часть 4.

Используя 4 оставшейся части, вводит информацию в компьютер в характер b[1][4], который в нашем случае является буквой 'в'.

Этот характер это перемещает как параметр в функцию tolower() для того, чтобы в случае, если она будет прописной, он это переместил в строчную букву.

Возврат tolower () - характер, перешедший в строчную букву, и этот характер это перемещает в функцию d (), который получает как аргумент char и возвращает int, который хранится в f.

Надеялся, что ты смог понимать, так как он реализует несколько операций внутри той же линии и немного смущен.

1
ответ дан 01.12.2019, 10:33
  • 1
    Я это не понимаю очень обременительный алгоритм, но segú n он говорит, что вопрос - máquina enigma, má хина, чтобы кодировать и декодировать сообщения, использованная немцами в 2-ой мировой войне. Так не поддающийся расшифровке, что того, чтобы не быть что англичане нашли подводную лодку в преддверии проваливания с учебником с ключами для нескольких недель (на которые их меняли все dí эксперт) никогда они не расшифровали ее. Он не был одиноким mé обряд Тьюринга. – Juan Rom 30.11.2019, 07:07