如何用 rust 环AEAD解密密文?

7eumitmz  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(129)

我正在为环中的AEAD编写一个简单的POC。我试图用AAD加密和解密一条消息。我生成两个随机数,一个用于加密,一个用于解密。我的理解是seal_in_place_append_tag()修改in_out,加密其中的消息并附加标签。open_in_place()应该接受一个ciphertext +标签并返回一个包含明文的结果,对吗?
看起来我做的事情是正确的,但是在解密第24行的消息时我得到了一个错误。不幸的是,所有的环的错误都是未指定的,这在生产中是有意义的,但在我的情况下是没有帮助的。
下面是我的代码:

use ring::aead::{UnboundKey, AES_256_GCM, LessSafeKey, NONCE_LEN, Aad, Nonce};
use ring::rand::{SystemRandom, SecureRandom};

fn main() {
    let mut secret = vec![0u8; AES_256_GCM.key_len()];
    let mut nonce_bytes = vec![0u8; NONCE_LEN];
    let mut nonce_bytes2 = vec![0u8; NONCE_LEN];
    let rng = SystemRandom::new();
    rng.fill(&mut secret).unwrap();
    rng.fill(&mut nonce_bytes).unwrap();
    rng.fill(&mut nonce_bytes2).unwrap();
    let nonce =  Nonce::try_assume_unique_for_key(&nonce_bytes).unwrap();
    let nonce2 = Nonce::try_assume_unique_for_key(&nonce_bytes2).unwrap();
    let key = LessSafeKey::new(UnboundKey::new(&AES_256_GCM, &secret).unwrap());
    let mut payload = Vec::from(String::from("Test"));
    let aad = Aad::from(b"test_aad");
    println!("{:?}", secret);
    println!("{:?}", aad);
    println!("{:?}", payload);
    key.seal_in_place_append_tag(nonce, aad, &mut payload).unwrap();
    println!("{:?}", secret);
    println!("{:?}", aad);
    println!("{:?}", payload);
    let key2 = LessSafeKey::new(UnboundKey::new(&AES_256_GCM, &secret).unwrap());
    key2.open_in_place(nonce2, aad, &mut payload).unwrap(); //Panics here
}

字符串

c90pui9n

c90pui9n1#

在评论中解决了这个问题。用于密封消息的nonce必须用于打开消息。

相关问题