sdf 測試-2-龍脈智慧鑰匙

20211316郭佳昊發表於2024-05-23

任務詳情

在openEuler(推薦)或Ubuntu或Windows(不推薦)中完成下面任務,參考網內容 和AI要給出詳細過程,否則不得分。使用git管理你的程式碼

  1. 根據gmt0018標準,如何呼叫介面實現基於SM4的加密解密?(5‘)
  2. 使用龍脈智慧鑰匙實現SDF介面中的加密解密運算介面,至少支援SM4演算法,把相關函式整合到src中的sdf.c中,補充必要的函式(5')
  3. 在test中的main.c呼叫進行測試,至少測試計算你的學號姓名的SM4加密解密。(5‘)
  4. 提交程式碼(或程式碼連結)和執行結果截圖和git log截圖 (5‘)

作業提交要求使用Markdown格式,同時提交Markdown轉化的PDF 或者使用Word

任務0

  1. 初始化連線
  2. 選擇演算法,需要呼叫特定的介面
  3. 準備金鑰
  4. 加密操作,呼叫加密介面,傳入要加密的資料、金鑰等
  5. 解密操作,呼叫解密介面,傳入要解密的資料、金鑰等
  6. 關閉連線

任務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; 
} 

相關文章