openssl使用

openssl base64命令行使用

使用方式 openssl base64 [options]
常用的options如下

-in infile  省略此选项会从stdin读取
-out outfile  当outfile为 - 时代表标准输出
-e encrypt
-d decrypt
-A 不使用分隔符分割编码结果

使用标准输入,输出到标准输出的例子

openssl base64 -A -e  -out -

BIO_f_base64

#include <openssl/bio.h>
#include <openssl/evp.h>
const BIO_METHOD *BIO_f_base64(void);

描述

这个函数返回一个BIO method,它是一个过滤器。会将写入这个通过这个BIO的数据都是用base64编码,使得read通过它的数据都使用base64解码。对这个BIO使用BIO_flush函数可以将最后一段刷新出去,同时可以使用BIO_set_flags()函数来更改这个BIO默认的行为,默认会在每64个字节出插入一个换行符。

BIO_new

#include <openssl/bio.h>
BIO * BIO_new(const BIO_METHOD *type);
int   BIO_up_ref(BIO *a);
int   BIO_free(BIO *a);
void  BIO_vfree(BIO *a);
void  BIO_free_all(BIO *a);

返回一个新的BIO通过methoad type

BIO_s_file

 #include <openssl/bio.h>

const BIO_METHOD *BIO_s_file(void);
BIO *BIO_new_file(const char *filename, const char *mode);// fopen
BIO *BIO_new_fp(FILE *stream, int flags);

BIO_set_fp(BIO *b, FILE *fp, int flags);
BIO_get_fp(BIO *b, FILE **fpp);

int BIO_read_filename(BIO *b, char *name)
int BIO_write_filename(BIO *b, char *name)
int BIO_append_filename(BIO *b, char *name)
int BIO_rw_filename(BIO *b, char *name)

BIO_push

#include <openssl/bio.h>

BIO *BIO_push(BIO *b, BIO *append);
BIO *BIO_pop(BIO *b);
void BIO_set_next(BIO *b, BIO *next);

BIO_push 会将append这个BIO添加到BIO b上,之后返回b。
BIO_pop 会将在链表中的b都移除掉,然后返回b在链表中的下一个bio
BIO_set_next 会将b的下一个bio替换为next指向的bio。

注意事项

但是好像push这个名字有一些错误,BIO_push并没有push,而是单纯的将两个BIO链接起来,而BIO_pop也只是单纯的将一个BIO从链中删除,并不需要被删除的BIO在链的最后。

例子

BIO_push(b64, f);     // b64-f
BIO_push(md2, b64);   // md2-b64-f
BIO_push(md1, md2);   // md1-md2-b64-f

执行完上述代码后,整个链条为 md1-md2-b64-f 。这时候md1是链表的头,所以md1此时代表了整个链表。当向md1写数据的时候,数据会依次通过后续的节点,最后写入到f中。这个流程是自动运行的。但是当读数据的时候,数据只会反向自动流转,比如md1读数据就是在md1读,只能让从f读数据,md1才能读到经过的数据。
之后执行

BIO_pop(md2);           // md1-b64-f

EVP_ENCODEINIT

EVP_ENCODE_CTX *EVP_ENCODE_CTX_new(void);
        void EVP_ENCODE_CTX_free(EVP_ENCODE_CTX *ctx);
        int EVP_ENCODE_CTX_copy(EVP_ENCODE_CTX *dctx, EVP_ENCODE_CTX *sctx);
        int EVP_ENCODE_CTX_num(EVP_ENCODE_CTX *ctx);
        void EVP_EncodeInit(EVP_ENCODE_CTX *ctx);
        int EVP_EncodeUpdate(EVP_ENCODE_CTX *ctx, unsigned char *out, int *outl,
                             const unsigned char *in, int inl);
        void EVP_EncodeFinal(EVP_ENCODE_CTX *ctx, unsigned char *out, int *outl);
        int EVP_EncodeBlock(unsigned char *t, const unsigned char *f, int n);

        void EVP_DecodeInit(EVP_ENCODE_CTX *ctx);
        int EVP_DecodeUpdate(EVP_ENCODE_CTX *ctx, unsigned char *out, int *outl,
                             const unsigned char *in, int inl);
        int EVP_DecodeFinal(EVP_ENCODE_CTX *ctx, unsigned char *out, int *outl);
        int EVP_DecodeBlock(unsigned char *t, const unsigned char *f, int n);

EVP函数族提供了一个很高抽象的base64编解码接口。

posted @   愚者-  阅读(180)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示