代码改变世界

加密API研究

2022-05-12 17:14  陈冠昊  阅读(187)  评论(0编辑  收藏  举报

Crypto API

CryptoAPI概述

   Windows Crypto API是Microsoft 公司提出的安全加密应用服务框架,也是PKI推荐使用的加密 API。它提供了在Win32 环境下使用认证、编码、加密和签名等安全服务时的标准加密接口,用于增强应用程序的安全性与可控性。应用开发者可以在不了解复杂的加密机制和加密算法的情况下,简便、快速地开发出标准、通用和易于扩展的安全加密应用程序。Crypto API 提供的功能主要有:密钥管理、数据加密和解密、数字签名和验证、证书管理、可信根证书管理、数据编码和解码、数字证书编码和解码、PKCS#7标准格式编码和解码等。

Crypto API使用方式

   CryptoAPI本身不实现密码运算相关操作,而是操作系统通过调用CryptoSPI函数接口相应的加密服务提供者函数(CSP)来实现。CryptoAPI函数使用“加密服务提供者”(CSP)完成数据加密、解密以及密钥的存储管理、所有的CSP都是相互独立的模块。理论上,CSP应该独立于特定的应用程序,也就是说所有的应用程序可以使用任何一个CSP。但是,实际上有些应用程序只能与特定的CSP协作。CSP与应用程序之间的关系类似于Windows GDI模型。CSP就类似于图形硬件驱动程序。

Crypto API包含的函数

   CryptoAPI体系主要由一下几部分组成:基本加密函数、证书编码与解码函数、证书存储函数、简化信息处理函数、底层信息处理函数。
   基本加密函数包含了以下几种:服务提供者函数、密钥的产生和交换函数、编码/解码函数、数据加密/解密函数和哈希和数字签名函数。
   证书和证书库函数管理、使用和取得证书、证书撤销列表和证书信任列表。
密钥的产生和交换函数:

CryptAcquireCertificatePrivateKey 对于指定证书上下文得到一个HCRYPTPROV 句柄和dwKeySpec
CryptDeriveKey 从一个密码中派生一个密钥
CryptDestoryKey 销毁密钥
CryptDuplicateKey 制作一个密钥和密钥状态的精确复制
CryptExportKey 把CSP 的密钥做成BLOB 传送到应用程序的内存空间中
CryptGenKey 创建一个随机密钥
CryptGenRandom 产生一个随机数
CryptGetKeyParam 得到密钥的参数
CryptGetUserKey 得到一个密钥交换或签名密钥的句柄
CryptImportKey 把一个密钥BLOB 传送到CSP中
CryptSetKeyParam 指定一个密钥的参数

编码/解码函数:

CryptDecodeObject 对lpszStructType 结构进行解码
CryptDecodeObjectEx 对lpszStructType 结构进行解码,此函数支持内存分配选项
CryptEncodeObject 对lpszStructType 结构进行编码
CyptEncodeObjectEx 对lpszStructType 结构进行编码,此函数支持内存分配选项

数据加密/解密函数:

CryptDecrypt 使用指定加密密钥来解密一段密文
CryptEncrypt 使用指定加密密钥来加密一段明文
CryptProtectData 执行对DATA_BLOB 结构的加密
CryptUnprotectData 执行对DATA_BLOB 结构的完整性验证和解密

哈希和数字签名函数:

CryptCreateHash 创建一个空哈希对象
CryptDestoryHash 销毁一个哈希对象
CryptDuplicateHash 复制一个哈希对象
CryptGetHashParam 得到一个哈希对象参数
CryptHashData 对一块数据进行哈希,把它加到指定的哈希对象中
CryptHashSessionKey 对一个会话密钥进行哈希,把它加到指定的哈希对象中
CryptSetHashParam 设置一个哈希对象的参数
CryptSignHash 对一个哈希对象进行签名
CryptVerifySignature 校验一个数字签名

PKCS #11

PKCS #11概述

   PKCS#11是公钥加密标准Public-Key Cryptography Standards中的一份子,由RSA实验室发布。PKCS#11标准定义了与密码令牌的独立于平台的API,API本身命名为Cryptoki,这个API已经发展成为一个通用的加密令牌的抽象层。PKCS#11主要是应用于智能卡和HSM。

PKCS #11使用方式

   PKCS#11称为Cyptoki,定义了一套独立于技术的程序设计接口,USBKey安全应用需要实现的接口。 由于没有一个真正的标准加密令牌,这个API已经发展成为一个通用的加密令牌的抽象层。 PKCS #11 API定义最常用的加密对象类型( RSA密钥,X.509证书,DES /三重DES密钥等)和所有需要使用的功能,创建/生成,修改和删除这些对象。注意:pkcs#11只提供了接口的定义, 不包括接口的实现,一般接口的实现是由设备提供商提供的,如usbkey的生产厂商会提供 符合PKCS#11接口标准的API的实现。这样你只要通过接口调用API函数即可实现其功能。

PKCS #11 函数类别以及相关函数:

  • 通用:C_Initialize()、C_Finalize()、C_GetInfo() 和 C_GetFunctionList()

  • 会话管理:C_OpenSession()、C_CloseSession()、C_GetSessionInfo()、C_CloseAllSessions()、C_Login() 和 C_Logout()

  • 插槽和令牌管理:C_GetSlotList()、C_GetSlotInfo()、C_GetMechanismList()、C_GetMechanismInfo() 和 C_SetPIN()

  • 加密和解密:C_EncryptInit()、C_Encrypt()、C_EncryptUpdate()、C_EncryptFinal()、C_DecryptInit()、C_Decrypt()、_DecryptUpdate() 和 C_DecryptFinal()

  • 消息摘要:C_DigestInit()、C_Digest()、C_DigestKey()、C_DigestUpdate() 和 C_DigestFinal()

  • MAC 的签名和应用:C_Sign()、C_SignInit()、C_SignUpdate()、C_SignFinal()、C_SignRecoverInit() 和 C_SignRecover()

  • 签名验证:C_Verify()、C_VerifyInit()、C_VerifyUpdate()、C_VerifyFinal()、C_VerifyRecoverInit() 和 C_VerifyRecover()

  • 双重用途加密函数:C_DigestEncryptUpdate()、C_DecryptDigestUpdate()、C_SignEncryptUpdate() 和 C_DecryptVerifyUpdate()

  • 随机数生成:C_SeedRandom() 和 C_GenerateRandom()

  • 对象管理:C_CreateObject()、C_DestroyObject()、C_CopyObject()、C_FindObjects()、C_FindObjectsInit()、C_FindObjectsFinal()、C_GetAttributeValue() 和 C_SetAttributeValue()

  • 密钥管理:C_GenerateKey()、C_GenerateKeyPair() 和 C_DeriveKey()

GMT 0016-2012

GMT 0016-2012 概述

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

GMT 0016-2012使用方式

调用头文件以及接口进行使用

GMT 0016-2012包含的函数

设备管理类函数

SDF_OpenDevice 打开设备
SDF_CloseDevice 关闭设备
SDF_OpenSession 创建会话
SDF_CloseSession 关闭会话
SDF_GetDeviceInfo 获取设备信息
SDF_GenerateRandom 产生随机数
SDF_GetPrivateKeyAccessRight 获取私钥使用权限
SDF_ReleasePrivateKeyAccessRight 释放私钥获取权限

密钥管理类函数

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_ExchangeDigitEnvelopeIaseOnRSAH 基于RSA算法的数字信封转换
SDF_ExportSignPublicKey_ECC 导出ECC签名公钥
SDF_ExportEncPublicKey_ECC 导出ECC加密公钥
SDF_GenerateKeyPair_ECC 产生ECC非对称密钥对并输出
SDF_GenerateKeyWithIPK_ECC 生成会话密钥并用内部ECC公钥加密输出
SDF_GenerateKeyWithEPK_ECC 生成会话密钥并用外部ECC公钥加密输出
SDF_ImportKeyWithISKECC 导入会话密钥并用内部 ECC私钥解密
SDF_GenerateAgreementDataWithECC 生成密钥协商参数并输出
SDF_GenerateKeyWihECC 计算会话密钥
SDF_GenerateAgreermentDataAndKeyWithECC 产生协商数据并计算会话密钥
SDF_ExchangeDigitEnvelopeBaseOnECC 基于ECC算法的数字信封转换
SDF_GenerateKeyWithKEK 生成会话密钥并用密钥加密密钥加密输出
SDF_ImportKeyWithKEK SDF_GenerateKey WitlKEK导入会话密钥并用密钥加密密钥解密
SDF_DestroyKey 销毁会话密钥

非对称算法运算类函数

SDF_ExternalPublicKeyOperation_RSA 外部公钥RSA运算
SDF_InternalPublicKeyOperation_RSA 内部公钥RSA运算
SDF_InternalPrivateKeyOperation_RSA 内部私钥RSA运算
SDF_ExternalVerify_ECC 外部密钥ECC验证
SDF_InternalSign_ECC 内部密钥ECC签名
SDF_InternalVerify_ECC 内部密钥ECC验证
SDFExternalEncrypt_ECC 外部密钥EC加密

对称算法运算类函数

SDF_ Encrypt 对称加密
SDF_Dccrypt 对称解密
SDF_CalculateMAC 计算MAC

杂凑运算类函数

SDF HashInit 杂凑运算初始化
SDF HashUpdate 多包杂凑运算
SDF_HashFinal 杂凑运算结束

用户文件操作类函数

SDF_CreateFile 创建文件
SDF_ReadFile 读取文件
SDF_WriteFile 写文件
SDF_DeleteFile 删除文件

GMT 0018-2012

GMT 0018-2012概述

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

规范性引用文件

   下列文件对于本文件的应用是必不可少的。凡是注日期的引用文件,仅注日期的版本适用于本文件;凡是不注日期的引用文件,其最新版本(包括所有的修改单)适用于本文件;GM/T 0006密码应用标识规范;GM/T AAAA SM2密码算法使用规范。

其中还包括了对部分术语的规定:

算法标识algorithm identifier 用于对密码算法进行唯一标识的符号。
非对称密码算法/公钥密码算法asymmetric cryptographic algorithm/public key cryptograplrithmts 加解密使用不同密钥的密码算法。
解密decipherment/decryption 加密过程对应的逆过程。
设备密钥device key pair 存储在设备内部的用于设备管理的非对称密钥对,包含签名密钥对和加密密钥对。
加密encipherment/encryption 对数据进行密码变换以产生密文的过程。
密钥加密密钥key encryption key ;KEK 对密钥进行加密保护的密钥。
公钥基础设施public key infrastructure;PKI 用公钥密码技术建立的普遍适用的基础设施,为用户提供证书管理和密钥管理等安全服务。
私钥访问控制码private key access password 用于验证私钥使用权限的口令字。
对称密码技术/对称密码体制symmetric cryptographic technique 原发者和接收者均采用同一秘密密钥进行变换的密码技术(体制)。其中,加密密钥与解密密钥相同,或者一个密钥可以从另一个密钥导出的密码体制。
会话密钥session key 处于层次化密钥结构中的最低层,仅在一次会话中使用的密钥。
用户密钥user key 存储在设备内部的用于应用密码运算的非对称密钥,包含签名密钥对和加密密钥对。

GMT 0018-2012使用方式

在公钥密码基础设施应用技术体系框架中,密码设备服务层由密码机,密码卡,智能密码终端等设备组成,通过本标准规定的密码设备应用接口向通用密码服务层提供基础密码服务。基础密码服务包括密钥生成、单一的密码运算、文件管理等的服务。

GMT 0018-2012 函数

设备管理类函数

设备管理类函数包括以下具体函数:

A.打开设备:SDF_OpenDevice

B.关闭设备:SDF_CloseDevice

C.创建会话:SDF_OpenSession

D.关闭会话:SDF_CloseSession

E.获取设备信息:SDF_GetDeviceInfo

F.产生随机数:SDF_GenerateRandom

G.获取私钥使用权限:SDF_GetPrivateKeyAccessRight

H.释放私钥使用权限: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私钥解密∶SDF_ImportKeyWithISK_ECC
  • 生成密钥协商参数并输出;SDF_GenerateAgreementDataWithECC
  • 计算会话密钥∶SDF_GenerateKeyWiuhECC
  • 产生协商数据并计算会话密钥∶SDF_GenerateAgreementDataAndKeyWithECC
  • 基于 ECC算法的数字信封转换∶SDF_ExchangeDigitEnvelopeBaseOnECC
  • 生成会话密钥并用密钥加密密钥加密输出∶SDF_GenerateKeyWithKEK
  • 导入会话密钥并用密钥加密密钥解密∶SDF_ImportKeyWithKEK
  • 销毁会话密钥∶SDF_DestroyKey

非对称算法运算类函数

image