任务详情
两人一组完成下面任务
- 分析代码接口和智能钥匙的接口的异同
- 编译运行附件中代码,提交运行结果截图
- 修改test.c完成包含小组内成员的学号姓名的文件的sm3 hash运算,sm4加密解密,提交代码和运行结果截图。
- 完成完成包含小组内成员的学号姓名的文件的签名验签名,提交代码和运行结果截图。
一、代码接口
代码接口通常指的是在软件开发中,不同模块或组件之间进行交互的约定和规范。它定义了数据的输入和输出格式、调用方式以及预期的行为。代码接口的主要目的是实现软件的模块化、可重用性和可扩展性。
特点:
数据交互:代码接口主要处理数据的输入和输出,确保数据在不同模块之间的传递是准确和一致的。
调用方式:代码接口定义了函数、方法或类等的调用方式,包括参数列表、返回值类型和可能的异常处理等。
模块化:通过定义代码接口,可以将复杂的软件系统拆分成多个独立的模块,每个模块负责特定的功能,降低系统的复杂性。
可扩展性:代码接口使得新功能的添加或现有功能的修改更加容易,因为只需要修改或扩展接口的实现,而不需要修改其他模块的代码。
二、智能钥匙接口
智能钥匙接口通常指的是智能钥匙与车辆或其他设备之间进行通信和交互的接口。它允许用户通过智能钥匙实现远程解锁、启动车辆、设置安全警报等功能。
特点:
通信协议:智能钥匙接口基于特定的通信协议(如蓝牙、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;
}
标签:rv,pucData,OK,SDR,接口,sdf,20211314,SGD
From: https://www.cnblogs.com/bestiwyd/p/18135651