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 <stdio.h>
#include <string.h>
#include <openssl/evp.h>
#include <openssl/x509.h>

//Base64编码
void tEVP_Encode()
{
    EVP_ENCODE_CTX *ctx;
        ctx = EVP_ENCODE_CTX_new();                //EVP编码结构体
    unsigned char in[1024];            //输入数据缓冲区
    int inl;                        //输入数据长度
    char out[2048]={0};                //输出数据缓冲区
    int outl;                        //输出数据长度
    FILE *infp;                        //输入文件句柄
    FILE *outfp;                    //输出文件句柄

    infp = fopen("20201310.dat","rb");//打开待编码的文件
    if(infp == NULL)
    {
        printf("Open File \"20201310.dat\"  for Read Err.\n");
        return;
    }

    outfp = fopen("20201310.txt","w");//打开编码后保存的文件
    if(outfp == NULL)
    {
        printf("Open File \"20201310.txt\" For Write Err.\n");
        return;
  }
    EVP_EncodeInit(ctx);//Base64编码初始化
    printf("文件\"20201310.dat\" Base64编码后为:\n");
    //循环读取原文,并调用EVP_EncodeUpdate计算Base64编码
    while(1)
    {
        inl = fread(in,1,1024,infp);
        if(inl <= 0)
            break;
        EVP_EncodeUpdate(ctx,out,&outl,in,inl);//编码
        fwrite(out,1,outl,outfp);//输出编码结果到文件
        printf("%s",out);
    }
    EVP_EncodeFinal(ctx,out,&outl);//完成编码,输出最后的数据。
    fwrite(out,1,outl,outfp);
    printf("%s",out);
    fclose(infp);
    fclose(outfp);
    printf("对文件\"20201310.dat\" Base64编码完成,保存到\"20201310.txt\"文件.\n\n\n");
}

//Base64解码
void tEVP_Decode()
{
    EVP_ENCODE_CTX *ctx;
        ctx = EVP_ENCODE_CTX_new();            //EVP编码结构体
    char in[1024];                    //输入数据缓冲区
    int inl;                        //输入数据长度
    unsigned char out[1024];        //输出数据缓冲区
 int outl;                        //输出数据长度
    FILE *infp;                        //输入文件句柄
    FILE *outfp;                    //输出文件句柄

    infp = fopen("20201310.txt","r");//打开待解码的文件
    if(infp == NULL)
    {
        printf("Open File \"20201310.txt\"  for Read Err.\n");
        return;
    }
    outfp = fopen("20201310-1.dat","wb");//打开解码后保存的文件
    if(outfp == NULL)
    {
        printf("Open File \"20201310-1.txt\" For Write Err.\n");
        return;
    }
    EVP_DecodeInit(ctx);//Base64解码初始化
    printf("开始对文件\"20201310.txt\" Base64解码...\n\n");
    //循环读取原文,并调用EVP_DecodeUpdate进行Base64解码
    while(1)
    {
        inl = fread(in,1,1024,infp);
        if(inl <= 0)
            break;
        EVP_DecodeUpdate(ctx,out,&outl,in,inl);//Base64解码
        fwrite(out,1,outl,outfp);//输出到文件
    }
    EVP_DecodeFinal(ctx,out,&outl);//完成解码,输出最后的数据。
    fwrite(out,1,outl,outfp);
   fclose(infp);
    fclose(outfp);
    printf("对文件\"20201310.txt\" Base64解码完成,保存为\"20201310-1.dat\"\n\n\n");

}

int main()
{

    tEVP_Encode();
    tEVP_Decode();

    return 0;
}

posted on 2023-04-12 08:43  20201310寸头  阅读(37)  评论(0编辑  收藏  举报