实验二-密码引擎-3-sdf接口

[实验二-密码引擎-3-sdf接口]

两人一组完成下面任务

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

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

  • 代码接口:通常指软件编程中用于不同模块或组件之间交互的约定和规范。它定义了一组方法、函数、属性等,使得其他代码可以通过这些接口来调用或访问特定的功能或数据。代码接口的主要目的是实现代码的解耦和复用,提高软件的可维护性和可扩展性。
    特点:
    1)数据交互:代码接口主要处理数据的输入和输出,确保数据在不同模块之间的传递是准确和一致的。
    2)调用方式:代码接口定义了函数、方法或类等的调用方式,包括参数列表、返回值类型和可能的异常处理等。
    3)模块化:通过定义代码接口,可以将复杂的软件系统拆分成多个独立的模块,每个模块负责特定的功能,降低系统的复杂性。
    4)可扩展性:代码接口使得新功能的添加或现有功能的修改更加容易,因为只需要修改或扩展接口的实现,而不需要修改其他模块的代码。
  • 智能钥匙的接口:智能密码钥匙密码应用接口位于智能密码钥匙应用程序与设备之间(将智能密码钥匙统称为设备)
    特点:
    1)通信协议:智能钥匙接口基于特定的通信协议(如蓝牙、RFID等)实现与车辆或其他设备的通信。
    2)功能实现:智能钥匙接口提供了一系列功能,如解锁车门、启动发动机、设置警报等,以满足用户对车辆安全和便捷性的需求。
    3)安全性:智能钥匙接口需要保证通信的安全性,防止非法访问和恶意攻击。因此,它通常采用加密技术来保护数据的传输和存储。
    4)用户体验:智能钥匙接口的设计需要考虑到用户的使用习惯和体验,确保操作的便捷性和直观性。
  • 异同点:
    1.相似点:
    1)数据交互: 两者都涉及数据的输入和输出,确保数据在不同模块之间的传递是准确和一致的。
    2)调用方式: 无论是代码接口还是智能钥匙接口,都定义了特定功能的调用方式,包括参数列表、返回值类型和可能的异常处理等。
    3)模块化: 两者都支持系统模块化的设计。通过定义接口,可以将系统拆分成多个独立的模块,降低系统的复杂性,提高可维护性和可扩展性。
    2.不同点:
    1)应用领域: 代码接口通常用于软件系统内部不同模块之间的交互,而智能钥匙接口是用于智能密码钥匙应用程序与设备(如车辆)之间的通信。
    2)通信协议: 智能钥匙接口基于特定的通信协议(如蓝牙、RFID等)实现与设备的通信,而代码接口可以采用各种通信方式,如函数调用、网络通信等。
    3)功能实现: 智能钥匙接口提供了一系列特定于智能密码钥匙功能的操作,如解锁车门、启动发动机等;而代码接口则更加通用,可以涵盖各种功能和操作,具体取决于软件系统的需求。
    4)安全性: 智能钥匙接口需要更加强调通信的安全性,因为涉及到与车辆等设备的通信,需要防止非法访问和恶意攻击。而代码接口的安全性要求相对较低,通常不涉及对外部设备的直接操作。
    5)用户体验: 智能钥匙接口的设计需要更加关注用户体验,因为智能密码钥匙是用户与车辆之间的主要交互方式之一,需要考虑用户的使用习惯和直观性。而代码接口则更多地关注于系统内部的功能实现,对用户体验的影响相对较小。

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

2.修改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] ="2021110720211102";
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 = "20211107renjiaxuan20211102yinziyang";
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]="20211107rjx20211102yzy";
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 @ 2024-04-17 14:42  尹子扬  阅读(111)  评论(0编辑  收藏  举报