加密研究
作者:互联网
API使用方式总结
1 微软的Crypto API
1.1CryptoAPI系统架构由五个主要功能区域组成:
- 基本密码功能
- 证书编码/解码功能
- 证书存储功能
- 简化的消息功能
- 低级消息功能
1.2基本密码功能
- 用于连接到CSP的上下文功能。这些功能使应用程序可以按名称选择特定的CSP或选择可以提供所需功能类别的特定CSP。
- 密钥生成功能,用于生成和存储加密密钥。包括对更改链接模式,初始化向量和其他加密功能的全面支持。有关更多信息,请参见密钥生成和交换功能。
- 密钥交换功能,用于交换或传输密钥。有关更多信息,请参见加密密钥存储和交换以及密钥生成和交换功能。
1.3证书编码/解码功能
- 用于加密或解密数据的功能。还包括对哈希数据的支持。有关更多信息,请参见数据加密和解密功能和数据加密和解密。
1.4证书存储功能
- 用于管理数字证书收集的功能。有关更多信息,请参见数字证书和证书存储功能。
1.5简化的消息功能
- 用于加密和解密消息和数据的功能。
- 用于签名消息和数据的功能。
- 用于验证接收到的消息和相关数据上签名真实性的功能。
1.6低级消息功能
- 用于执行由简化消息功能执行的所有任务的功能。与简化的消息功能相比,低级消息功能提供了更大的灵活性,但需要更多的函数调用。有关更多信息,请参见低级消息和低级消息功能。
2 RAS公司的PKCS#11标准
PKCS#11(简称P11)就是针对密码设备的接口指令标准。P11模型中重要的概念之一是slot,也称为槽。一个slot为一个密码设备对象。某个打开的slot会话称之为session。Session之间存在不同的验证权限。而同一个slot的不同的session之间存在操作的互相影响性,同时在某些状况下,权限会发生同步。另外一个重要的概念是对象。P11中支持几种重要的对象,如公钥、私钥、对称密钥,数据对象等。
CSP接口标准:CSP接口标准为微软所颁发,在windows操作系统上通行。CSP中重要的概念是容器(container)。一个容器中具有一对公私钥。而证书却是这一对密钥的附加属性了。
3 中国商用密码标准:GMT 0016-2012 智能密码钥匙密码应用接口规范,GMT 0018-2012密码设备应用接口规范
GMT 0016-2012 智能密码钥匙密码应用接口规范:
- 本标准规定了基于PKI密码体制的智能密码钥匙密码应用接口,描述了密码应用接口的函数、数据类型、参数的定义和设备的安全要求。本标准适用于智能密码钥匙产品的研制、使用和检测。
GMT 0018-2012密码设备应用接口规范:
- 本标准规定了公钥密码基础设施应用技术体系下服务类密码设备的应用接口标准。本标准适用于服务类密码设备的研制、使用,以及基于该类密码设备的应用开发,也可用于指导该类密码设备的检测。
对API函数分类,并总结异同
微软的API
服务提供者函数
应用程序使用服务提供者函数来连接和断开一个CSP。
- CryptAcquireContext获得指定CSP的密钥容器的句柄
- CryptContextAddRef对HCRYPTPROV句柄增加一个应用计数
- CryptEnumProviders枚举当前计算机中的CSP
- CryptEnumProviderTypes枚举CSP的类型
- CryptGetDefaultProvider对于指定CSP类型的却省CSP
- CryptGetProvParam得到一个CSP的属性
- CryptInstallDefaultContext安装先前得到的HCRYPTPROV上下文作为当前却省的上下文
- CryptReleaseContext释放由CryptAcquireContext得到的句柄
- CryptSetProvider和CryptSetProviderEx为指定CSP类型指定一个却省的CSP
- CryptSetProvParam指定一个CSP的属性
- CryptUninstallDefaultContext删除先前由CryptInstallDefaultContext安装的却省上下文
密钥的产生和交换函数
密钥产生函数创建、配置和销毁加密密钥。他们也用于和其他用户进行交换密钥。下面就是主要的一些函数:
- 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结构进行编码,此函数支持内存分配选项
数据加密/解密函数
这些函数支持数据的加密/解密操作。
-
CryptEncrypt 和CryptDecrypt 要求在被调用前指定一个密钥。
-
注:这个密钥可以由CryptGenKey、CryptDeriveKey 或CryptImportKey 产生。创建密钥时要指定加密算法。
-
CryptSetKeyParam函数可以指定额外的加密参数。
-
CryptDecrypt使用指定加密密钥来解密一段密文
-
CryptEncrypt使用指定加密密钥来加密一段明文
-
CryptProtectData执行对DATA_BLOB结构的加密
-
CryptUnprotectData执行对DATA_BLOB结构的完整性验证和解密
哈希和数字签名函数
这些函数在应用程序中完成计算哈希、创建和校验数字签名。
- CryptCreateHash创建一个空哈希对象
- CryptDestoryHash销毁一个哈希对象
- CryptDuplicateHash复制一个哈希对象
- CryptGetHashParam得到一个哈希对象参数
- CryptHashData对一块数据进行哈希,把它加到指定的哈希对象中
- CryptHashSessionKey对一个会话密钥进行哈希,把它加到指定的哈希对象中
- CryptSetHashParam设置一个哈希对象的参数
- CryptSignHash对一个哈希对象进行签名
- CryptVerifySignature校验一个数字签名
RAS公司的PKCS#11标准
CSP总共有23个函数接口。简介如下:
CSP连接函数:
- CPAcquireContext:为应用程序创建一个上下文
- CPGetProvParam:返回CSP相关的信息
- CPReleaseContext:释放CPAcquireContext创建的上下文
- CPSetProvParam :设置CSP的参数操作
CSP密钥生成和交换函数
- CPDeriveKey:从一个数据散列中生成一个会话密钥,它保证生成的密钥 互不相同
- CPDestroyKey:释放一个密钥句柄,释放后,句柄将无效,密钥将无法再被访问
- CPExportKey:从CSP容器中导出密钥
- CPGenKey:用来生成密钥或密钥对
- CPGenRandom:使用随机数填充一个缓冲
- CPGetKeyParam:用来得到加密操作密钥的属性
- CPGetUserKey:用来获取CSP容器中的持久密钥对
- CPImportKey:从一个blob中导入密钥到CSP容器中
- CPSetKeyParam:设置密钥的属性
CSP加解密函数:
- CPDecrypt:用来解密先前被加密的数据
- CPEncrypt:用来加密明文
- CSP散列和数字签名函数:
- CPCreateHash:初始化并散列输入数据
- CPDestroyHash:删除一个散列对象句柄
- CPDuplicateHash:创建一个散列对象的拷贝
- CPGetHashParam:获取散列对象的计算结果
- CPHashData:散列输入的数据
- CPSetHashParam:定制一个散列对象的属性
- CPSignHash:签名一个散列对象
- CPVerifySignature:校验一个数字签名
GMT 0016-2012
设备管理系列函数:
- SKF_WaitForDevEvent:等待设备插拔事件
- SKF_ CancelWaitForDevEvent:取消等待设备插拔事件
- SKF_ EnumDev :枚举设备
- SKF_ ConnectDev:连接设备
- SKF_ DisconnectDev :断开连接
- SKF_ GetDevState:获取设备状态
- SKF_ SetLabel:设置设备标签
- SKF_ GetDevInfo:获取设备信息
- SKF_ LockDev:锁定设备
- SKF_ UnlockDev:解锁设备
- SKF_Transmit:设备命令传输
访问控制系列函数:
- SKF_ ChangeDevAuthKey:修改设备认证密钥
- SKF_DevAuth:设备认证
- SKF_ ChangePIN:修改PIN
- SKF_ GetPINInfo:获得PIN码信息
- SKF_ VerifyPIN:校验PIN
- SKF_ UnblockPIN:解锁PIN
- SKF_ ClearSecueState:清除应用安全状态
应用管理系列函数:
- SKF_ CreateApplication:创建应用
- SKF_ EnumApplication:枚举应用
- SKF_ DeleteApplication:删除应用
- SKF_ OpenApplication:打开应用
- SKF_ CloseApplication:关闭应用
文件管理系列函数:
- SKF_ CreateFile:创建文件
- SKF_ DeleteFile :删除文件
- SKF_ EnumFiles:枚举文件
- SKF_ GetFileInfo:获取文件信息
- SKF_ ReadFile:读文件
- SKF_ WriteFile :写文件
容器管理系列函数:
- SKF_CreateContainer:创建容器
- SKF_ DeleteContainer:删除容器
- SKF_ EnumContainer:枚举容器
- SKF_ OpenContainer:打开容器
- SKF_ CloseContainer:关闭容器
- SKF_ GetContainerType:获得容器类型
- SKF_ ImportCertificate:导人数字证书
- SKF_ ExportCertificate:导出数字证书
密码服务系列函数:
- SKF_ GenRandom :生成随机数
- SKF_ GenExtRSAKey:生成外部RSA密钥对
- SKF_ GenRSAKeyPair:生成RSA签名密钥对
- SKF_ ImportRSAKeyPair:导人RSA加密密钥对
- SKF_ RSASignDataRSA:签名
- SKF_ RSAVerify:RSA验签
- SKF_ RSAExportSessionKey:RSA生成并导出会话密钥
- SKF_ ExtRSAPubKeyOperation:RSA外来公钥运算
- SKF_ ExtRSAPriKeyOperation:RSA外来私钥运算
- SKF_ GenECCKeyPair:生成ECC签名密钥对
- SKF_ ImportECCKeyPair:导入ECC加密密钥对
- SKF_ ECCSignData :ECC签名
- SKF_ ECCVerify:ECC验签
- SKF_ ECCExportSessionKey:ECC生成并导出会话密钥
- SKF_ExtECCEncrypt:ECC外来公钥加密.
- SKF_ ExtECCDecrypt:ECC外来私钥解密.
- SKF_ ExtECCSign:ECC外来私钥签名.
- SKF_ ExtECCVerify :ECC外来公钥验签.
- SKF_ GenerateAgreementDataWithECC:ECC生成密钥协商参数并输出
- SKF_ GenerateKeyWithECC:ECC计算会话密钥.
- SKF_ GenerateAgreementDataAndKeyWithECC:ECC产生协商数据并计算会话密钥
- SKF_ExportPablicKey:导出公钥
- SKF_ImportSessionKey:导入会话密钥
- SKF_ SetSymmKey:明文导人会话密钥
- SKF_ EncrypInit:加密初始化
- SKF_ Encrypt:单组数据加密
- SKF_ EncryptUpdate:多组数据加密
- SKF_ EncryptFinal:结束加密
- SKF_ Digestlnit:密码杂凑初始化
- SKF_Digest:单组数据密码杂凑
- SKF_ DigestUpdate:多组数据密码杂凑
- SKP_ DigestFinal:结束密码杂凑
- SKF_ MacInit:消息鉴别码运算初始化
- SKF_ Mac:单组数据消息鉴别码运算
- SKF_ MacUpdate:多组数据消息鉴别码运算
- SKF_ MacFinal:结束消息鉴别码运算
- SKF_ CloseHandle:关闭密码对象句柄
GMT 0018-2012
设备管理:
- 打开设备:SDEOpenDerice
- 关闭设备:SDF_ Cias eDevice
- 创建会话:SDF_ OpenSesion
- 关闭会话: SDF _CloseSession
- 获取设备信息:SDF _GetDeviceInfo
- 产生随机数:SDF_enerateRandom
- 获取私钥使用权限: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私钥解密:SDF_ ImportKeyWithISK_ ECC
- 生成密钥协商参数并输出:SDF_GenerateAgreementDataWithECC
- 计算会话密钥:SDF_GenerateKeyWithECC
- 产生协商数据并计算会话密钥: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_ nternalSign_ ECC
- 内部密钥ECC验证:SDF_ InternalVerify_ ECC
- 外部密钥ECC加密:SDF_ ExternalEncrypt_ECC
对称算法运算类函数
- 对称加密:SDF_Encrypt
- 对称解密:SDF_Decrypt
- 计算MAC:SDF_CalculateMAC
杂凑运算类函数
- 杂凑运算初始化:SDF_HashInit
- 多包杂凑运算:SDF_HashUpdate
- 杂凑运算结束:SDF_HashFinal
用户文件操作类函数:
- 创建文件:SDF_CreatFile
- 读取文件:SDF_ReadFile
- 写文件:SDF_WriteFile
- 删除文件:SDF_DeleteFile
总结异同
- 这三类标准中都包含加解密的函数,并且自成体系。
- 具体函数名称有些许不同,但大同小异。
- 还有GM涉及到了设备的管理,所以有设备管理接口还有访问控制函数。
写出调用不同接口的代码
加密文件 encfile:
初始化向量:
签名验签:
枚举当前计算机支持的CSP类型以及所有CSP名称,获得默认的CSP名称并读取其相关参数属性:
Provider:
标签:ECC,研究,SDF,SKF,密钥,加密,CSP 来源: https://www.cnblogs.com/20191211yss/p/16174897.html