Rust解密gpg文件输出到管道

前提

pgp常见指令

    pgp -h

下图是常见指令,我们重点看下加密和解密指令


.png
  • 加密指令
    gpg --recipient 54A907763278F930FE4A98A0D9F5 --output key.pgp --encrypt key.json

recipient参数指定接收者的公钥,output参数指定加密后的文件名,encrypt参数指定源文件

  • 解密指令
    gpg -o test_pipeline -d key.pgp

-d 参数指定需要解密的文件,-o 参数指定解密后生成的文件。这里-o可以指定到文件,也可以指定到管道中,这里的test_pipeline就是自定义的管道。

思路

最近写Rust,用pgp解密文件。要让解密内容输出到自定义管道中,这个管道由接受者创建,接受者销毁。自己先是自己用c写了以上解密过程,经他人指导后,Rust中的libc已经帮助我们封装常用的调用C的方法,自己之前写的C的代码是多余,好了,下面我们看下怎么在Rust中调用C方法。

1.生成gpg加密文件

  • 配置好gpg环境 详细点击
  • 用公钥生成加密文件

2.Rust解密加密文件

  • 程序A创建管道 test_pipeline
  • 程序A打开管道 ,等待接收
  • 程序B解密文件输出到 test_pipeline
  • 程序A读取到管道内容后,删除该管道

分析

假设1已经生成完成为 key.gpg 文件

  • 引入 libc dependencies(Cargo.toml)
    [dependencies]
    libc = "0.2.39"
    ...
  • extern libc
    extern crate libc;
    use libc::{c_int, c_char, size_t};
    use libc::c_void;
    use std::ffi::CString;
    use libc::mode_t;
    use libc::ssize_t;
  • 引入libc 函数
    //创建管道
    extern "C" {
        fn mkfifo(path: *const c_char, mode: mode_t) -> c_int;
    }

    //打开管道
    extern "C" {
        fn open(path: *const c_char, oflag: c_int) -> c_int;
    }

    //读取管道
    extern "C" {
        fn read(fd: c_int, buf: *mut c_void, count: size_t) -> ssize_t;
    }

    //删除管道
    extern "C" {
        fn unlink(c: *const c_char) -> c_int;
    }
  • 调用
    let c_str_2 = CString::new(b"test_pipeline" as &[u8]).unwrap();
    let c_ptr: *const c_char = c_str_2.as_ptr();

    unsafe {
        let flag = mkfifo(c_ptr, 0777);//创建管道
        
        let fd = open(c_ptr, 0);//打开管道
        
        let buf = &mut [0; BUFFER_SIZE];
        let r_bytes = unsafe { read(fd, buf.as_mut_ptr() as *mut c_void, BUFFER_SIZE) };//读取管道
        
        let result = std::string::String::from_utf8(buf.to_vec()).unwrap();
        println!("{}", result);
        
        unlink(c_ptr);//移除管道
    }
  • exec pub.sh 文件
    #!/usr/bin/env bash
    cargo run &
    sleep 2

    sudo gpg -o test_pipeline -d key.pgp
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 每个人都希望被珍爱一生,你曾有过,或正在拥有,若想一生拥有,好好用心呵护与经营它吧,待到白发苍苍才可相拥对视,会心...
    爱之涯阅读 383评论 0 2
  • ——读韦思浩先生事迹有感 这是一个陌生的名字, 知道他的人很少。 但是看了他的事迹以后, 我的内心掀起了狂潮! 他...
    清水一滴阅读 1,182评论 1 2
  • 转眼2017年即将过去,想想这一年真的好快,这一年我从一名学生成为一名老师,时间刚刚好不早也不迟。我想是对我的眷顾...
    白银平川096温硕阅读 102评论 0 0