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


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

    密码引擎API的主要标准和规范包括:
    1 微软的Crypto API
    2 RAS公司的PKCS#11标准
    3 中国商用密码标准:GMT 0016-2012 智能密码钥匙密码应用接口规范,GMT 0018-2012密码设备应用接口规范等

    研究以上API接口,总结他们的异同,并以龙脉GM3000Key为例,写出调用不同接口的代码,提交博客链接和代码链接。
    内容:
    0 查找各种标准的原始文档,研究学习(至少包含Crypto API,PKCS#11,GMT 0016-2012,GMT 0018-2012)(5分)
    1 总结这些API在编程中的使用方式(5分)
    2 列出这些API包含的函数,进行分类,并总结它们的异同(10分)
    3 以龙脉GM3000Key为例,写出调用不同接口的代码(Crypto API,PKCS#11,SKF接口),把运行截图加入博客,并提供代码链接(10分)

    1 Crypto API

    微软的CryptoAPI是Win32平台下为应用程序开发者提供的数据加密和安全的编码接口。CryptoAPI函数集包含了基本的ASN.1的编码、解码,散列,数据加密和解密,数字证书管理等重要的密码学应用功能。数据的加密、解密支持对称和非对称两类算法。CryptoAPI是所有微软的Win32的应用程序以及第三方厂商应有程序使用的数据加密接口,诸如Internet Explorer、OutLook、Adobe等应用都是基于CryptoAPI开发的。

    1.1 Crypto API在编程中的使用方式

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

    1.2Crypto API包含的函数

    CryptoAPI体系主要由以下几部分组成:

    基本加密函数、证书编码与解码函数、证书存储函数、简化信息处理函数、底层信息处理函数。

    1.2.1基本加密函数

    服务提供者函数

    ** 密钥的产生和交换函数**

    编码/解码函数

    数据加密/解密函数

    哈希和数字签名函数

    1.2.2 证书和证书库函数

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

    证书库函数:一个用户站点可以收集许多证书。这些证书是为这个站点的用户所使用的,证书描述了这个用户的具体身份。对于每个人,可能有一个以上的证书。证书库和其相关的函数提供了对库获得、枚举、验证和使用证书库里的信息。


    维护函数

    ** 证书函数**


    证书撤销列表函数

    1.2.3 证书验证函数

    证书验证是通过CTL 和证书列表进行的.
    使用CTL的函数

    证书链验证函数

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

    (1)Crypto API
    使用CryptoAPI编写一个文件保护程序,具有如下功能:

    (1)给定明文文件,生成加密文件,同时产生文件的数字签名文件;

    (2)给定密文文件,解密出明文文件,并验证签名的正确性。

    在不安全的网络上进行安全的数据传输涉及三个方面的要求:信息隐藏,身份鉴别和完整性检验。CryptoAPI除了提供上述三个功能外还提供标准的ASN.1编码、解码,信息解密,数字证书和证书存储区的管理,证书信任列表、吊销列表和证书有效性检查等功能。

    信息隐藏
    信息隐藏的意义是保障信息内容只能被特定的人获取。信息隐藏通常是使用某种形式的密码学方式。数据加密算法能保障信息的安区隐藏和传输。数据加密算法是将明文数据经过一定的变换使其看上去是一组毫无意义的数据。在没有加密密钥的情况下,对于好的加密算法想从密文获取明文信息是不可能的。被加密的数据可以是任意的ASCII编码文本文件,数据库文件,和任意需要进行安全传输的数据。这里,“信息”是指任意的一段数据,“明文”是指任意一段没有被加密的数据,“密文”是指任意一段加密的数据。被加密的数据可以在不安全的通道上进行传输而不伤害其安全性。之后,密文可以被还原成明文.

    数据加密和解密的概念是:对数据加密的时候需要一个加密密钥,相当于门上的一把钥匙。解密的时候,需要使用一个解密密钥来解开数据。加密密钥、解密密钥可以相同也可以不相同。
    加密密钥必须小心保存,给其它用户的时候也必须通过安全的通道传递。对解密密钥的访问权限必须小心控制,因为拥有解密密钥意味着可以解开所有相应加密密钥加密的信息。

    身份鉴别
    安全通讯的前提是通讯的双方知道对方的身份。身份鉴别的任务就是鉴别一个用户或者实体的真实身份。标识用户身份的文档通常被称为信任状或者凭证。

    身份鉴别有时候也用来判定接受的数据就是被发送的数据。如果A向B发送了一段数据,B需要鉴别这段数据就是A发出去的,而不是其它冒充A发出去的。为了满足这类验证的需求,CryptoAPI提供数字签名和校验函数,用来对信息进行鉴别。

    因为在计算机网网络上传输的数据与用户之间并没有物理连接,因此对数据进行鉴别的凭证也必须能够在网络上进行传输。这种凭证必须由受信任的凭证发行机构发行。

    数字证书就是平常说的证书就是这种凭证,是计算机在网络上进行身份验证的有效凭证。

    数字证书是由一个被称为证书机构的信任组织或实体颁发的凭证。它包含与证书对应的用户公钥以及其它一些记录证书主题和用户信息的数据。证书机构只有在验证了证书主题和证书对应的用户公钥的有效性之后才会签发证书。

    证书申请者和证书机构之间交换签发证书信息可以使用物理介质,比如软盘,进行传输。通常,这种信息都是在计算机网络上进行完成的。证书机构使用被信任的服务程序处理用户的请求和证书的签发工作。

    完整性检测
    任何通过不安全介质传输的信息都可以被意外或蓄意的修改。在现实世界中,盖章、签名就是用来提供和证明信息完整性的工具。

    信息的接收者不但需要确定信息是由谁发送的,还要确定自己收到的信息是发送者发送的信息,而没有任何的变化。要建立数据的完整性检测机制,不仅要发送信息本身,还要发送用来校验数据的信息,这一信息通常被称作哈希值。数据和验证信息都可以与数字签名一起发送来证明其完整性。

    PKCS#11

    架构

    会话状态

    对象

    机制

    根据机制标记,可以分为几类:
    CKF_ENCRYPT:加密类
    CKF_DECRYPT:解密类
    CKF_DIGEST:摘要类
    CKF_SIGN:签名类
    CKF_SIGN_RECOVER:可恢复签名类
    CKF_VERIFY:验证类
    CKF_VERIFY_RECOVER:可恢复验证类
    CKF_GENERATE:密钥产生
    CKF_GENERATE_KEY_PAIR:密钥对产生
    CKF_WRAP:密钥封装
    CKF_UNWRAP:密钥解封
    CKF_DERIVE:密钥派生

    操作


    Cryptoki 为一个或多个密码设备提供一个接口,这些设备通过大量的槽在系统中运行。每个对应于一个物理阅读器或另一个设备接口的槽可包含一个令牌。当一台密码设备存在于阅读器中,一个令牌就存在于该槽中。当然,由于Cryptoki提供槽和令牌的逻辑视图,所以可能有其它的物理译码。多个槽可能共享一个阅读器。问题在于一个系统有相当多的槽,应用程序能连接到这些槽的其中任何一个或全部槽的令牌上。

    密码设备可以按照某一命令集执行某些密码操作,这些命令通常要经过标准设备驱动程序,例如PCMCIA卡服务程序或槽服务程序。Cryptoki 使每个密码设备看起来逻辑上很象其它设备,而不管什么技术实现的。因此,应用程序不必直接与设备驱动器接口(或甚至不必知道包括那些设备);Cryptoki 隐藏了这些细节。的确,基础设备完全能用软件来实现,(例如,在一个服务器上运行的处理程序),不须专用硬件。

    Cryptoki 或许可以作为支持接口功能的库来实现,而应用程序则与该库连接。应用程序可以直接与Cryptoki 连接,或者,Cryptoki 是一个所谓的“共享”库(或动态连接库),在这种情况下,应用程序动态地连接库。用Microsoft Windows和OS/2操作系统可以比较容易地生成数据库,并且在UNIX和DOS中也可相对容易地生成“共享”库。

    由于新库可以使用,所以动态方法有许多优点;但从安全的角度来说,也有一些缺点。要特别指出的是,如果库能较容易地被替换,攻击者有可能用恶意制造的假库取而代之,以截取用户的PIN。即使编码签名技术能防止许多动态连接的安全危险,从安全角度来说,一般采用直接连接。总之,应用程序和Cryptoki 库之间的程序设计接口是相同的。

    设备的种类和所支持的能力的种类将取决于专用Cryptoki 库。本标准只定义库的接口,不定义库的特征。要特别指出的是,并不是所有的库支持这个接口(因为不是所有的令牌支持所有的机制)中定义的机制(算法)。并且库也许只支持可使用的所有密码设备的一个子集。(当然,可以预料更多更好的设备种类将被开发,以支持多种令牌,而不是单个供应商提供的令牌。)只要开发出应用程序,就会形成Cryptoki 的接口、标准数据库和令牌“轮廓”。

    令牌的逻辑视图

    Cryptoki的令牌逻辑视图是一个能存储对象和能执行密码函数的设备。Cryptoki定义如下三个对象:数据、证书和密钥。数据对象由应用程序定义。一个证书对象存储一个证书。一个密钥对象存储一个密码密钥。密钥可以是一个公共密钥、一个私钥或是一个保密密钥,每个种类的密钥在专用机制中使用其的辅助型。令牌的这种逻辑视图如下图所示:

    GM/T 0016-2012

    3.1 简介

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

    3.2 结构模型

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

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

    设备管理系列函数

    访问控制系列函数

    应用管理函数

    容器管理系列函数

    密码服务系列函数

    四、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)其他要求:
    密码设备应有安全机制和措施,保证密钥在生成、安装、导入、存储、备份.恢复及销毁整个生存期间的安全,此安全机制可由设备厂商自行设计实现。

    五、以龙脉GM3000Key为例,写出调用不同接口的代码(Crypto API,PKCS#11,SKF接口),把运行截图加入博客,并提供代码链接







  • 相关阅读:
    基于erlang的mud游戏引擎开发
    生成数据库所有表的查询语句
    查找表字段语句
    基础算法总结 Java 版
    ArrayList源码学习
    云服务器安装 Mysql 5.7
    n个元素进栈,共有多少种出栈顺序?
    MyBatis 学习
    Spring学习笔记之AOP
    原来你是这样的 IntegerCache
  • 原文地址:https://www.cnblogs.com/lhpshuaibi/p/16174577.html
Copyright © 2020-2023  润新知