我的Rust,sequoia_openpgp代码每次生成不同的输出有什么问题?

46qrfjad  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(88)

你知道为什么下面的代码每次生成不同的值吗?在给定相同的消息和相同的密码的情况下,输出不应该是相同的吗?
还有,我能做些什么让它更快?在释放模式下大约需要半秒。使用OpenPGP.js的JavaScript等价物要快得多。

use base64::{engine::general_purpose, Engine as _};
use sequoia_openpgp::serialize::stream::{Encryptor, LiteralWriter, Message};
use std::io::Write;

pub fn main() {
    let mut sink = vec![];
    let message = Encryptor::with_passwords(Message::new(&mut sink), Some("password"))
        .build()
        .unwrap();
    let mut w = LiteralWriter::new(message).build().unwrap();
    let _ = w.write_all(b"Hello world.");
    let _ = w.finalize();
    let b64 = general_purpose::STANDARD.encode(sink);

    println!("{}", b64);
}
qni6mghb

qni6mghb1#

预计每次的数据都不同。OpenPGP对称加密在每次加密时都会生成一个新的密钥和初始化向量,然后使用从密码生成的对称密钥加密用于该加密的对称密钥。
这允许一个人使用一个或多个密码和一个或多个OpenPGP密钥来加密相同的数据,因为数据的对称密钥只是由每个其他密钥(OpenPGP非对称密钥和从密码生成的密钥)加密。
一般来说,安全对称加密每次都使用随机IV,因为它使加密随机化,因此可以防止攻击者确定同一消息是否被多次加密。如果攻击者看到同一条消息被多次加密,就可能猜到它的内容,或者执行某种关联。此外,在许多情况下,重复使用相同的密钥和IV会灾难性地削弱系统。
有一些对称加密模式,如AES-SIV,当使用相同的密钥和IV时是安全的,在这种情况下,会产生确定性的结果。在某些情况下,这是可取的或必需的,但一般来说,由于它允许上面的相关性攻击,因此不推荐使用。OpenPGP根本不提供这些模式,所以如果你确实需要,你需要选择一种不同的加密方式。

相关问题