Проблема дешифрования байтов с шифрованием в режиме ECB - PullRequest
0 голосов
/ 05 января 2019

У меня проблемы с расшифровкой строки байтов с помощью ящика openssl. Напомним, что это касается задач Cryptopals, в частности, задайте 2 задачу 2. Текстовый файл был зашифрован с использованием AES в режиме CBC, но я думаю, что один блок может быть расшифрован с помощью ECB.

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

Для Python 3:

from base64 import b64decode
from Crypto.Cipher import AES
def main():
    key = b'YELLOW SUBMARINE'
    with open("10.txt") as input_file:
        data = b64decode(input_file.read())

    data = data[0:AES.block_size]
    print(data)
    cipher = AES.new(key, AES.MODE_ECB)
    x = cipher.decrypt(data)
    print(x)
    return

для ржавчины:

extern crate openssl;

use openssl::symm::decrypt;
use openssl::symm::{encrypt, Cipher};

static KEY: &'static [u8] = b"YELLOW SUBMARINE";

fn main() -> std::io::Result<()> {
    // No idea why this OpenSSL call doesn't work.
    let data = b"\x09\x12\x30\xaa\xde\x3e\xb3\x30\xdb\xaa\x43\x58\xf8\x8d\x2a\x6c";
    let cipher = Cipher::aes_128_ecb();
    let new_data = decrypt(cipher, KEY, None, data);
    println!("error {:?}", new_data);

    Ok(())
}

Я ожидал увидеть, как эта функция расшифровывает строку байтов в Rust так же, как это было сделано в python.

1 Ответ

0 голосов
/ 05 января 2019

OpenSSL сообщает вам, что ваш ввод заполнен неправильно. Измените ввод на

let data = b"\x09\x12\x30\xaa\xde\x3e\xb3\x30\xdb\xaa\x43\x58\xf8\x8d\x2a\x6c\x60\xfa\x36\x70\x7e\x45\xf4\x99\xdb\xa0\xf2\x5b\x92\x23\x01\xa5";

и вы увидите, что ваш код правильно его расшифровывает.

Если вам нужно отключить заполнение, вы можете сделать это, используя объект Crypter и вызывая .pad(false) для него ( пример ).

...