实验一 密码引擎的设计与实现

一、openeuler windows 安装openssl

  • 创建学号文件夹并将openssl最新压缩包下载在其中

  • 确认openssl版本

  • 编写C语言小例 并运行


  • 更换openssl 版本

sudo mv /usr/bin/openssl /usr/bin/openssl.old    //将旧版本的openssl进行备份
sudo ln -s /usr/local/bin/openssl /usr/bin/openssl    //将新版本的openssl进行软链接
cd /etc/   //进入etc目录
su     //下一步一定要切换到root用户
echo "/usr/local/lib" >> ld.so.conf    //将openssl的安装路径加入配置中
ldconfig  //重新加载配置

windows中调试openssl

  • 安装openssl

  • 安装vscode或code;;blocks调试C语言环境

  • 在code;;blocks中调试

  • 调试截图

二、电子钥匙功能测试

在Ubuntu中运行 “龙脉密码钥匙驱动实例工具等\mToken-GM3000\skf\samples\linux_mac”中例程


运行“龙脉密码钥匙驱动实例工具等\mToken-GM3000\skf\samples\windows”中例程

选择“龙脉密码钥匙驱动实例工具等\mToken-GM3000\csp\samples\CryptAPI\VC\EncryptDecryptFile”中的加密文件代码进行测试


测试签名:龙脉密码钥匙驱动实例工具等\mToken-GM3000\csp\samples\CryptAPI\VC\Sign_Verify\Signa_Verify.sln

加密API研究

一、任务详情

密码引擎API的主要标准和规范包括:

  • 微软的Crypto API;
  • RAS公司的PKCS#11标准;
  • 中国商用密码标准:GMT 0016-2012 智能密码钥匙密码应用接口规范,GMT 0018-2012密码设备应用接口规范等;
  • 研究以上API接口,总结他们的异同,并以龙脉GM3000Key为例,写出调用不同接口的代码,提交博客链接和代码链接。
  • 内容:
  • 查找各种标准的原始文档,研究学习(至少包含Crypto API,PKCS#11,GMT 0016-2012,GMT 0018-2012);
  • 总结这些API在编程中的使用方式;
  • 列出这些API包含的函数,进行分类,并总结它们的异同;
  • 以龙脉GM3000Key为例,写出调用不同接口的代码(Crypto API,PKCS#11,SKF接口),把运行截图加入博客,并提供代码链接。

二、研究对比

2.1 微软的Crypto API
1、简介

  • (1) 微软加密服务体系
    微软加密服务体系CryptoAPI的结构如下图所示,微软加密服务体系包含三层结构和两个接口,分别为应用程序层、操作系统层(OS)、加密服务提供者层(Cryptographic Service Provider,CSP),CryptoAPI接口和加密服务提供者接口(Cryptographic Service Provider Interface,CSPF)
  • (2)CryptoAPI体系结构
    CryptoAPI体系架构共由五大主要部分组成:基本加密函数、证书编/解码函数、证书库管理函数、简单消息函数、底层消息函数。体系结构如下图所系:
  • 基本加密函数:用于选择CSP、建立CSP连接、产生密钥、交换及传输密钥等操作。
  • 证书编/解码函数:用于数据加密、解密、哈希等操作。这类函数支持数据的加密/解密操作;- 计算哈希、创建和校验数字签名操作;实现证书、证书撤销列表、证书请求和证书扩展等编码和解码操作。
  • 证书库管理函数:用于数字证书及证书库管理等操作。这组函数用于管理证书、证书撤销列表和证书信任列表的使用、存储、获取等。
  • 简单消息函数:用于消息处理,比如消息编码/解码、消息加/解密、数字签名及签名验证等操作。它是把多个底层消息函数包装在一起以完成某个特定任务,方便用户的使用。
  • 底层消息函数:底层消息函数对传输的PKCS#7数据进行编码,对接受到的PKCS#7数据进行解码,并且对接收到的消息进行解码和验证。它可以实现简单消息函数可以实现的所有功能,且提供更大的灵活性,但一般会需要更多的函数调用。
  • (3) CryptoAPI基本功能
    利用CryptoAPI,开发者可以给基于Windows的应用程序添加安全服务,包括:ASN.1编码/解码、数据加密/解密、身份认证、数字证书管理,同时支持PKI、对称密码技术等。
  • 密钥管理
    在CryptoAPI中,支持两种类型的密钥:会话密钥、公/私密钥对。会话密钥也成为对称密钥,用于对称加密算法。为了保证密钥的安全性,在CryptoAPI中,这些密钥都保存在CSP内部,用户可以通过CryptExpoetKey以加密密钥快形式导出。公/私钥对用于非对称加密算法。非对称加密算法主要用于加解密会话密钥和数字签名。在CryptoAPI中,一般来说,大多数CSP产生的密钥容器包含两对密钥对,一对用于加密会话密钥,称为交换密钥对,一对用于产生数字签名,称为签名密钥对。在CryptoAPI中,所有的密钥都存储在CSP中,CSP负责密钥的创建,销毁,导入导出等操作。
  • 数据编码/解码
    CryptoAPI采用的编码方式为ASN.1,编码规则为DER,表示发送方发送数据时先把数据抽象为ASN.1对象,然后使用DER编码规则把ASN.1对象转化为可传输的0、1串;接受方接受到数据后,利用DER解码规则把0、1串转化为ASN.1对象,然后把ASN.1对象转化为具体应用支持的数据对象。
  • 数据加/解密
    在CryptoAPI中约定加密较大的数据块时,采用对称加密算法。通过其封装好的加解密函数来实现数据解加密操作。
  • 哈希与数字签名
    哈希与数字签名一般用于数据的完整性验证和身份鉴别。CryptoAPI中,通过其封装好的哈希与数字签名函数来实现相关操作。微软公司提供的CSP产生的数字签名遵循RSA标准(PKCS#6)。
  • 数字证书管理
    数字证书主要用于安全通信中的身份鉴别。CryptoAPI中,对数字证书的使用管理函数分为证书与证书库函数、证书验证函数两大部分。
  • 2、体系结构
    作为一部分 Microsoft Windows 提供的应用程序编程接口 (API),CryptoAPI 提供了一组函数。这些函数允许应用程序在对用户的敏感私钥数据提供保护时,以灵活的方式对数据进行加密或数字签名。实际的加密操作是由称为加密服务提供程序 (CSP) 的独立模块执行。CryptoAPI是一组函数,为了完成数学计算,必须具有密码服务提供者模块(CSP)。Microsoft通过捆绑RSA Base Provider在操作系统级提供一个CSP,使用RSA公司的公钥加密算法,更多的CSP可以根据需要增加到应用中。事实上,CSP有可能与特殊硬件设备(如智能卡)一起来进行数据加密。CryptoAPI接口允许简单的函数调用来加密数据,交换公钥,散列一个消息来建立摘要以及生成数字签名。它还提供高级的管理操作,如从一组可能的CSP中使用一个CSP。此外,CryptoAPI还为许多高级安全性服务提供了基础,包括用于电子商务的SET,用于加密客户机/服务器消息的PCT,用于在各个平台之间来回传递机密数据和密钥的PFX,代码签名等等。CryptoAPI的体系结构如下图:
  • 3、常用函数
 BOOLEAN CRYPTFUNC CryptAcquireContext(
    HCRYPTPROV* phProv,   CSP句柄
    LPCTSTR pszContainer,   密钥容器名称,指向密钥容器的字符串指针
    LPCTSTR pszProvider,    指向CSP名称的字符串指针,如果为NULL,则使用默认的CSP
    DWORD dwProvType, CSP类型
    DWORD dwFlags 标志
    );
  • 这个函数是为了获得CSP句柄,函数通过phProv参数返回获得的CSP句柄。在CryptoAPI加密服务相关的所有操作都在CSP实现,CSP真正实行加密相关服务的独立模块,当应用程序需要加密相关服务时,比如:加解密操作、密钥产生于管理等,必须先获取某个CSP句柄。这时一般CryptoAPI编程的第一步。
BOOL CRYPTFUNC CryptGenKey(
    HCRYPTPROV hProv,   //CSP句柄
    ALG_ID Algid, //算法标志ID值。创建会话密钥时,它指定具体的加解密算法。指定算法时应注意具体的  
    
                           // CSP是否支持此算法。创建公/私密钥对时,参数应为AT_KEYEXCHANGE(交换密钥对)
    
                           //或AT_SIGNATURE(签名密钥对)。
    DWORD dwFlags,    //说明创建密钥的长度及其它属性。
    HCRYPTKEY* phKey   //新创建密钥句柄,函数通过这个参数返回创建密钥句柄。
    );
  • 在CryptoAPI中,构造密钥一般有两种方法,一通过哈希值,而通过随机数构造。上面这种就是通过随机数创建的。下面介绍利用哈希值创建的函数。
   BOOL CRYPTFUNC CryptDeriveKey(
    HCRYPTPROV hProv,
    ALG_ID Algid,     //要产生密钥的对称加密算法
    HCRYPTHASH hBaseData,    //哈希句柄,函数根据这个哈希句柄创建密钥。
    DWORD dwFlags,    //指定密钥的类型。
    HCRYPTKEY* phKey   //密钥句柄,函数通过这个参数返回创建的密钥句柄。
    );
  • 这个函数通过输入的哈希值hBaseData来创建一个密钥,通过密钥句柄phKey参数返回。注意:这个函数只能创建会话密钥,不能用于创建公/私密钥对。
BOOL CRYPTFUNC CryptCreateHash(
    HCRYPTPROV hProv, //CSP句柄
    ALG_ID Algid,   //哈希算法标识符
    HCRYPTKEY hKey, // 如果哈希算法是密钥哈希,如HMACH或者MAC算法,就用此密钥句柄传递密钥。
    
                                     //对于非密钥算法,此参数为NULL。
    DWORD dwFlags,   //保留,必须为0
    HCRYPTHASH* phHash //哈希句柄,函数通过这个参数返回创建的哈希对象句柄。
    );
  • 这个函数初始化一个哈希句柄,它创建并返回一个CSP哈希句柄。
 BOOL WINAPI CryptHashData(
    HCRYPTHASH hHash,    //哈希句柄,创建的哈希值通过这个句柄返回
    BYTE* pbData,    //指向要加入到哈希句柄的数据指针
    DWORD dwDataLen,   // 数据长度
    DWORD dwFlags   //标志
    );
  • 这个函数是计算一段数据的哈希值并加入到指定的哈希句柄中。在使用这个函数前必须通过CrpytHashData函数创建了一个哈希句柄。

2.2 RAS公司的PKCS#11标准

  • 1、简介
PKCS是由美国RSA数据安全公司及其合作伙伴制定的一组公钥密码学标准,其中包括证书申请、证书更新、证书作废表发布、扩展证书内容以及数字签名、数字信封的格式等方面的一系列相关协议。到1999年底,PKCS已经公布了以下标准:
PKCS#1:定义RSA公开密钥算法加密和签名机制,主要用于组织PKCS#7中所描述的数字签名和数字信封
PKCS#3:定义Diffie-Hellman密钥交换协议
PKCS#5:描述一种利用从口令派生出来的安全密钥加密字符串的方法。使用MD2或MD5 从口令中派生密钥,并采用DES-CBC模式加密。主要用于加密从一个计算机传送到另一个计算机的私人密钥,不能用于加密消息
PKCS#6:描述了公钥证书的标准语法,主要描述X.509证书的扩展格式
PKCS#7:定义一种通用的消息语法,包括数字签名和加密等用于增强的加密机制,PKCS#7与PEM兼容,所以不需其他密码操作,就可以将加密的消息转换成PEM消息
PKCS#8:描述私有密钥信息格式,该信息包括公开密钥算法的私有密钥以及可选的属性集等
PKCS#9:定义一些用于PKCS#6证书扩展、PKCS#7数字签名和PKCS#8私钥加密信息的属性类型
PKCS#9定义了PKCS#6扩展证书、PKCS#7数字签名消息、PKCS#8私钥信息和PKCS#10证书签名请求中要用到的可选属性类型。已定义的证书属性包括E-mail地址、无格式姓名、内容类型、消息摘要、签名时间、签名副本(counter signature)、质询口令字和扩展证书属性。
PKCS#10:描述证书请求语法
PKCS#10定义了证书请求的语法。证书请求包含了一个唯一识别名、公钥和可选的一组属性,它们一起被请求证书的实体签名(证书管理协议中的PKIX证书请求消息就是一个PKCS#10)。
PKCS#11:称为Cyptoki,定义了一套独立于技术的程序设计接口,用于智能卡和PCMCIA卡之类的加密设备
密码令牌接口标准。PKCS#11或“Cryptoki”为拥有密码信息(如加密密钥和证书)和执行密码学函数的单用户设备定义了一个应用程序接口(API)。智能卡就是实现Cryptoki的典型设备。注意:Cryptoki定义了密码函数接口,但并未指明设备具体如何实现这些函数。而且Cryptoki只说明了密码接口,并未定义对设备来说可能有用的其他接口,如访问设备的文件系统接口。
PKCS#12:描述个人信息交换语法标准。
描述了将用户公钥、私钥、证书和其他相关信息打包的语法。PKCS#12定义了个人身份信息(包括私钥、证书、各种秘密和扩展字段)的格式。PKCS#12有助于传输证书及对应的私钥,于是用户可以在不同设备间移动他们的个人身份信息。
PKCS#13:椭圆曲线密码体制标准。
PKCS#13标准当前正在完善之中。它包括椭圆曲线参数的生成和验证、密钥生成和验证、数字签名和公钥加密,还有密钥协定,以及参数、密钥和方案标识的ASN.1语法。
PKCS#14:伪随机数生成标准。
PKCS#14标准当前正在完善之中。为什么随机数生成也需要建立自己的标准呢?PKI中用到的许多基本的密码学函数,如密钥生成和Diffie-Hellman共享密钥协商,都需要使用随机数。然而,如果“随机数”不是随机的,而是取自一个可预测的取值集合,那么密码学函数就不再是绝对安全了,因为它的取值被限于一个缩小了的值域中。因此,安全伪随机数的生成对于PKI的安全极为关键。
PKCS#15:密码令牌信息格式标准。
PKCS#15通过定义令牌上存储的密码对象的通用格式来增进密码令牌的互操作性。在实现PKCS#15的设备上存储的数据对于使用该设备的所有应用程序来说都是一样的,尽管实际上在内部实现时可能所用的格式不同。PKCS#15的实现扮演了翻译家的角色,它在卡的内部格式与应用程序支持的数据格式间进行转换。
#### 以龙脉GM3000Key为例,写出调用不同接口的代码
  • (一)SKF接口


    -(二)Crypto API


  • (三)PKCS#11
(1)DES


(2)DES3


(3)RC2

(4)RC4

(5)rsa

国䀄算法交叉测试

1 在Ubuntu中使用OpenSSL用SM4算法加密上述文件,然后用龙脉eKey解密,提交代码和运行结果截图



2 在Ubuntu中基于OpenSSL产生一对公私钥对(SM2算法)



3.在Ubuntu中使用OpenSSL用SM3算法计算上述文件的Hash值,然后用OpenSSL SM2算法计算Hash值的签名,用龙脉eKey进行验签


在Windows中重现上述过程

openssl enc -sm4-cbc -in 20201310.txt -a -out encrypt.txt

电子公文传输系统安全性设计方案与实现

一、电子公文传输系统安全

(一)读书笔记
  • 浏览附件中的《Core.Software.Security.Security.at.the.Source.CN.软件安全.从源头开始》,《The.Security.Development.Lifecycle.CN.软件安全开发生命周期》两本图书,总结读书笔记,重点是SDLsecurity development lifecycle,安全开发生命周期),提交读书笔记。
  • 《Core.Software.Security.Security.at.the.Source.CN.软件安全.从源头开始》是一本针对软件安全的实践指南。主要分为三个部分:
  • 第一部分介绍了软件开发中的安全问题和威胁,以及如何在开发过程中预防和解决这些问题。内容包括威胁建模、安全要素、安全需求等。第二部分介绍了常见的安全漏洞和攻击手段,包括缓冲区溢出、SQL注入、跨站脚本攻击等。针对每一种漏洞和攻击,书中都详细介绍了相应的解决方法和防御策略。第三部分介绍了软件测试和安全评估的方法和工具。书中介绍了黑盒测试、白盒测试、灰盒测试等测试方法,以及一些常用的安全评估工具。总的来说,这本书详细介绍了软件安全的各方面知识,对软件开发人员、安全工程师和信息安全从业人员都有很大的参考价值。
  • 《The.Security.Development.Lifecycle.CN.软件安全开发生命周期》是一本介绍软件开发中如何集成安全的方法和实践的书籍,主要内容包括以下三个方面:
  • 第一部分介绍了软件开发中的安全问题和威胁,以及如何在开发过程中预防和解决这些问题。书中详细介绍了关于软件安全开发生命周期的基本概念、核心组件、阶段和挑战,并提供了各个阶段的最佳实践。第二部分介绍了安全开发生命周期的实践方法,包括工具、技术和策略等。涉及内容包括需求分析和规划、设计、测试、实施、运营和维护等方面,并提供了相应的方法和技巧。第三部分介绍了如何评估和优化安全开发生命周期的过程和效果,包括评估工具、指标和模型等方面。总的来说,这本书深入讲解了软件开发中的安全问题和解决方案,并提供了大量实践案例和最佳实践。对于关注软件安全开发生命周期的人员来说,具有很大的参考价值。
  • 大致阅读后的读书笔记见此附件:【金山文档】 《The.Security.Development.Lifecycle.CN.软件安全开发生命周期》
    https://kdocs.cn/l/cmP7L3a2Qntr
(二)系统加固计划书
  • 小组讨论电子公文传输系统,如何应用SDL对电子公文系统进行加团,给出一份加固计划书,其中重点要包含系统资源的分析,基于STRIDE模型的威胁分析以及基于DREAD模型的风险分析,人员分工,开发计划,提交安全性设计方案。
  • 附件:【金山文档】 加固计划书https://kdocs.cn/l/ciHBry1kBF1O
(三)系统安全性设计报告

参考《GMT 0007 2012 电子政务电子认证服务应用指南》, GMT 0054-2018《信息系统密码应用基本要求》和国家标准GB/T 39786-2021《信息安全技术信息系统密码应用基本要求》提交一份系统安全性设计报告,重点是密码方案的应用。
附件:【金山文档】 系统安全性设计报告
https://kdocs.cn/l/coGibMdKw16q

二、电子传输系统实现进展

(一)重新调通本系统
  • 由于上学期项目文件还有些问题没有解决,加上期末没有验收,整个项目搁置了很久,这次花了一些时间在调通的基础上做了一些改进。
(二)电子公文系统设计的学习
  • 电子公文传输系统通常采用分层结构一般来说,这种分层结构包括以下几个层次:
  1. 应用层:这是用户与系统之间的界面层。用户可以在这里输入、编辑并上传文档。
  2. 协议层:这一层主要负责定义通信协议和数据格式,以确保数据的顺畅传输。
  3. 传输层:传输层负责管理数据的传输和接收,主要目的是确保数据的完整性。不少电子公文传输系统采用了加密和身份验证技术,以保护数据的机密性。
  4. 网络层:网络层负责将数据传输到网络上各个设备,包括路由器和网关等,并自动选择最佳路径以确保数据传输的效率。
  5. 物理层:这是数据传输的最底层,主要涉及硬件设备和数据介质,例如电缆、光纤等。
(三)电子公文传输系统的架构设计
  • 电子公文传输系统的主体架构会因各个实现的细节而有所不同,不过一般来说,它通常由以下几个主要组成部分构成:
  1. 前端界面:用户可以通过前端界面来输入、浏览和查看电子公文的相关信息,从而实现与系统的交互。
  2. 后端服务器:承载着整个公文传输系统的底层框架,包括对公文进行存储、加密、解密和传输等所有必要操作的基础设施。
  3. 数据库:用于储存、管理和维护所有电子公文的相关信息,以及记录所有的操作和交互信息,以方便日后的查询和追踪。
  4. 安全机制:对于电子公文来说,信息安全是一个重要的问题。因此,公文传输系统应该在系统级别和应用级别实现多重可靠的安全机制,确保电子公文的机密性和可靠性。
(四)电子公文传输系统的安全保护
  • 在电子公文传输系统中,安全保护是非常重要的。以下是几个常用的安全保护措施:
  • 认证和授权机制:电子公文传输系统必须具备识别并控制用户访问公文信息和系统的能力。这通常包括用户认证,授权和审计三个方面,以确保敏感信息仅能被授权的人访问和操作。
  • 数据加密技术:如上所述,对称密钥和非对称密钥加密技术都可用于保护电子公文的安全和保密性。公文传输过程中,必须要结合加密技术来避免公文数据的泄露和篡改。
  • 安全审计:电子公文传输系统应该记录所有电子公文的相关操作记录,并定期进行审计。这可以用于监控、检测和预防任何潜在的安全问题。
  • 信息安全意识培训:为了保证电子公文传输系统的完整性和机密性,应该为所有用户提供信息安全培训,提高员工信息安全意识,避免人为疏忽或敏感信息的意外泄露。
  • 我们本周在储存口令的数据库做出了一些成果,我们的想法是在以sm3加密的形式储存用户密码,登录时使用sm3进行哈希验证。
(五)电子公文传输系统的用户架构

电子公文传输系统的用户架构可以分为以下三个部分:

  • 系统管理员:系统管理员负责系统的安装、配置、维护和监视,确保系统的稳定性和安全性。
  • 管理员:管理员通常是具有特殊权限的用户,负责管理公文和用户,包括创建、编辑、删除、发布和审核公文,以及授予和撤销用户的权限等。
  • 普通用户:普通用户通常是系统中的普通员工或公文发送者的角色,他们可以登录系统,创建、查看和编辑公文,并将公文发送给其他用户。
  • 各个用户之间的权限是有明确的对应关系的,对于操作受限制的用户,他们必须获得相应的授权才能执行特殊的操作。通过对这些用户进行严格的管理,可以有效地减少人为因素,提高系统的安全性和稳定性。

实现与实践过程

整体实现包括三部分

1.用户登录部分

  • 用户登录的口令,用sm3加密保存在数据库中,本质上数据库并不知道用户的登录口令,用户登录的过程中,是将用户输入在登陆界面中的内容进行sm3加密并同数据库内容进行比较,如果内容相同则进行跳转,如果不同则无法跳转。

2.用户文件加密密钥设置

  • 用户上传文件的过程为了保证文件的保密性,需要进行加密,并将加密之后的文件保存在服务器中,在下载过程中,引擎对文件进行解密。引擎使用的加密算法是sm4加密算法,sm4对称加密密钥是加密保存在文件中的。文件加密密钥是用户在注册用户的过程中随即产生的。代码如下:
  • 系统使用sm2加密文件加密密钥并保存在命名为sm3(随机数)的文件中。数据库中保存的为sm3(随机数)。sm3加密代码:
  • 注册用户hzx24 运行结果:
  • 保存如下:sm3(随机数)

3.sm2加密系统设置

  • sm2加密系统是密码引擎的中枢。sm4文件加密密钥也就是用户文件加密密钥是使用sm2加密保存在名为sm3(随机数)的文件中的。sm2的公私钥对是服务器提前设置好的。保存在服务器中,公私钥对如下:sm2pub.pem的为公钥 sm2.pem保存的为加密的私钥 私钥解密密钥只有服务器知道
  • sm2加密代码:
  • sm2解密代码:

密码引擎的验证

1. 用户注册过程

  • 注册用户hzx25
  • 数据库保存

2. 用户密钥设置过程

  • 保存文件加密密钥文件(文件名为sm3(文件加密密钥)),文件内容为(sm2(文件加密密钥))

3. 文件传输过程

  • 创建被传输文件
  • 登录hzx25用户给admin用户发送文件
  • 在服务器查看服务器中保存的文件(文件路径名被加密)

  • 登录用户下载问价,并查找文件

posted on 2023-06-04 22:56  20201310寸头  阅读(80)  评论(0编辑  收藏  举报