加密API实现与测试

加密API实现与测试

1 接口文档学习

  • 基础密码服务包括密钥生成、单一的密码运算、文件管理等服务。
  • 本标准采用C语言描述接口函数,无特别说明时,函数中参数的长度单位均为字节数。

设备管理类函数

  1. 打开设备:SDF_OpenDevice
  2. 关闭设备:SDF_CloseDevice
  3. 创建会话:SDF_OpenSession
  4. 关闭会话:SDF_CloseSession
  5. 获取设备信息:SDF_GetDeviceInfo
  6. 产生随机数:SDF_GenerateRandom
  7. 获取私钥使用权限:SDF_GetPrivateKeyAccessRight
  8. 释放私钥使用权限:SDF_ReleasePrivateKeyAccessRight

密钥管理类函数

  1. 导出 RSA 签名公钥:SDF_ExportSignPublicKey_RSA
  2. 导出 RSA 加密公钥:SDF_ExportEncPublicKey_RSA
  3. 产生RSA非对称密钥对并输出:SDF_GenerateKeyPair_RSA
  4. 生成会话密钥并用内部RSA公钥加密输出:SDF_GenerateKeyWithIPK_RSA
  5. 生成会话密钥并用外部RSA公钥加密输出:SDF_GenerateKeyWithEPK_RSA
  6. 导人会话密钥并用内部RSA私钥解密:SDF_ImportKeyWithISK_RSA
  7. 基于 RSA 算法的数宇信封转换:SDF_ExchangeDigitEnvelopeBaseOnRSA
  8. 导出 ECC 签名公钥:SDF_ExportSignPublicKey_ECC
  9. 导出 ECC 加密公钥:SDF_ExportEncPublicKey_ECC
  10. 产生ECC非对称密钥对并输出:SDF_GenerateKeyPair_ECC
  11. 生成会话密钥并用内部ECC公钥加密输岀:SDF_GenerateKeyWithIPK_ECC
  12. 生成会话密钥并用外部ECC公钥加密输出:SDF_GenerateKeyWithEPK_ECC
  13. 导入会话密钥并用内部ECC私钥解密:SDFJmportKeyWithlSKJECC
  14. 生成密钥协商参数并输出:SDF_GenerateAgreementDataWithECC
  15. 计算会话密钥:SDF_GenerateKey WithECC
  16. 产生协商数据并计算会话密钥:SDF_GenerateAgreementDataAndKeyWithECC
  17. 基于 ECC算法的数字信封转换:SDF_ExchangeDigitEnvelopeBaseOnECC
  18. 生成会话密钥并用密钥加密密钥加密输出: SDF_GenerateKeyWithKEK
  19. 导入会话密钥并用密钥加密密钥解密:SDF_ImportKeyWithKEK
  20. 销毁会话密钥:SDF_DestroyKey

非对称算法运算类函数

  1. 外部公钥 RSA 运算:SDF_ExternalPublicKeyOperation_RSA
  2. 内部公钥 RSA 运算:SDF_InternalPublicKeyOperation_RSA
  3. 内部私钥 RSA 运算:SDF_InternalPrivateKeyOperation_RSA
  4. 外部密钥 ECC 验证:SDF_ExternalVerify_ECC
  5. 内部密钥 ECC 签名:SDF_InternalSign_ECC
  6. 内部密钥 ECC 验证:SDF_InternalVerify_ECC
  7. 外部密钥 ECC 加密:SDF_ExternalEncrypt_ECC

对称算法运算类函数

  1. 对称加密:SDF_Encrypt
  2. 对称解密:SDF_Decrypt
  3. 计算MAC:SDF_CalculateMAC

杂凑运算类函数

  1. 杂凑运算初始化:SDF_HashInit
  2. 多包杂凑运算:SDF_HashUpdate
  3. 杂凑运算结束:SDF_HashFinal

2 安全要求

  1. 基于本标准设计、开发的密码设备在密钥管理方面,应满足以下要求:
    • 设备密钥的使用不对应用系统开放;
    • 密钥必须用安全的方法产生并存储;
      在任何时间、任何情况下,除公钥外的密钥均不能以明文形式出现在密码设备外;
    • 密码设备内部存储的密钥应具备有效的密钥保护机制,防止解剖、探测和非法读取;
    • 密码设备内部存储的密钥应具备权限控制机制,防止非法使用和导出。
  2. 密码服务要求:
    • 使用的密码算法应得到国家密码主管部门的批准;
    • 使用国家密码主管部门认可的密码算法芯片;
    • 本标准所列的所有接口函数均应能被应用系统任意调用。
  3. 设备状态要求:
    • 密码设备应具有初始和就绪两个状态;
    • 未安装设备密钥的密码设备应处于初始状态,已安装设备密钥的密码设备应处于就绪状态;
    • 在初始状态下,除可读取设备信息、设备密钥的生成或恢复操作外,不能执行任何操作,生成或恢复设备密钥后,密码设备处于就绪状态;
    • 在就绪状态下,除设备密钥的生成或恢复操作外,应能执行任何操作;
    • 在就绪状态下进行的密钥操作,设备操作员应经过密码设备的认证。
  4. 其他要求:
    密码设备应有安全机制和措施,保证密钥在生成、安装、导入、存储、备份.恢复及销毁整个生存期间的安全,此安全机制可由设备厂商自行设计实现。

3 实现与测试

代码链接

3.1 实现GMT 0018-2012密码设备应用接口规范的接口函数

  • 设备管理中的打开设备,关闭设备,获取设备信息,产生随机数

    #ifndef__SDF_H
    #define sDG_ H
    typedef struct DeviceInfo_st
    {
    unsigned char IssuerName [40]; //设备生产厂商名称
    unsigned char DeviceName [16];
    unsigned char Deviceserial[16];
    unsigned int Deviceversion ;
    unsigned int standardversion ;
    unsigned int As ymAlgAbility[2];
    unsigned int symAlgAbility;
    unsigned int HashAlgAbility;
    unsigned int Buffersize;
    }DEVICEINFO;
    
  • 密钥管理导出 ECC 签名公钥;SDF_ExportSignPublicKey_ECC I.导出 ECC加密公钥∶SDF_ExportEncPublicKey_ECC J. 产生 ECC非对称密钥对并输出∶SDF_GenerateKeyPair_ECC
K.

    // Ecc密钥数据结构定义
    #define Eccref_MAX_BITS 512
    #define Eccref_MAX_LEN((Eccref_MAX_BITS + 7)/ 8)
    typedef struct ECCrefPublickey_st
    {
    unsigned int bits ;
    unsigned char x[ECcref_MAX_LEN];
    unsigned char y [Eccref_MAX_LEN];
    }ECcrefPublickey ;
    
    typedef struct EcCrefPrivatekey_st
    {
    unsigned int bits;
    unsigned char K[ECCref_MAX_LEN];
    }ECCrefPrivatekey ;
    // Ecc加密数据结构定义
    
    typedef struct Ecccipher_st
    {
    unsigned char x[ECCref_MAX_IEN];
    unsigned char y[ECCref_MAX_LEN];
    unsigned char M[32];
    unsigned int L;
    unsigned char C[1];
    }Eccipher;
    
    // Ecc签名数据结构定义
    typedef struct ECcsignature_st
    {
    unsigned char r[EcCref_MAX_LEN];
    unsigned char s[EcCref_MAX_LEN];
    }Eccsignature;
    
    
  • 非对称算法(至少支持SM2):外部密钥 ECC验证∶SDF_ExternalVerify_ECC ,内部密钥 ECC签名;SDF_InternalSign_ECC ,内部密钥 ECC验证∶SDF_InternalVerify_ECC 外部密钥 ECC加密∶SDF_ExternalEncrypt_ECC

    typedef struct SDF_ENVELOPEDKEYBLOB
    {
    unsigned long ulAsymmAlgID;
    unsigned long ulsymmAlgID;
    ECCCIPHERBLOB ECccipherBlob;
    ECCPUBLICKEYBLOB PubKey;
    unsigned char cbEncryptedPriKey [64];
    }ENVELOPEDKEYBLOB,*PENVELOPEDKEYBLOB;
    
    #define SDR_OK 0x0 /l操作成功
    
    
  • 对称算法(至少支持SM4)∶SDF_Encrypt 对称解密∶SDF_Dccrypt 计算 MAC∶SDF_CalculateMAC(6分)

    /*此函数不对数据进行填充处理,输入的数据必须是指定算法分组长度的整数倍*/
    int SDF_Encrypt (
    void *hsessionHandle,
    void *hKeyHandle,
    unsigned int uiAlglD,
    unsigned char *puclv,
    unsigned char *pucData,
    
  • 杂凑算法(至少支持SM3):· 杂凑运算初始化∶SDF_HashInit· 多包杂凑运算∶SDF_HashUpdate· 杂凑运算结束∶SDF_HashFinal

    int SDF_HashInit(
    void *hsessionHandle,
    unsigned int uiAlgID,
    EccrefPublicKey *pucPublicKey,
    unsigned char *puclD,
    unsigned int uilDLength);
    

代码运行截图:

image-20220505211238032

image-20220505213040738

image-20220525193353129

3.2 密钥管理要求

int SDF_ReadFile (
void *hsessionHandle,
unsigned char *pucFileName,
unsigned int uiNameLen, 
unsigned int uioffset,
unsigned int *puiFileLength ,
unsigned char *puCBuffer);

image

posted @ 2022-05-25 19:35  PuTa0  阅读(148)  评论(0编辑  收藏  举报