任務詳情
在openEuler(推薦)或Ubuntu或Windows(不推薦)中完成下面任務,參考網內容 和AI要給出詳細過程,否則不得分。使用git管理你的程式碼
- 根據gmt0018標準,如何呼叫介面實現基於SM4的加密解密?(5‘)
- 使用龍脈智慧鑰匙實現SDF介面中的加密解密運算介面,至少支援SM4演算法,把相關函式整合到src中的sdf.c中,補充必要的函式(5')
- 在test中的main.c呼叫進行測試,至少測試計算你的學號姓名的SM4加密解密。(5‘)
- 提交程式碼(或程式碼連結)和執行結果截圖和git log截圖 (5‘)
作業提交要求使用Markdown格式,同時提交Markdown轉化的PDF 或者使用Word
任務0
- 初始化連線
- 選擇演算法,需要呼叫特定的介面
- 準備金鑰
- 加密操作,呼叫加密介面,傳入要加密的資料、金鑰等
- 解密操作,呼叫解密介面,傳入要解密的資料、金鑰等
- 關閉連線
任務1
點選檢視程式碼
#include <stdio.h>
#include <string.h>
#include "sdf.h"
int main() {
// 定義SM4金鑰和明文
uint8_t key[16] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10 };
uint8_t plaintext[16] = "Hello, World!!!";
uint8_t ciphertext[16];
uint8_t decryptedtext[16];
uint32_t len;
// 開啟裝置和會話
DEVICE_HANDLE hDevice = SDF_OpenDevice();
SESSION_HANDLE hSession = SDF_OpenSession(hDevice);
KEY_HANDLE hKey = SDF_ImportKey(hSession, key, sizeof(key));
// 加密
SDF_Encrypt(hSession, hKey, plaintext, sizeof(plaintext), ciphertext, &len);
printf("Ciphertext: ");
for (int i = 0; i < len; i++) {
printf("%02x ", ciphertext[i]);
}
printf("\n");
// 解密
SDF_Decrypt(hSession, hKey, ciphertext, len, decryptedtext, &len);
printf("Decrypted text: %s\n", decryptedtext);
// 銷燬金鑰和關閉會話、裝置
SDF_DestroyKey(hSession, hKey);
SDF_CloseSession(hSession);
SDF_CloseDevice(hDevice);
return 0;
}
任務2
點選檢視程式碼
#include "sdf.h"
#include <string.h>
#include <openssl/sm4.h>
typedef struct {
SM4_KEY sm4Key;
} KEY_CONTEXT;
DEVICE_HANDLE SDF_OpenDevice() {
// 模擬裝置控制代碼
return (DEVICE_HANDLE)1;
}
int SDF_CloseDevice(DEVICE_HANDLE hDevice) {
// 關閉裝置
return 0;
}
SESSION_HANDLE SDF_OpenSession(DEVICE_HANDLE hDevice) {
// 模擬會話控制代碼
return (SESSION_HANDLE)1;
}
int SDF_CloseSession(SESSION_HANDLE hSession) {
// 關閉會話
return 0;
}
KEY_HANDLE SDF_ImportKey(SESSION_HANDLE hSession, const uint8_t* key, uint32_t
keyLen) {
if (keyLen != 16) {
return NULL;
}
KEY_CONTEXT* keyCtx = (KEY_CONTEXT*)malloc(sizeof(KEY_CONTEXT));
if (keyCtx == NULL) {
return NULL;
}
SM4_set_key(key, &(keyCtx->sm4Key));
return (KEY_HANDLE)keyCtx;
}
int SDF_DestroyKey(SESSION_HANDLE hSession, KEY_HANDLE hKey) {
free(hKey);
return 0;
}
int SDF_Encrypt(SESSION_HANDLE hSession, KEY_HANDLE hKey, const uint8_t*
plaintext, uint32_t plaintextLen, uint8_t* ciphertext, uint32_t* ciphertextLen) {
if (plaintextLen % 16 != 0) {
return -1;
}
KEY_CONTEXT* keyCtx = (KEY_CONTEXT*)hKey;
for (uint32_t i = 0; i < plaintextLen; i += 16) {
SM4_encrypt(plaintext + i, ciphertext + i, &(keyCtx->sm4Key));
}
*ciphertextLen = plaintextLen;
return 0;
}
int SDF_Decrypt(SESSION_HANDLE hSession, KEY_HANDLE hKey, const uint8_t*
ciphertext, uint32_t ciphertextLen, uint8_t* plaintext, uint32_t* plaintextLen) {
if (ciphertextLen % 16 != 0) {
return -1;
}
KEY_CONTEXT* keyCtx = (KEY_CONTEXT*)hKey;
for (uint32_t i = 0; i < ciphertextLen; i += 16) {
SM4_decrypt(ciphertext + i, plaintext + i, &(keyCtx->sm4Key));
}
*plaintextLen = ciphertextLen;
return 0;
}