AES-GCM без AEAD (тег)

Я пытаюсь реализовать службу расшифровки в Rust. Ящик ржавчины-крипто не работает на моем компьютере (Apple M1 Max), поскольку символ _rust_crypto_util_fixed_time_eq_asm не определен.

После перехода на крейт aes-gcm (v0.10.3) программа теперь не сразу дает сбой, а вместо этого внутренний сбой расшифровки и просто возвращает aead::Error.

Ключ, iv (nonce) и расшифрованные данные верны (проверено с помощью программы Java). Тег отсутствует.

Я что-то пропустил? Помимо отсутствующих вопросительных знаков, я только что использовал пример кода из документации крейта AES-GCM.

Код:

use aes_gcm::{aead::{Aead, AeadCore, KeyInit}, Nonce, Key, Aes128Gcm};

fn main() {
    let key = hex::decode("some_hex_string").expect("Decoding failed");
    let key = Key::<Aes128Gcm>::from_slice(key.as_ref());
    let cipher = Aes128Gcm::new(&key);

    let iv: [u8; 12] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
    let nonce = Nonce::from_slice(&iv);

    let plaintext = cipher.decrypt(nonce, decryped_byte_array.as_ref());
}

Ключ, iv (nonce) и расшифрованные данные верны (проверено с помощью программы Java). Тег отсутствует. Сколько байт занимает ваш открытый текст? Сколько байт составляет ваш зашифрованный зашифрованный текст? Java добавляет тег AEAD AES/GCM к зашифрованному тексту, чтобы можно было втиснуть AES/GCM в ограниченный Crypto API.

Andrew Henle 10.05.2024 19:36

Спасибо за ваш ответ. И простой, и зашифрованный текст имеют одинаковую длину (336 байт). Поэтому тег не добавляется (например, здесь). Насколько я понял, мне нужно либо добавить тег (какой тег? в зашифрованном сообщении такого нет), либо реализовать свою расшифровку (почему?).

Simon 15.05.2024 09:50

Неправильная ссылка, например [здесь]{docs.rs/aead/0.2.0/aead/trait.Aead.html#method.decryp‌​t}

Simon 15.05.2024 11:05
Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
0
3
131
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я обнаружил, что если я не могу использовать тег, я не могу использовать функцию cipher.decrypt, поскольку она требует от меня отправки либо полезной нагрузки (содержащей AEAD/тег), либо конкатенации Encrypted_message+tag. (Тег не может быть нулевым или пустым)

После этого ответа на расшифровку AES-GCM 256 не удается даже при наличии правильных данных , я теперь использую базовую функцию. (До сих пор не понял, почему «шифрование» работает вместо «дешифрования, но неважно...?»)

cipher.encrypt_in_place_detached(&iv.into(), &[], &mut some_byte_array)
// Manipulate the now decrypted some_byte_array further

почему «шифрование» работает для «дешифрования» — для компьютера оба они просто преобразуют один набор байтов в другой набор байтов, только с разными ключами. Например, когда я «шифрую» x с помощью операции «+1», я могу вернуть исходное значение, дополнительно «зашифровав» с помощью операции «-1», для компьютера нет никакой разницы, но для нас, людей, мы можем ясно отличить x от x+1

cafce25 15.05.2024 14:31

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