实验一-密码引擎-加密API研究_20181227李根

实验一-密码引擎-加密API研究

20181227-李根

0 研究学习(包含Crypto API,PKCS#11,GMT 0016-2012,GMT 0018-2012)

1 这些API在编程中的使用方式总结

2 这些API包含的函数的分类,以及它们的异同总结

3 以龙脉GM3000Key为例,调用不同接口的代码(Crypto API,PKCS#11,SKF接口),运行截图,代码链接

一、CryptoAPI

CryptoAPI是一组函数,为了完成数学计算,必须具有密码服务提供者模块(CSP),Microsoft通过捆绑RSA Base Provider在操作系统级提供一个CSP,使用RSA公司的公钥加密算法,更多的CSP可以根据需要增加到应用中。

事实上,CSP有可能与特殊硬件设备(如智能卡)一起来进行数据加密。CryptoAPI接口允许简单的函数调用来加密数据,交换公钥,散列一个消息来建立摘要以及生成数字签名。它还提供高级的管理操作,如从一组可能的CSP中使用一个CSP。此外,CryptoAPI还为许多高级安全性服务提供了基础,包括用于电子商务的SET,用于加密客户机/服务器消息的PCT,用于在各个平台之间来回传递机密数据和密钥的PFX,代码签名等等。

数据加密的流程
  • CryptoAPI使用两种密钥:会话密钥与公共/私人密钥对。

会话密钥使用相同的加密和解密密钥,这种算法较快,但必须保证密钥的安全传递。

公共/私人密钥对使用一个公共密钥和一个私人密钥,私人密钥只有专人才能使用,公共密钥可以广泛传播。如果密钥对中的一个用于加密,另一个一定用于解密。公共/私人密钥对算法很慢,一般只用于加密小批数据,例如用于加密会话密钥。

  • CryptoAPI支持两种基本的编码方法:流式编码和块编码。

流式编码在明码文本的每一位上创建编码位,速度较快,但安全性较低。

块编码在一个完整的块上(一般为64位)工作,需要使用填充的方法对要编码的数据进行舍入,以组成多个完整的块。这种算法速度较慢,但更安全。

  • 功能:为应用程序开发者提供在Win32环境下使用加密、验证等安全服务时的标准加密接口。CryptoAPI处于应用程序和CSP(cryptographic service provider)之间。

  • CryptoAPI共有五部分组成:简单消息函数(Simplified Message Functions)、低层消息函数(Low-level Message Functions)、基本加密函数(Base Cryptographic Functions)、证书编解码函数(Certificate Encode/Decode Functions)和证书库管理函数(Certificate Store Functions)。其中前三者可用于对敏感信息进行加密或签名处理,可保证网络传输信心的私有性;后两者通过对证书的使用,可保证网络信息交流中的认证性。

  • 基本加密函数:为开发加密应用程序提供了足够灵活的空间。所有CSP 的通讯都是通过这些函数。
    image

  • 编码/解码函数:用来对证书、证书撤销列表、证书请求和证书扩展进行编码和解码。
    image

  • 证书和证书库函数:这组函数管理、使用和取得证书、证书撤销列表和证书信任列表。
    image

  • 低级消息函数:
    image

  • 简化消息函数:
    image

  1. CSP:真正实行加密的独立模块,既可以由软件实现也可以由硬件实现。但是他必须符合CryptoAPI接口的规范。
    image
  2. 创建密钥容器,得到CSP句柄
    每一个CSP都有一个名字和一个类型,并且名字保证唯一。所以可以通过名字和类型得到一个CSP。然而,要想加密肯定需要密钥,密钥放在密钥容器。密钥容器并不是一开始就存在的,需要用户去创建。下面是创建容器的代码:
    if(CryptAcquireContext(
    &hCryptProv, // 返回CSP句柄
    UserName, // 密码容器名
    NULL, // NULL时使用默认CSP名(微软RSA Base Provider)
    PROV_RSA_FULL, // CSP类型
    0)) // Flag values
    {
    //以UserName为名的密钥容器存在,那么我们已经得到了CSP的句柄
    printf("A crypto context with the %s key container \n", UserName);
    printf("has been acquired.\n\n");
    }
    else //如果密钥容器不存在,我们需要创建这个密钥容器
    {
    if(CryptAcquireContext(
    &hCryptProv,
    UserName,
    NULL,
    PROV_RSA_FULL,
    CRYPT_NEWKEYSET)) //创建以UserName为名的密钥容器
    {
    //创建密钥容器成功,并得到CSP句柄
    printf("A new key container has been created.\n");
    }
    else
    {
    HandleError("Could not create a new key container.\n");
    }
    } // End of else
  3. 使用CryptoAPI加密解密
    windows crypto API提供了对称加密和非对称加密,并且提供了各种加密、解密的算法,要使用相应的算法进行加密解密,只需要对生成密钥的函数的相关参数改变一下即可。
    image

二、PKCS#11及CSP接口标准

  • 在密码系统中,PKCS#11是公钥加密标准(PKCS, Public-Key Cryptography Standards)中的一份子 ,由RSA实验室(RSA Laboratories)发布,它为加密令牌定义了一组平台无关的API ,如硬件安全模块和智能卡。

  • 由于没有一个真正的标准加密令牌,这个API已经发展成为一个通用的加密令牌的抽象层。

  • PKCS#11 API定义最常用的加密对象类型( RSA密钥,X.509证书,DES /三重DES密钥等)和所有需要使用的功能,创建/生成,修改和删除这些对象。

  • 注意:pkcs#11只提供了接口的定义, 不包括接口的实现,一般接口的实现是由设备提供商提供的,如usbkey的生产厂商会提供符合PKCS#11接口标准的API的实现。这样你只要通过接口调用API函数即可实现其功能。

  • PKCS#11(简称P11)是针对密码设备的接口指令标准。P11模型中重要的概念之一是slot,也称为槽。一个slot为一个密码设备对象。某个打开的slot会话称之为session。Session之间存在不同的验证权限。而同一个slot的不同的session之间存在操作的互相影响性,同时在某些状况下,权限会发生同步。另外一个重要的概念是对象。P11中支持几种重要的对象,如公钥、私钥、对称密钥,数据对象等。

  • PKCS#11创建和支持下列对象:
    image
    PKCS#11的对象可根据其生命期长短的不同分成两大类:一类是持久存储的类对象,这类对象被保存在USB Key的安全存储区域当中,直到应用程序主动删除这些对象;另一类是会话对象,这类对象只存在于运行时建立的特定会话(Session对象)当中,一旦会话结束,这类对象也跟着被删除。决定对象生命期的模板属性是CKA_TOKEN,这是个布尔值,所有的对象都有这一属性。当该值为TRUE时,该对象将被保存到Key内的存储空间,否则,该对象保存在会话空间中,当会话结束后,该对象即销毁。

  • P11标准颁发了70余条指令。其中部分指令简介如下表:
    image
    image
    image
    image
    image

  • PKCS#11架构
    image

三、GMT 0016-2012

  • 这个标准规定了基于PKI密码体制的智能密码钥匙密码应用接口,描述了密码应用接口的函数、数据类型、参数的定义和设备的安全要求。

  • 层次关系:智能密码钥匙密码应用接口位于智能密码钥匙应用程序与设备之间,如下图:
    image

  • 设备的应用结构:一个设备中存在设备认证密钥和多个应用,应用之间相互独立。设备的逻辑结构如下图:
    image

  • 设备管理系列函数:
    image

  • 访问控制系列函数
    image

  • 应用管理函数
    image

  • 容器管理系列函数
    image

  • 密码服务系列函数
    image
    image

四、GMT 0018-2012

  • 本标准的目标是为公钥密码基础设施应用体系框架下的服务类密码设备制定统一的应用接口标准,通过该接口调用密码设备,向上层提供基础密码服务。为该类密码设备的开发、使用及检测提供标准依据和指导,有利于提高该类密码设备的产品化、标准化和系列化水平。

  • 范围:本标准规定了公钥密码基础设施应用技术体系下服务类密码设备的应用接口标准,适用于服务类密码设备的研制、使用,以及基于该类密码设备的应用开发,也可用于指导该类密码设备的检测。

  • 密码设备应用接口在公钥密码基础设施应用技术体系框架中的位置:在公钥密码基础设施应用技术体系框架中,密码设备服务层由密码机、密码卡、智能密码终瑞等设备组成,通过本标准规定的密码设备应用接口向通用密码服务层提供基础密码服务。如下图:

  • 基础密码服务包括密钥生成、单一的密码运算、文件管理等服务。

  • 本标准采用C语言描述接口函数,无特别说明时,函数中参数的长度单位均为字节数。

设备管理类函数:
  • 打开设备:SDF_OpenDevice
  • 关闭设备:SDF_CloseDevice
  • 创建会话:SDF_OpenSession
  • 关闭会话:SDF_CloseSession
  • 获取设备信息:SDF_GetDeviceInfo
  • 产生随机数:SDF_GenerateRandom
  • 获取私钥使用权限:SDF_GetPrivateKeyAccessRight
  • 释放私钥使用权限:SDF_ReleasePrivateKeyAccessRight
密钥管理类函数:
  • 导出 RSA 签名公钥:SDF_ExportSignPublicKey_RSA
  • 导出 RSA 加密公钥:SDF_ExportEncPublicKey_RSA
  • 产生RSA非对称密钥对并输出:SDF_GenerateKeyPair_RSA
  • 生成会话密钥并用内部RSA公钥加密输出:SDF_GenerateKeyWithIPK_RSA
  • 生成会话密钥并用外部RSA公钥加密输出:SDF_GenerateKeyWithEPK_RSA - 导人会话密钥并用内部RSA私钥解密:SDF_ImportKeyWithISK_RSA
  • 基于 RSA 算法的数宇倍封转换:SDF_ExchangeDigitEnvelopeBaseOnRSA
  • 导出 ECC 签名公钥:SDF_ExportSignPublicKey_ECC
  • 导出 ECC 加密公钥:SDF_ExportEncPublicKey_ECC
  • 产生ECC非对称密钥对并输出:SDF_GenerateKeyPair_ECC
  • 生成会话密钥并用内部ECC公钥加密输岀:SDF_GenerateKeyWithIPK_ECC - 生成会话密钥并用外部ECC公钥加密输出:SDF_GenerateKeyWithEPK_ECC
  • 导入会话密钥并用内部ECC私钥解密:SDFJmportKeyWithlSKJECC
  • 生成密钥协商参数并输出:SDF_GenerateAgreementDataWithECC
  • 计算会话密钥:SDF_GenerateKey WithECC
  • 产生协商数据并计算会话密钥:SDF—GenerateAgreementDataAndKeyWithECC
  • 基于 ECC算法的数字信封转换:SDF_ExchangeDigitEnvelopeBaseOnECC
  • 生成会话密钥并用密钥加密密钥加密输出: SDF_GenerateKeyWithKEK
  • 导入会话密钥并用密钥加密密钥解密:SDF_ImportKeyWithKEK
  • 销毁会话密钥:SDF_DestroyKey
非对称算法运算类函数
  • 部公钥 RSA 运算:SDF_ExternalPublicKeyOperation_RSA
  • 内部公钥 RSA 运算:SDF_InternalPublicKeyOperation_RSA
  • 内部私钥 RSA 运算:SDF_InternalPrivateKeyOperation_RSA
  • 外部密钥 ECC 验证:SDF_ExternalVerify_ECC
  • 内部密钥 ECC 签名:SDF_InternalSign_ECC
  • 内部密钥 ECC 验证:SDF_InternalVerify_ECC
  • 外部密钥 ECC 加密:SDF_ExternalEncrypt_ECC
对称算法运算类函数
  • 对称加密:SDF_Encrypt
  • 对称解密:SDF_Decrypt
  • 计算MAC:SDF_CalculateMAC
杂凑运算类函数
  • 杂凑运算初始化:SDF_HashInit
  • 多包杂凑运算:SDF_HashUpdate
  • 杂凑运算结束:SDF_HashFinal
安全要求
(1)基于本标准设计、开发的密码设备在密钥管理方面,应满足以下要求:
  • 设备密钥的使用不对应用系统开放;

  • 密钥必须用安全的方法产生并存储;

  • 在任何时间、任何情况下,除公钥外的密钥均不能以明文形式出现在密码设备外;

  • 密码设备内部存储的密钥应具备有效的密钥保护机制,防止解剖、探测和非法读取;

  • 密码设备内部存储的密钥应具备权限控制机制,防止非法使用和导出。

    (2)密码服务要求:

  • 使用的密码算法应得到国家密码主管部门的批准;

  • 使用国家密码主管部门认可的密码算法芯片;

  • 本标准所列的所有接口函数均应能被应用系统任意调用。

    (3)设备状态要求:

  • 密码设备应具有初始和就绪两个状态;

  • 未安装设备密钥的密码设备应处于初始状态,已安装设备密钥的密码设备应处于就绪状态;

  • 在初始状态下,除可读取设备信息、设备密钥的生成或恢复操作外,不能执行任何操作,生成或恢复设备密钥后,密码设备处于就绪状态;

  • 在就绪状态下,除设备密钥的生成或恢复操作外,应能执行任何操作;

  • 在就绪状态下进行的密钥操作,设备操作员应经过密码设备的认证。

    (4)其他要求:

  • 密码设备应有安全机制和措施,保证密钥在生成、安装、导入、存储、备份.恢复及销毁整个生存期间的安全,此安全机制可由设备厂商自行设计实现。

posted @ 2021-04-25 20:22  20181227  阅读(99)  评论(0编辑  收藏  举报