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编解码接口。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构