首页 > 其他分享 >OpenSSL测试-SM4

OpenSSL测试-SM4

时间:2024-05-13 14:21:50浏览次数:26  
标签:ciphertext return plaintext SM4 OpenSSL len int 测试 EVP

任务详情:0. 在openEuler(推荐)或Ubuntu或Windows(不推荐)中完成下面任务,参考别人代码要给出链接,使用AI工具要给出过程,否则成绩归零。1. 使用OpenSSL的命令对你的8位学号(字符串)进行加密解密,密钥的前8个字节为你的8位学号,提交过程截图(5')2. 使用OpenSSL编程对对"你的8位学号(数字)"进行加密解密,提交代码和运行结果截图。(10’)3. 使用龙脉智能钥匙完成 2的内容,并与OpenSSL的结果进行对比,提交代码和运行结果截图。((10’))

AI工具和链接

image
image

1. 使用OpenSSL的命令对你的8位学号(字符串)进行加密解密,密钥的前8个字节为你的8位学号,提交过程截图(5')

image

2. 使用OpenSSL编程对对"你的8位学号(数字)"进行加密解密,提交代码和运行结果截图。(10’)

代码

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

// 定义密钥长度为16字节(128位)
#define KEY_LENGTH 16

// 加密函数
int sm4_encrypt(unsigned char *plaintext, int plaintext_len, unsigned char *key, unsigned char *ciphertext) {
    EVP_CIPHER_CTX *ctx;

    int len;
    int ciphertext_len;

    // 创建并初始化一个上下文对象
    if(!(ctx = EVP_CIPHER_CTX_new())) {
        return -1;
    }

    // 初始化加密操作,设置SM4算法和密钥
    if(1 != EVP_EncryptInit_ex(ctx, EVP_sm4_ecb(), NULL, key, NULL)) {
        return -1;
    }

    // 执行加密操作
    if(1 != EVP_EncryptUpdate(ctx, ciphertext, &len, plaintext, plaintext_len)) {
        return -1;
    }
    ciphertext_len = len;

    // 结束加密操作
    if(1 != EVP_EncryptFinal_ex(ctx, ciphertext + len, &len)) {
        return -1;
    }
    ciphertext_len += len;

    // 释放上下文对象
    EVP_CIPHER_CTX_free(ctx);

    return ciphertext_len;
}

// 解密函数
int sm4_decrypt(unsigned char *ciphertext, int ciphertext_len, unsigned char *key,  unsigned char *plaintext) {
    EVP_CIPHER_CTX *ctx;

    int len;
    int plaintext_len;

    // 创建并初始化一个上下文对象
    if(!(ctx = EVP_CIPHER_CTX_new())) {
        return -1;
    }

    // 初始化解密操作,设置SM4算法和密钥
    if(1 != EVP_DecryptInit_ex(ctx, EVP_sm4_ecb(), NULL, key, NULL)) {
        return -1;
    }

    // 执行解密操作
    if(1 != EVP_DecryptUpdate(ctx, plaintext, &len, ciphertext, ciphertext_len)) {
        return -1;
    }
    plaintext_len = len;

    // 结束解密操作
    if(1 != EVP_DecryptFinal_ex(ctx, plaintext + len, &len)) {
        return -1;
    }
    plaintext_len += len;

    // 释放上下文对象
    EVP_CIPHER_CTX_free(ctx);

    return plaintext_len;
}

int main() {
    // 设置密钥
    unsigned char key[KEY_LENGTH] = "e348ca9e5d98ce4d91b6d4f532207586"; // 

    // 原始字符串
    unsigned char plaintext[] = "20211318";

    // 计算原始字符串长度
    int plaintext_len = strlen((char *)plaintext);

    // 分配内存空间存放加密后的数据
    unsigned char *ciphertext = malloc(plaintext_len + EVP_MAX_BLOCK_LENGTH);
    if (ciphertext == NULL) {
        fprintf(stderr, "malloc() failed\n");
        return -1;
    }

    // 加密
    int ciphertext_len = sm4_encrypt(plaintext, plaintext_len, key, ciphertext);
    if (ciphertext_len == -1) {
        fprintf(stderr, "Encryption failed\n");
        return -1;
    }

    // 打印加密结果
    printf("加密后的数据:");
    for (int i = 0; i < ciphertext_len; i++) {
        printf("%02x", ciphertext[i]);
    }
    printf("\n");

    // 分配内存空间存放解密后的数据
    unsigned char *decryptedtext = malloc(ciphertext_len + EVP_MAX_BLOCK_LENGTH);
    if (decryptedtext == NULL) {
        fprintf(stderr, "malloc() failed\n");
        return -1;
    }

    // 解密
    int decryptedtext_len = sm4_decrypt(ciphertext, ciphertext_len, key, decryptedtext);
    if (decryptedtext_len == -1) {
        fprintf(stderr, "Decryption failed\n");
        return -1;
    }

    // 打印解密结果
    printf("解密后的数据:%s\n", decryptedtext);
    // 释放内存空间
    free(ciphertext);
    free(decryptedtext);
    return 0;
}

运行截图:
image

标签:ciphertext,return,plaintext,SM4,OpenSSL,len,int,测试,EVP
From: https://www.cnblogs.com/wjmbk123/p/18189094

相关文章

  • 测试人员都是画画大神,让我看看谁还不会用代码图?
    给大家30秒的时间,一起来思考这是什么? 这是某系统登陆模块功能的初始类图。随着现代软件的不断复杂化,代码图(CodeGraphs)为测试人员提供了一种直观的方法,让复杂的代码逻辑易于理解。本文将深入探讨代码图,通过挖掘到的真实场景和实际示例,展示可视化代码图如何增强软件测试人员的......
  • Qwen-VL环境搭建&推理测试
    引子这几天阿里的Qwen2.5大模型在大模型圈引起了轰动,号称地表最强中文大模型。前面几篇也写了QWen的微调等,视觉语言模型也写了一篇CogVLM,感兴趣的小伙伴可以移步https://blog.csdn.net/zzq1989_/article/details/138118608?spm=1001.2014.3001.5501。前面也写过一篇智谱AI的视觉......
  • 【pytest】将测试用例内的数据回填给fixtrue 中
    【背景】每个测试用例生成对应的log文件,需要将测试脚本名称传给log对象,生成对于的log文件【分析】方法一:使用@pytest.mark.parametrize的 indirect=True ,参数1:执行对应的函数(fixtrue中的函数名称) 参数2:函数对应的参数  参考:Pytest系列(10)-fixture传参数reques......
  • OpenSSL测试-HMAC
    任务详情:0参考别人代码要给出链接,使用AI工具要给出过程,否则成绩归零1在openEuler(推荐)或Ubuntu中,使用OpenSSL命令行工具,对消息“你的学号(数字)重复10遍”使用HMAC-SM3进行验证。密钥为随机数,自己生成。提交命令行操作过程截图和结果。(5分)2使用C语言和OpenSSL库,在openEuler或......
  • 性能测试实战训练营 - 慧测
    红框中的就是堆和栈 资源消耗大,那么就要分析栈,对栈内存做dump,一个线程对应一个栈,分析消耗cpu过高的线程(runnable状态的) 具体的例子,下面是一段java程序代码, 只有一个runnable的线程Thread1,该线程循环输出一句话, 运行该程序 该线程运行时会非常消耗cpu 通过to......
  • 一个PowerShell内网渗透测试的大纲:
    一个PowerShell内网渗透测试的大纲:介绍内网渗透测试:什么是内网渗透测试?内网渗透测试的目的和方法。内网渗透测试的法律和道德问题。PowerShell基础知识回顾:PowerShell的基本语法和命令。PowerShell的常见用途和功能。PowerShell在内网渗透测试中的重要性和作用......
  • ESP32-S3-WROOM-1 arduino测试选项
    1、2、3、 ......
  • 实验三 软件测试
    一、实验题目:软件测试二、实验目的 1、熟悉开发环境下的自动化测试工具;1、利用自动化测试工具进行自动化单元测试。三、实验内容1、选择开发环境,IDEA或PYCHARM任选其一;2、基于所选择的开发环境实现对输入的n个整数进行排序的代码;3、对所编写代码设计测试用例;4、基于所选......
  • pivot 分组案例测试
    droptableStudentScores;CREATETABLEStudentScores(schoolvarchar(20),UserNameVARCHAR(20),--学生姓名SubjectVARCHAR(30),--科目ScoreFLOAT--成绩);INSERTINTOStudentScoresSELECT'人民大学......
  • C# 单元测试工具选择
    由于最近在尝试开发桌面应用,技术选用的是WPF,但是开发起来有点卡手,发现原来缺少了测试工具,花了两天,把主要把主要的测试工具尝试了一下。现有的单元测试工具查阅资料,已知在vsstudio上主要为3款,分别是xUnit,NUnit,以及SMTest,三款工具各有优劣。现有问题三款单元测试都存在无法实......