• 加密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

  • 相关阅读:
    xml方式将dataset导出excel
    linux安装Navicat,界面出现乱码解决方法 (转发)
    ERROR 29 (HY000): File '/var/lib/mysql/txtdata/yz2014_1.txt' not found (Errcode: 13 "Permission denied")
    centos7中yum安装ntfs3g(转载)
    MariaDB中my.cnf文件误删除
    Mysql操作命令出现错误时消除/mysql数据导入txt
    Linux查找yum安装软件在系统中路径
    Centos7安装MariaDB安装数据库yum安装数据库远程登录数据库存储路径更改
    Zookeeper常用命令
    Hbase学习连接-数据导入
  • 原文地址:https://www.cnblogs.com/lxy2019/p/16310514.html
Copyright © 2020-2023  润新知