OpenSSL测试-Base64

OpenSSL测试-Base64
本次作业分值 20 分|
老师 评分
 
任务详情
0. 在openEuler(推荐)或Ubuntu或Windows(不推荐)中完成下面任务
1. 使用工具(如bc,计算机器等)把自己学号转化为16进制,提交转化过程和结果截图(2‘) 
2. 使用工具(如echo -e, ultraedit等)把上面转化的结果写入二进制文件“你的学号.dat”中,并用工具`od -tx1 你的学号.dat`,提交命令运行(3’)
3. 使用OpenSSL的base64命令对"你的学号.dat"进行编码解码,提交过程截图(5')
4. 使用OpenSSL编程对"你的学号.dat"进行编码解码,提交代码和运行结果截图。(10’)

#include <openssl/evp.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void base64_encode(FILE *input, FILE *output) {
EVP_ENCODE_CTX *ctx = EVP_ENCODE_CTX_new();
unsigned char inbuf[512];
unsigned char outbuf[1024];
int inlen, outlen;

EVP_EncodeInit(ctx);
while ((inlen = fread(inbuf, 1, sizeof(inbuf), input)) > 0) {
EVP_EncodeUpdate(ctx, outbuf, &outlen, inbuf, inlen);
fwrite(outbuf, 1, outlen, output);
}
EVP_EncodeFinal(ctx, outbuf, &outlen);
fwrite(outbuf, 1, outlen, output);

EVP_ENCODE_CTX_free(ctx);
}

void base64_decode(FILE *input, FILE *output) {
EVP_ENCODE_CTX *ctx = EVP_ENCODE_CTX_new();
unsigned char inbuf[512];
unsigned char outbuf[1024];
int inlen, outlen;

EVP_DecodeInit(ctx);
while ((inlen = fread(inbuf, 1, sizeof(inbuf), input)) > 0) {
EVP_DecodeUpdate(ctx, outbuf, &outlen, inbuf, inlen);
fwrite(outbuf, 1, outlen, output);
}
EVP_DecodeFinal(ctx, outbuf, &outlen);
fwrite(outbuf, 1, outlen, output);

EVP_ENCODE_CTX_free(ctx);
}

int main(int argc, char **argv) {
FILE *fin, *fout;

if (argc != 4) {
fprintf(stderr, "Usage: %s <encode/decode> <input file> <output file>\n", argv[0]);
return 1;
}

fin = fopen(argv[2], "rb");
if (!fin) {
perror("Error opening input file");
return 1;
}

fout = fopen(argv[3], "wb");
if (!fout) {
perror("Error opening output file");
fclose(fin);
return 1;
}

if (strcmp(argv[1], "encode") == 0) {
base64_encode(fin, fout);
} else if (strcmp(argv[1], "decode") == 0) {
base64_decode(fin, fout);
} else {
fprintf(stderr, "Invalid operation: %s\n", argv[1]);
fclose(fin);
fclose(fout);
return 1;
}

fclose(fin);
fclose(fout);

return 0;
}

 

 

posted @ 2024-04-08 09:06  20211106隋吉达  阅读(61)  评论(0)    收藏  举报