20211314實驗二-密碼引擎-3-sdf介面

20211314王艺达發表於2024-04-15

任務詳情

兩人一組完成下面任務

  1. 分析程式碼介面和智慧鑰匙的介面的異同
  2. 編譯執行附件中程式碼,提交執行結果截圖
  3. 修改test.c完成包含小組內成員的學號姓名的檔案的sm3 hash運算,sm4加密解密,提交程式碼和執行結果截圖。
  4. 完成完成包含小組內成員的學號姓名的檔案的簽名驗簽名,提交程式碼和執行結果截圖。

一、程式碼介面

程式碼介面通常指的是在軟體開發中,不同模組或元件之間進行互動的約定和規範。它定義了資料的輸入和輸出格式、呼叫方式以及預期的行為。程式碼介面的主要目的是實現軟體的模組化、可重用性和可擴充套件性。

特點:

資料互動:程式碼介面主要處理資料的輸入和輸出,確保資料在不同模組之間的傳遞是準確和一致的。
呼叫方式:程式碼介面定義了函式、方法或類等的呼叫方式,包括引數列表、返回值型別和可能的異常處理等。
模組化:透過定義程式碼介面,可以將複雜的軟體系統拆分成多個獨立的模組,每個模組負責特定的功能,降低系統的複雜性。
可擴充套件性:程式碼介面使得新功能的新增或現有功能的修改更加容易,因為只需要修改或擴充套件介面的實現,而不需要修改其他模組的程式碼。

二、智慧鑰匙介面

智慧鑰匙介面通常指的是智慧鑰匙與車輛或其他裝置之間進行通訊和互動的介面。它允許使用者透過智慧鑰匙實現遠端解鎖、啟動車輛、設定安全警報等功能。

特點:

通訊協議:智慧鑰匙介面基於特定的通訊協議(如藍芽、RFID等)實現與車輛或其他裝置的通訊。
功能實現:智慧鑰匙介面提供了一系列功能,如解鎖車門、啟動發動機、設定警報等,以滿足使用者對車輛安全和便捷性的需求。
安全性:智慧鑰匙介面需要保證通訊的安全性,防止非法訪問和惡意攻擊。因此,它通常採用加密技術來保護資料的傳輸和儲存。
使用者體驗:智慧鑰匙介面的設計需要考慮到使用者的使用習慣和體驗,確保操作的便捷性和直觀性。
異同點分析:

相同點:

兩者都是介面,用於實現不同實體之間的互動和通訊。
在設計和實現過程中,都需要考慮資料的準確性、安全性和可靠性。
不同點:

目的和功能:程式碼介面主要用於實現軟體的模組化、可重用性和可擴充套件性;而智慧鑰匙介面則主要用於實現車輛的安全和便捷性控制。
使用場景:程式碼介面廣泛應用於軟體開發領域;而智慧鑰匙介面則主要應用於汽車、智慧家居等物聯網領域。
實現方式:程式碼介面通常透過程式語言和資料結構來實現;而智慧鑰匙介面則依賴於特定的通訊協議和硬體裝置來實現。

在本專案初期,團隊成員透過學習國密標準,明白國密標準下的c語言的編寫規範,本次我們主要研究
《智慧密碼鑰匙密碼應用介面規範》(GM/T 0016-2012)和《密碼裝置應用介面規範》(GM/T 0018-
2012)這兩個國密標準的實現與相互轉換。
在0016標準中,其密碼應用介面位於智慧密碼鑰匙應用程式與裝置之間。
並且在一個裝置中存在裝置認證和多個應用,應用之間相互獨立。


即在使用中密碼裝置需要開啟不同的應用會話來完成不同功能的實現。
而在0018標準中,並沒有為密碼裝置設定多個應用,使用只需開啟裝置並且開啟一個會話即可。
在公鑰密碼基礎設施應用技術體系框架中,密碼裝置服務層由密碼機、密碼卡、智慧密碼終端等裝置組
成,透過0018標準規定的密碼裝置應用介面向通用密碼服務層提供基礎密碼服務。

在0018和0016標準中,均有國密演算法加密解密的實現函式和證書的驗籤。但在深入學習之下,發現0016
標準內容更加詳細,包含了裝置的訪問控制的模組,其中包含裝置認證,PIN的修改、校驗、解鎖,和對
於各種不同應用容器的管理模組,其中包含容器的建立、刪除、列舉、開啟、關閉等。

編譯執行附件中程式碼,提交執行結果截圖

修改test.c完成包含小組內成員的學號姓名的檔案的sm3 hash運算,sm4加密解密

sm3

SGD_RV SGD_SM3Hash(SGD_HANDLE phSessionHandle)
{
SGD_RV rv = SDR_OK;
ECCrefPublicKey phPubKey;
memcpy(phPubKey.x,pubKey,32);
memcpy(phPubKey.y,pubKey+32,32);
SGD_UCHAR pucID[16] =
{0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
0x08};
SGD_UINT32 uiIDLen = 16;
SGD_UINT8 pucData[16] ="20211314";
SGD_UINT32 uiPucDateLen = 16;
printf("pucData = %s\n",pucData);
//rv = SDF_HashInit(phSessionHandle,SGD_SM3,&phPubKey,pucID,uiIDLen);
rv = SDF_HashInit(phSessionHandle,SGD_SM3,NULL,NULL,0);
if(SDR_OK != rv)
{
return rv;
}
rv = SDF_HashUpdate(phSessionHandle,pucData,uiPucDateLen);
if(SDR_OK != rv)
{
return rv;
}
uiPucDateLen =32;
rv = SDF_HashFinal(phSessionHandle,sm3HashData,&uiPucDateLen);
printf("sm3HashData = %s\n",sm3HashData);
if(SDR_OK != rv)
{
return rv;
}
return SDR_OK;
}

sm4加解密

SGD_RV SM4_ENC_DEC_ECB(SGD_HANDLE phSessionHandle,SGD_HANDLE phKeyHandle)
{
SGD_RV rv = SDR_OK;
int loop = LOOP, i = 0;
SGD_UCHAR pucIV[16] ={0};
memset(pucIV, 1, 16);
SGD_UCHAR *pucData = (SGD_UCHAR*)malloc(loop * MAX);
SGD_UINT32 uiDataLength = 32;
SGD_UCHAR *pucEncData = (SGD_UCHAR*)malloc(loop * MAX);
SGD_UINT32 puiEncDataLength = loop * MAX;
SGD_UCHAR pucKey[16];
memset(pucKey,2,16);
int count = loop;
pucData = "20211314wangyida20211314wangyida";
printf("pucData = %s\n", pucData);
rv = SDF_Encrypt( phSessionHandle,pucKey, SGD_SM4_ECB,pucIV, pucData,
uiDataLength, pucEncData, &puiEncDataLength);
if(SDR_OK != rv)
{
printf("erro\n");
free(pucData);
free(pucEncData);
return rv;
}
printf("pucEncData = %s\n", pucEncData);
SGD_UCHAR *pucTmpData = (SGD_UCHAR*)malloc(loop * MAX);
memset(pucIV,1,16);
rv = SDF_Decrypt(phSessionHandle,pucKey, SGD_SM4_ECB, pucIV, pucEncData,
32, pucTmpData, &puiEncDataLength);
if(SDR_OK != rv)
{
free(pucData);
free(pucEncData);
free(pucTmpData);
return rv;
}
printf("pucTmpData = %s\n", pucTmpData);
if(memcmp(pucData,pucTmpData,32))
{
free(pucData);
free(pucEncData);
free(pucTmpData);
printf("memcmp diff\n");
return -1;
}
free(pucData);
free(pucEncData);
free(pucTmpData);
return SDR_OK;
}

完成完成包含小組內成員的學號姓名的檔案的簽名驗簽名

SGD_RV SM2SignVer(SGD_HANDLE phSessionHandle)
{
SGD_RV rv = SDR_OK;
#define COUNT 100
ECCSignature Signature ;
int i = 0;
SGD_UINT8 Data[32]="20211314202113142021131420211314";
printf("\n\nsm2簽名驗籤:\n");
printf("date = %s\n" ,Data);
rv = SDF_InternalSign_ECC(phSessionHandle,1,Data,32,&Signature);
if(SDR_OK != rv)
{
printf("SDF_InternalSign_ECC failed rv = 0x%08x\n", rv);
return rv;
}
rv = SDF_InternalVerify_ECC(phSessionHandle,1,Data,32,&Signature);
if(SDR_OK != rv)
{
printf("SDF_InternalVerify_ECC failed rv = 0x%08x\n", rv);
return rv;
}
printf("Sign、Verify success!\n");
return SDR_OK;
}

相關文章