如何在给定rsa公钥armor的情况下创建加密的armor文件



我有一个字符串,需要用我作为ascii armor的公钥加密到ascii armor。

使用gpg,步骤是:

gpg --import <(echo '
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: PGP Command Line v10.4.2 (Build 1254) (Linux)
key data here
-----END PGP PUBLIC KEY BLOCK-----')
gpg -r identity-of-above@pubkey --armor -e file-of-string-to-encrypt

但我需要在一个不依赖gpg的程序中做到这一点。我觉得pgp和/或rsa应该是我想要的,但我甚至不知道如何从字符串中加载密钥。

如何加载密钥,然后使用rust生成加密文件?这是我迄今为止所写的:

use indoc::indoc;
use rsa::{pkcs1::DecodeRsaPublicKey, PaddingScheme, PublicKey, RsaPublicKey};
fn main() {
let pem = indoc! {"
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: PGP Command Line v10.4.2 (Build 1254) (Linux)
key data here
-----END PGP PUBLIC KEY BLOCK-----
"};
let pub_key = RsaPublicKey::from_pkcs1_pem(&pem).unwrap();
let data = b"contents I want to encrypt";
let mut rng = rand::thread_rng();
let enc_data = pub_key
.encrypt(&mut rng, PaddingScheme::new_pkcs1v15_encrypt(), &data[..])
.expect("failed to encrypt");
}

但我得到了这个编译错误:

thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Asn1(Error { kind: Pem(HeaderDisallowed), position: None })', src/main.rs:51:54
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

很公平,但我找不到如何对我的密钥类型执行相同的密钥加载过程。如何加载此密钥?

在Rust Discord服务器上的一些人的帮助下,我确实设法解决了这个问题。它需要使用Message、SignedPublicKey和可反序列化特性。结果是这样的。

use indoc::indoc;
use pgp::composed::message::Message;
use pgp::composed::signed_key::public::SignedPublicKey;
use pgp::composed::Deserializable;
use pgp::crypto::sym::SymmetricKeyAlgorithm;
use std::fs::File;
fn main() {
let pem = indoc! {"
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: PGP Command Line v10.4.2 (Build 1254) (Linux)
key data here
-----END PGP PUBLIC KEY BLOCK-----
"};
let pub_key = SignedPublicKey::from_string(&pem).unwrap().0;
assert!(pub_key.verify().is_ok());
let data = "contents I want to encrypt";
let fname = "encdata";
let mut rng = rand::thread_rng();
let mut file = File::create(fname).unwrap();
let msg = Message::new_literal(&fname, &data)
.encrypt_to_keys(&mut rng, SymmetricKeyAlgorithm::AES128, &[&pub_key])
.unwrap()
.to_armored_writer(&mut file, None);
}

也面临同样的问题,并通过删除吲哚之间每行前面的选项卡来解决"one_answers"}

fn main() {
...
let pem = indoc! {"
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: PGP Command Line v10.4.2 (Build 1254) (Linux)
key data here
-----END PGP PUBLIC KEY BLOCK-----
"};
...
}

相关内容

最新更新