20211128李杰—实验二-密码引擎-3-sdf接口

任务详情

两人一组完成下面任务

  1. 分析代码接口和智能钥匙的接口的异同
  2. 编译运行附件中代码,提交运行结果截图
  3. 修改test.c完成包含小组内成员的学号姓名的文件的sm3 hash运算,sm4加密解密,提交代码和运行结果截图。
  4. 完成完成包含小组内成员的学号姓名的文件的签名验签名,提交代码和运行结果截图。

0、分析代码接口和智能钥匙的接口的异同

代码接口和智能钥匙的接口在设计和功能上有显著的异同。以下是对这两种接口的分析:
1、代码接口:
       代码接口通常指的是软件编程中用于不同模块或组件之间交互的约定和规范。它定义了一组方法、函数、属性等,使得其他代码可以通过这些接口来调用或访问特定的功能或数据。代码接口的主要目的是实现代码的解耦和复用,提高软件的可维护性和可扩展性。
2、智能钥匙的接口:
     智能钥匙的接口则是指智能钥匙与车辆或其他设备之间的通信接口。这种接口通常用于实现无钥匙进入、启动车辆、远程控制等功能。智能钥匙的接口可能采用无线通信技术,如RFID(射频识别)或蓝牙,以实现与车辆的无线连接和数据传输。
3、异同分析:
      通讯方式:代码接口通常基于编程语言或框架的规范进行通信,而智能钥匙的接口则依赖于无线通信技术实现设备间的连接和数据交换。
      应用场景:代码接口主要应用于软件开发领域,用于实现软件模块之间的交互;而智能钥匙的接口则应用于汽车、智能家居等领域,实现便捷的安全访问和控制功能。
      安全性:智能钥匙的接口在设计时需要特别关注安全性问题,如防止非法复制、防止信号干扰等;而代码接口的安全性则更多地关注于代码的安全性和防止恶意攻击。
      标准化程度:代码接口往往遵循特定的编程规范或标准,以便于不同开发者之间的协作和代码共享;而智能钥匙的接口则可能涉及多种不同的通信协议和技术标准。
总结来说,代码接口和智能钥匙的接口在通讯方式、应用场景、安全性和标准化程度等方面存在显著的差异。它们各自针对不同的需求和场景进行设计,以实现特定的功能和目标。

1 编译运行附件中代码,提交运行结果截图

 

 

 

 

2. 修改test.c完成包含小组内成员的学号姓名的文件的sm3 hash运算,sm4加密解密,提交代码和运行结果截图。

sm3 hash运算

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] ="20211128";
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 = "20211128lijie20211129yangkun";
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;
}

 

 

3. 完成完成包含小组内成员的学号姓名的文件的签名验签名,提交代码和运行结果截图

SGD_RV SM2SignVer(SGD_HANDLE phSessionHandle)
{
SGD_RV rv = SDR_OK;
#define COUNT 100
ECCSignature Signature ;
int i = 0;
SGD_UINT8 Data[32]="20211128202111292021112820211129";
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;
}

 

 

posted on 2024-04-17 15:12  20211128李杰  阅读(55)  评论(0)    收藏  举报