使用sequoia_openpgp解码PGP公钥时遇UnexpectedEof错误求助
解决Sequoia OpenPGP的UnexpectedEOF错误
尝试使用sequoia_openpgp crate解码PGP公钥时遇到如下错误:
Error: Custom { kind: UnexpectedEof, error: FileError { path: "public.asc", source: Custom { kind: UnexpectedEof, error: "EOF" } }代码如下:
use openpgp::armor::{Kind, Reader, ReaderMode}; fn main() -> io::Result<()> { let mut file = File::open("public.asc")?; let mut reader = Reader::from_reader(&mut file, ReaderMode::Tolerant(Some(Kind::File))); let mut data = String::new(); match reader.read_to_string(&mut data) { Err(why) => panic!("Error: {:?}", why), Ok(_) => print!("contains:\n\n{}", data), } Ok(()) }
可能的原因及解决办法
公钥文件不完整或损坏
检查public.asc文件的完整性:- 确认文件开头存在
-----BEGIN PGP PUBLIC KEY BLOCK-----,结尾存在-----END PGP PUBLIC KEY BLOCK----- - 确保结尾标记行未被截断或缺失
- 若文件损坏,重新获取一份完整的PGP公钥文件
- 确认文件开头存在
Armor类型匹配错误
当前代码使用Kind::File作为Armor类型,但PGP公钥对应的正确类型是Kind::PublicKey。错误的类型匹配会导致解析逻辑异常,提前判定文件结束。修改Reader初始化代码:let mut reader = Reader::from_reader(&mut file, ReaderMode::Tolerant(Some(Kind::PublicKey)));错误的读取方式
Sequoia的Armor Reader设计用于处理二进制字节流,直接用read_to_string读取可能因编码问题触发异常。正确的做法是读取字节后再解析公钥:use openpgp::armor::{Kind, Reader, ReaderMode}; use openpgp::Cert; use std::fs::File; use std::io::{self, Read}; fn main() -> io::Result<()> { let mut file = File::open("public.asc")?; let mut reader = Reader::from_reader(&mut file, ReaderMode::Strict, Some(Kind::PublicKey)); let mut buf = Vec::new(); reader.read_to_end(&mut buf)?; match Cert::from_bytes(&buf) { Ok(cert) => println!("解析到公钥: {:?}", cert), Err(e) => panic!("解析公钥失败: {:?}", e), } Ok(()) }
内容的提问来源于stack exchange,提问作者Mysterion
相关产品推荐
相关产品推荐

