实验一-密码引擎-加密API实现与测试

1 下载并查找GMT 0018-2012密码设备应用接口规范原始文档进行学习 (5分)
2 实现GMT 0018-2012密码设备应用接口规范的接口函数,至少实现:
1)设备管理中的打开设备,关闭设备,获取设备信息,产生随机数(4分)
2)密钥管理导出 ECC 签名公钥;SDF_ExportSignPublicKey_ECC I.导出 ECC加密公钥∶SDF_ExportEncPublicKey_ECC J. 产生 ECC非对称密钥对并输出∶SDF_GenerateKeyPair_ECC
K. (6分)
3)非对称算法(至少支持SM2):外部密钥 ECC验证∶SDF_ExternalVerify_ECC ,内部密钥 ECC签名;SDF_InternalSign_ECC ,内部密钥 ECC验证∶SDF_InternalVerify_ECC 外部密钥 ECC加密∶SDF_ExternalEncrypt_ECC
(8分)
4)对称算法(至少支持SM4)∶SDF_Encrypt 对称解密∶SDF_Dccrypt 计算 MAC∶SDF_CalculateMAC(6分)
5)杂凑算法(至少支持SM3):· 杂凑运算初始化∶SDF_HashInit· 多包杂凑运算∶SDF_HashUpdate· 杂凑运算结束∶SDF_HashFinal(6分)

密钥管理要求(10分)
基于本标准设计、开发的密码设备在密钥管理方面,应满足以下要求; 1)设备密钥的使用不对应用系统开放; 2) 密钥必须用安全的方法产生并存储;
3) 在任何时间、任何情况下,除公钥外的密钥均不能以明文形式出现在密码设备外; 4) 密码设备内部存储的密钥应具备有效的密钥保护机制,防止解剖、探测和非法读取; 5) 密码设备内部存储的密钥应具备权限控制机制,防止非法使用和导出。

设备状态要求(5分)
基于本标准设计、开发的密码设备在设备状态方面,应满足以下要求; 1) 密码设备应具有初始和就绪两个状态;
2) 未安装设备密钥的密码设备应处干初始状态,已安装设备密钥的密码设备应处于就绪状态; 3) 在初始状态下,除可读取设备信息、设备密钥的生成或恢复操作外,不能执行任何操作,生成或恢复设备密钥后,密码设备处于就绪状态;
4) 在就绪状态下,除设备密钥的生成或恢复操作外,应能执行任何操作; 5) 在就绪状态下进行的密钥操作,设备操作员应经过密码设备的认证。

GM/T 0018-2012
设备管理
/*
功能:打开密码设备。返回设备句柄
参数:phDeviceHandle[out]
返回值:0 成功; 非0 失败,返回错误码
*/
int SDF_OpenDevice(void ** phDeviceHandle);

/*
功能:关闭密码设备,并释放相关资源
参数:hDeviceHandle[in] 已打开的设备句柄
返回值:0 成功; 非0 失败,返回错误代码
*/
int SDF_CloseDevice(void ** hDeviceHandle);

/*
功能:获取设备信息
参数:hSessionHandle[in] 与设备建立的会话句柄
pstDevcenfo [our] 设备能力描述信息,内容及格式见设备信息定义成功
返回值∶0 成功;非0 失败,返回错误代码
*/
int SDF_GeitDevicelnfo(void * hSesionHandle,DEVICEINFO * pstDevicelnfo);

/*

功能:获取指定长度的随机数
参数:hSessionHandle[in] 与设备建立的会话句柄

       uiLength[in] 欲获取的随机数长度

       pucRandom[out] 缓冲区指针,用于存放获取的随机数

返回值:0 成功;非0 失败,返回错误代码

int SDF_GetDeviceInfo(void * hSessionHandle, DEVICEINFO * pstDeviceInfo);

*/

密钥管理类函数
/*

功能:导出密码设备内部存储的指定索引位置的签名公钥

参数:hSessionHandle[in] 与设备建立的会话句柄

       uiKeyIndex[in]  密码设备存储的ECC密钥对索引

       pucPublicKey[out]  ECC公钥结构

返回值:0 成功;非0 失败,返回错误代码

int SDF_ExportSignPublicKey_ECC(void * hSessionHandle, unsigned int uiKeyIndex, ECCrefPublicKey * pucPublicKey);

*/

/*

功能:导出密码设备内部存储的指定索引位置的加密公钥

参数:hSessionHandle[in] 与设备建立的会话句柄

       uiKeyIndex[in]  密码设备存储的ECC密钥对索引

       pucPublicKey[out]  ECC公钥结构

返回值:0 成功;非0 失败,返回错误代码

int SDF_ExportEncPublicKey_ECC(void * hSessionHandle, unsigned int uiKeyIndex, ECCrefPublicKey * pucPublicKey);

*/

/*

功能:请求密码设备产生指定类型和模长的ECC密钥对

参数:hSessionHandle[in] 与设备建立的会话句柄

       uiAlgID[in]  指定算法标识

       uiKeyBits[in]  指定密钥长度

       pucPublicKey  ECC公钥结构

       pucPrivateKey  ECC私钥结构

返回值:0 成功;非0 失败,返回错误代码

int SDF_GenerateKeyPair_ECC(void * hSessionHandle, unsigned int uiAlgID, unsigned int uiKeyBits, ECCrefPublicKey * pucPublicKey, ECCrefPrivateKey * pucPrivateKey);

*/

非对称算法
/*

功能:使用外部ECC公钥对ECC签名值进行验证运算

参数:hSessionHandle[in] 与设备建立的会话句柄

       uiAlgID[in]  算法标识,指定使用的ECC算法

       pucPublicKey[in]  外部ECC公钥结构

       pucDataInput[in]  缓冲区指针,用于存放外部输入的数据

       uiInputLength[in]  输入的数据长度

       pucSignatre[in]  缓冲区指针,用于存放输入的签名值数据

返回值:0 成功;非0 失败,返回错误代码

int SDF_ExternalVerify_ECC(void * hSessionHandle, unsigned int uiAlgID, ECCrefPublicKey * pucPublicKey, unsigned char * pucDataInput, unsigned int uiInputLength, ECCSignature * pucSignatre);

*/

/*

功能:使用内部ECC私钥对数据进行签名运算

参数:hSessionHandle[in] 与设备建立的会话句柄

       uiISKIndex[in]  密码设备内部存储的ECC签名私钥的索引值

       pucData[in]  缓冲区指针,用于存放外部输入的数据

       uiDataLength[in]  输入的数据长度

       pucSignature[in]  缓冲区指针,用于存放输入的签名值数据

返回值:0 成功;非0 失败,返回错误代码

int SDF_InternalSign_ECC(void * hSessionHandle, unsigned int uiISKIndex, unsigned char * pucData, unsigned int uiDataLength, ECCSignature * pucSignature);

*/

/*

功能:使用内部ECC公钥对ECC签名值进行验证运算

参数:hSessionHandle[in] 与设备建立的会话句柄

       uiISKIndex[in]  密码设备内部存储的ECC签名公钥的索引值

       pucData[in]  缓冲区指针,用于存放外部输入的数据

       uiDataLength[in]  输入的数据长度

       pucSignature[in]  缓冲区指针,用于存放输入的签名值数据

返回值:0 成功;非0 失败,返回错误代码

int SDF_InternalVerify_ECC(void * hSessionHandle, unsigned int uiISKIndex, unsigned char * pucData, unsigned int uiDataLength, ECCSignature * pucSignature);

*/

/*

功能:使用外部ECC公钥对数据进行加密运算

参数:hSessionHandle[in] 与设备建立的会话句柄

       uiAlgID[in]  算法标识,指定使用的ECC算法

       pucPublicKey[in]  外部ECC公钥结构

       pucData[in]  缓冲区指针,用于存放外部输入的数据

       uiDataLength[in]  输入的数据长度

       pucEncData[out]  缓冲区指针,用于存放输出的数据密文

返回值:0 成功;非0 失败,返回错误代码

int SDF_ExternalEncrypt_ECC(void * hSessionHandle, unsigned int uiAlgID, ECCrefPublicKey * pucPublicKey, unsigned char * pucData, unsigned int uiDataLength, ECCCipher * pucEncData);

*/

上一篇:python机器学习(四)分类算法-决策树


下一篇:浅析椭圆曲线加密算法(ECC)