Как исправить эту словарную атаку (для школы). SEED Lab

Мне дали следующее задание для школы. Это задача 7 лаборатории SEED для шифрования секретных ключей.

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

Вот назначение:

2.7 Задача 7: Программирование с использованием Crypto Library. Это задание в основном предназначено для студентов в области компьютерных наук / техники или смежных областей, где требуется программирование. Студенты должны проконсультироваться со своими профессорами, чтобы узнать, требуется ли это задание для их курсов или нет.

В этом задании вам дается открытый текст и зашифрованный текст, и ваша задача - найти ключ, который используется для шифрования. Вам известны следующие факты: • Для шифрования используется шифр aes-128-cbc. • Ключ, используемый для шифрования этого открытого текста, - это английское слово длиной не более 16 символов; слово можно найти в типичном английском словаре. Поскольку слово содержит менее 16 символов (то есть 128 бит), знаки фунта (#: шестнадцатеричное значение равно 0x23) добавляются в конец слова, чтобы сформировать ключ из 128 бит.

Ваша цель - написать программу для определения ключа шифрования. Вы можете скачать список английских слов из Интернета. Мы также связали один на веб-странице этой лаборатории. Открытый текст, зашифрованный текст и IV перечислены в следующем списке: Открытый текст (всего 21 символ): это совершенно секретно. Зашифрованный текст (в шестнадцатеричном формате): 764aa26b55a4da654df6b19e4bce00f4 ed05e09346fb0e762583cb7da2ac93a2 IV (в шестнадцатеричном формате): aabbccddeeff00998877665544332211

Необходимо обратить внимание на следующие проблемы: • Если вы решили сохранить сообщение в виде открытого текста в файле и передать файл в свою программу, вам необходимо проверить, равна ли длина файла 21. Если вы набираете сообщение в текстовом редакторе Вы должны знать, что некоторые редакторы могут добавлять специальный символ в конец файла. Самый простой способ сохранить сообщение в файле - использовать следующую команду (флаг -n указывает echo не добавлять завершающий перевод строки):

$ echo -n "Это совершенно секретно." > файл

• В этой задаче вы должны написать свою собственную программу для вызова библиотеки шифрования. Никакой кредит не будет предоставлен, если вы просто используете команды openssl для выполнения этой задачи. Пример кода можно найти по следующему URL:

https://www.openssl.org/docs/man1.0.2/crypto/EVP_EncryptInit.html

• Когда вы компилируете свой код, используя gcc, не забудьте включить флаг -lcrypto, потому что вашему коду нужна криптографическая библиотека. Смотрите следующий пример:

$ gcc -o myenc myenc.c -lcrypto

Я пробовал с несколькими известными ключами, вот один пример. Тест с известным ключом: простой текстовый ключ: abacus########## Шестнадцатеричный ключ: 61626163757323232323232323232323 Моя тестовая команда: openssl enc -aes-128-cbc -e -in pl.txt -out cipher.bin -K 61626163757323232323232323232323 -iv aabbccddeeff00998877665544332211 Cmd-шифр: 20d339f0c721981aca8350c83804e79958ad44d5f50b986c707893cfa0b44d50f1b1 1 5f1 1 54041 5401 84041 54041 5404 84041 5401 8404 84 84 404 84 404 84 404 84 84 404 84 84 404 84 404 84 84 84 84 404 84 84 84 84 404 84 84 84 404 84 84 84 404 84 84 84 404 84 84 84 404 84 84 404 84 84 84 84 404 84 84 84 404

addHex() добавляет '#' к неиспользуемым индексам. strcicmp() преобразует в нижний и сравнивает строки.

Вот мой основной цикл и переменные:

    ivtxt = "aabbccddeeff00998877665544332211";
citxt = "20d339f0c721981aca8350c83804e79958ad44d5f50b986c707893cfa0b44d50";
pltxt = "This is a top secret.";

    while (fgets(keyTest, MAX_WORD_SIZE - 1, dictionaryWord)) {
    keyLength = strlen(keyTest);
    keyTest[keyLength - 1] = '\0'; //make last null
    keyLength = strlen(keyTest);
    if (keyLength < MAX_WORD_SIZE) {
        addHex(keyTest, (MAX_WORD_SIZE));
    }
    EVP_EncryptInit_ex(&ctx, EVP_aes_128_cbc(), NULL, keyTest, ivtxt);

    if (!EVP_EncryptUpdate(&ctx, outbuf, &outlength, pltxt, strlen(pltxt))) {
        EVP_CIPHER_CTX_cleanup(&ctx);
        return 0;
    }

    if (!EVP_EncryptFinal_ex(&ctx, outbuf + outlength, &tmplength)) {
        EVP_CIPHER_CTX_cleanup(&ctx);
        return 0;
    }
    outlength += tmplength;
    char *cmpstr = (char*)malloc(2 * outlength + 1);
    char *ptr = cmpstr;
    int i;
    for (i = 1; i < outlength; i++) {
        ptr += sprintf(ptr, "%02x", outbuf[i]);
    }
    *(ptr + 1) = '\0';
    if (strcicmp(cmpstr, citxt) == 0)
    {
        fprintf(outfile, "Cipher Text: %s\t%s\tWinner Winner Chicken Dinner!\n", cmpstr, keyTest);
    }
    else
    {
        fprintf(outfile, "Cipher Text: %s\t%s\n", cmpstr, keyTest);
    }
    EVP_CIPHER_CTX_cleanup(&ctx);
}

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

0 ответов

Другие вопросы по тегам