Я пытаюсь реализовать службу расшифровки в 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());
}
Спасибо за ваш ответ. И простой, и зашифрованный текст имеют одинаковую длину (336 байт). Поэтому тег не добавляется (например, здесь). Насколько я понял, мне нужно либо добавить тег (какой тег? в зашифрованном сообщении такого нет), либо реализовать свою расшифровку (почему?).
Неправильная ссылка, например [здесь]{docs.rs/aead/0.2.0/aead/trait.Aead.html#method.decrypt}

Я обнаружил, что если я не могу использовать тег, я не могу использовать функцию 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
Ключ, iv (nonce) и расшифрованные данные верны (проверено с помощью программы Java). Тег отсутствует. Сколько байт занимает ваш открытый текст? Сколько байт составляет ваш зашифрованный зашифрованный текст? Java добавляет тег AEAD AES/GCM к зашифрованному тексту, чтобы можно было втиснуть AES/GCM в ограниченный
CryptoAPI.