我正在为环中的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
}
字符串
1条答案
按热度按时间c90pui9n1#
在评论中解决了这个问题。用于密封消息的nonce必须用于打开消息。