以下是按照 Markdown 格式整理的你所需要的程式碼和操作過程,使用中文描述:
任務詳情
在 openEuler(推薦)、Ubuntu 或 Windows(不推薦)中完成以下任務。參考網內容以及 AI 給出的詳細過程,否則不得分。
0. 根據 gmt0018 標準,如何呼叫介面實現基於 SM3 求你的學號姓名的 SM3 值?
#include "sdf.h"
#include <string.h>
#define BUFFER_SIZE 1024
int main() {
int rv;
unsigned char buffer[BUFFER_SIZE];
unsigned int bufferLen;
unsigned char hash[32]; // SM3雜湊結果為32位元組
// 計算學號和姓名的SM3雜湊值
char *id = "20211215";
char *name = "盧澤";
bufferLen = strlen(id) + strlen(name);
memcpy(buffer, id, strlen(id));
memcpy(buffer + strlen(id), name, strlen(name));
rv = SDF_Hash(
NULL, // hSessionHandle: 會話控制代碼,可以為空
buffer,
bufferLen,
hash
);
if (rv != SDR_OK) {
printf("Failed to calculate SM3 hash: %d\n", rv);
return -1;
}
printf("SM3 hash for %s%s: ", id, name);
for (int i = 0; i < 32; i++) {
printf("%02X", hash[i]);
}
printf("\n");
return 0;
}
1. 使用 OpenSSL 實現 SDF 介面中的 hash 運算介面,至少支援 SM3 演算法,把相關函式整合到 src 中的 sdf.c 檔案中
#include "sdf.h"
#include <string.h>
#include <openssl/evp.h>
int SDF_Hash(
void *hSessionHandle,
unsigned char *pucData,
unsigned int uiDataLength,
unsigned char *pucHash)
{
if (pucData == NULL || uiDataLength == 0 || pucHash == NULL) {
return SDR_INVALID_PARAMETER;
}
const EVP_MD *md;
EVP_MD_CTX *mdctx;
md = EVP_sm3();
mdctx = EVP_MD_CTX_new();
EVP_DigestInit_ex(mdctx, md, NULL);
EVP_DigestUpdate(mdctx, pucData, uiDataLength);
EVP_DigestFinal_ex(mdctx, pucHash, NULL);
EVP_MD_CTX_free(mdctx);
return SDR_OK;
}
3. 在 test 中的 main.c 呼叫進行測試,至少測試計算你的學號(數字),你的學號(字串)的 SM3 值
#include "sdf.h"
#include <stdio.h>
#define BUFFER_SIZE 1024
int main() {
int rv;
unsigned char buffer[BUFFER_SIZE];
unsigned char hash[32]; // SM3雜湊結果為32位元組
// 計算學號(數字)的SM3雜湊值
unsigned int id = 20211215;
rv = SDF_Hash(
NULL, // hSessionHandle: 會話控制代碼,可以為空
(unsigned char *)&id,
sizeof(id),
hash
);
if (rv != SDR_OK) {
printf("Failed to calculate SM3 hash: %d\n", rv);
return -1;
}
printf("SM3 hash for student ID (%u): ", id);
for (int i = 0; i < 32; i++) {
printf("%02X", hash[i]);
}
printf("\n");
// 計算學號(字串)的SM3雜湊值
char *idStr = "20211215";
rv = SDF_Hash(
NULL, // hSessionHandle: 會話控制代碼,可以為空
(unsigned char *)idStr,
strlen(idStr),
hash
);
if (rv != SDR_OK) {
printf("Failed to calculate SM3 hash: %d\n", rv);
return -1;
}
printf("SM3 hash for student ID (string): ");
for (int i = 0; i < 32; i++) {
printf("%02X", hash[i]);
}
printf("\n");
return
0;
}