You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 18:25:22