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

一、密码引擎-3-加密API研究

API:应用程序接口(API:Application Program Interface)是一组定义、程序及协议的集合,通过 API 接口实现计算机软件之间的相互通信。API 的一个主要功能是提供通用功能集。程序员通过使用 API 函数开发应用程序,从而可以避免编写无用程序,以减轻编程任务。
密码引擎API的主要标准和规范包括:
1 微软的Crypto API
2 RAS公司的PKCS#11标准
3 中国商用密码标准:GMT 0016-2012 智能密码钥匙密码应用接口规范,GMT 0018-2012密码设备应用接口规范等

0 、查找各种标准的原始文档,研究学习(至少包含Crypto API,PKCS#11,GMT 0016-2012,GMT 0018-2012)

(1)Crypto API:

作为一部分 Microsoft Windows 提供的应用程序编程接口 (API),CryptoAPI 提供了一组函数。这些函数允许应用程序在对用户的敏感私钥数据提供保护时,以灵活的方式对数据进行加密或数字签名。实际的加密操作是由称为加密服务提供程序 (CSP) 的独立模块执行。
img
CryptoAPI是一组函数,为了完成数学计算,必须具有密码服务提供者模块(CSP)。Microsoft通过捆绑RSA Base Provider在操作系统级提供一个CSP,使用RSA公司的公钥加密算法,更多的CSP可以根据需要增加到应用中。事实上,CSP有可能与特殊硬件设备(如智能卡)一起来进行数据加密。CryptoAPI接口允许简单的函数调用来加密数据,交换公钥,散列一个消息来建立摘要以及生成数字签名。它还提供高级的管理操作,如从一组可能的CSP中使用一个CSP。此外,CryptoAPI还为许多高级安全性服务提供了基础,包括用于电子商务的SET,用于加密客户机/服务器消息的PCT,用于在各个平台之间来回传递机密数据和密钥的PFX,代码签名等等。

(2)PKCS#11:

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

PKCS#11标准定义了与密码令牌(如硬件安全模块(HSM)和智能卡)的独立于平台的API,并将API本身命名为“Cryptoki”(来自“加密令牌接口”,发音为“crypto-key” - 但是“PKCS#11”通常用于指代API以及定义它的标准)。 API定义了最常用的加密对像类型(RSA密钥,X.509证书,DES / 三重DES密钥等)以及使用,创建/生成,修改和删除这些对象所需的所有功能。

(3)GMT 0016-2012:

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

(4)GMT 0018-2012:

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

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

(1)Crypto API

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

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

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

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

信息隐藏

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

数据加密和解密的概念是:对数据加密的时候需要一个加密密钥,相当于门上的一把钥匙。解密的时候,需要使用一个解密密钥来解开数据。加密密钥、解密密钥可以相同也可以不相同。

加密密钥必须小心保存,给其它用户的时候也必须通过安全的通道传递。对解密密钥的访问权限必须小心控制,因为拥有解密密钥意味着可以解开所有相应加密密钥加密的信息。

身份鉴别

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

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

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

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

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

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

完整性检测

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

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

(2)PKCS#11

架构:

img

会话状态:

img

对象:

img

(3)GMT 0016-2012

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

术语和定义

下列术语和定义适用于本文件

应用 application

包括容器、设备认证密钥和文件的一种结构,具备独立的权限管理。

容器container

密码设备中用于保存密钥所划分的唯一性存储空间。

设备device

本标准中将智能密码钥匙统称为设备

设备认证 device authentication智能密码钥匙对应用程序的认证
设备认证密钥 device authentication key用于设备认证的密钥。
设备标签 label

设备的别名,可以由用户进行设定并存储于设备内部。

消息鉴别码 message authentication code; MAC消息鉴别算法的输出。
管理员PIN administrator PIN管理员的口令,为ASCII字符串
用户PIN user PIN

用户的口令,为ASCII字符串。

缩略语

下列缩略语适用于本规范: API 应用编程接口(Application Programming Interface)
PKI 公钥基础设施(Public Key Infrastructure)
PKCS#1
公钥密码使用标准系列规范中的第1部分,定义RSA公开密钥算法加密和签名机制(the Public-Key Cryptography Standard Part 1)
PKCS#5 公钥密码使用标准系列规范中的第5部分,描述一种利用从口令派生出来的安全密
钥加密字符串的方法(the Public-Key Cryptography Standard Part 5)
PIN 个人身份识别码(Personal Identification Number)
MAC 消息鉴别码(Message Authentication Code)

(4)GMT 0018-2012

规范性引用文件

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

术语和定义

以下术语和定义活用干本文件

算法标识algorithm ideutifier

用于对密码算法进行唯一标识的符号。

非对称密码算法/公钥密码算法 asymmetric cryptographic algorithm/public key cryptographic algorithm加解密使用不同密钥的密码算法。
解密 decipherment/decryption加密过程对应的逆过程。
设备密钥device key pair

存储在设备内部的用于设备管理的非对称密钥对包含签名密钥对和加密密钥对。

加密encipherment/encryption

对数据进行密码变换以产生密文的过程。

密钥加密密钥key encrypt key;KEK对密钥进行加密保护的密钥。
公钥基础设施public key infrastructure;PKI

用公钥密码技术建立的普遍适用的基础设施,为用户提供证书管理和密钥管理等安全服务。

私钥访问控制码private key access password

用于验证私钥使用权限的口令字。

对称密码技术/对称密码体制 symmetric cryptographic technique

原发者和接收者均采用同秘密密钥进行变换的密码技术(体制)。其中,加密密钥与解密密钥相同或者一个密钥可以从另一个密钥导出的密码体制。

会话密钥session key

处于层次化密钥结构中的最低层,仅在一次会话中使用的密钥。

用户密钥 user key

存储在设备内部的用于应用密码运算的非对称密钥,包含签名密钥对和加密密钥对。

符号和缩略语

下列缩略语适用于本部分:
ECC 椭圆曲线算法(Elliptic Curve Cryptography)
IPK 内部加密公钥(Internal Public Key)
ISK
内部加密私钥(Interal Private Key) EPK
外部加密公钥(Extenal Public Key) KEK 密钥加密密钥(Key Encrypt Key)

2、列出这些API包含的函数,进行分类,并总结它们的异同

(1)Crypto API

主要函数:

a) 主函数
void main(void)
b) 加密文件
BOOL EncryptFile(PCHAR szSource, PCHAR szDestination, PCHAR szPassword);
c) 解密文件
BOOL DecryptFile(PCHAR szSource, PCHAR szDestination, PCHAR szPassword);
d) 签名文件
BOOL SignFile (PCHAR szSource, PCHAR szDestination);
e) 验证签名
BOOL VerifyFile (PCHAR szSource, PCHAR szDestination);
f) 错误处理
void HandleError(char *s);

加密文件:

a) 打开源文件
hSource = fopen(szSource,"rb")
b) 取得密钥容器(CSP)句柄
CryptAcquireContext(&hCryptProv,NULL,NULL,PROV_RSA_FULL,0)
c) 根据用户输入的密码创建一个会话密钥(即对称密钥,用于对原文件加密)
//创建一个Hash对象
CryptCreateHash(hCryptProv,CALG_MD5, 0, 0, &hHash)
//用用户输入的密码产生一个散列
CryptHashData(hHash, (BYTE *)szPassword, strlen(szPassword), 0)
//通过散列生成一个会话密钥
CryptDeriveKey(hCryptProv, ENCRYPT_ALGORITHM,hHash, KEYLENGTH, &hKey))
//销毁Hash对象
CryptDestroyHash(hHash);
注: 会话密钥即对称密钥,用于对原文件进行加密;非对称密钥由于效率非常低,所以一般不用于对数据直接加密,而是对会话密钥进行加密,然后把它传送给对方。对 方通过非对称密钥解密获得这个会话密钥,然后再对数据文件进行解密。可以看出,一个会话密钥的生存期可以限制在这次通信中,即每次通信都用不同的会话密钥 加密,而非对称密钥则必须是长期使用的。在此例中,加解密过程中没有使用到非对称 RSA密钥对,而只在数字签名及验证使用它。
d) 加密数据文件
CryptEncrypt(
hKey, //密钥
0, //如果数据同时进行散列和加密,这里传入一个散列对象
feof(hSource), //如果是最后一个被加密的块,输入TRUE.如果不是输
//入FALSE这里通过判断是否到文件尾来决定是否为最后一块
0, //保留
pbBuffer, //输入被加密数据,输出加密后的数据
&dwCount, //输入被加密数据实际长度,输出加密后数据长度
dwBufferLen) //pbBuffer的大小
注:查看完整代码时可以发现这是一个循环加密的过程,pbBuffer循环读入待加密文件的固定长度的内存块;当然你也可以将pbBuffer设得很大,一次读入整个文件,但那样浪费内存空间,而且影响扩展性(存在缓冲区溢出的可能)。
e) 清理工作,如释放Buffer空间、密钥句柄、CSP句柄等。
if(pbBuffer)
free(pbBuffer);
if(hKey)
CryptDestroyKey(hKey);
if(hHash)
CryptDestroyHash(hHash);
if(hCryptProv)
CryptReleaseContext(hCryptProv, 0);

解密文件:

a) 打开加密文件(同上)
b) 取得密钥容器(CSP)句柄(同上)
c) 根据用户输入的密码创建一个会话密钥(即对称密钥,用于对原文件解密)(同上)
注: 这里要求用户输入的密码与加密时输入的密码相同。在实际应用中,这个所谓用户输入的“密码”其实只是一个产生密钥的种子,一旦产生完会话密钥,则用户完全 可以忘记当初输入的“密码”,接收方可以使用传过来的密钥直接对加密文件进行解密,而不用再重复一次“生成密钥”的过程。
d) 解密数据文件
CryptDecrypt(
hKey, //密钥
0, //如果数据同时进行散列和加密,这里传入一个散列对象
feof(hSource), //如果是最后一个被加密的块,输入TRUE.如果不是输.
//入FALSE这里通过判断是否到文件尾来决定是否为最后一块。
0, //保留
pbBuffer, //输入被加密数据,输出加密后的数据
&dwCount)) //输入被加密数据实际长度,输出加密后数据长度
e) 清理工作,如释放Buffer空间、密钥句柄、CSP句柄等。

签名文件:

a) 打开源文件(同上)
b) 取得密钥容器(CSP)句柄(同上)
c) 取得签名用的密钥句柄(非对称RSA密钥)
CryptGetUserKey(
hCryptProv, // 我们已经得到的CSP句柄
AT_SIGNATURE, // 这里想得到signature key pair
&hKey)) // 返回密钥句柄
d) 导出签名用密钥对的公钥,保存在pbKeyBlob中
CryptExportKey(hKey, NULL,PUBLICKEYBLOB, 0, pbKeyBlob,&dwBlobLen)
e) 计算数据文件的Hash值,保存在Hash对象hHash中
//生成一个空的Hash对象
CryptCreateHash(hCryptProv,CALG_MD5,0,0,&hHash)
//计算数据文件的Hash值,保存在Hash对象中
CryptHashData(hHash,pbBuffer,dwCount,0)
f) 对数据文件的Hash值进行签名,数字签名保存在pbSignature中
CryptSignHash(hHash, AT_SIGNATURE, NULL, 0, pbSignature, &dwSigLen)
g) 清理工作,如释放Buffer空间、密钥句柄、CSP句柄等。

签名文件:

a) 打开源文件(同上)
b) 取得密钥容器(CSP)句柄(同上)
c) 取得签名用的密钥句柄(非对称RSA密钥)
CryptGetUserKey(
hCryptProv, // 我们已经得到的CSP句柄
AT_SIGNATURE, // 这里想得到signature key pair
&hKey)) // 返回密钥句柄
d) 导出签名用密钥对的公钥,保存在pbKeyBlob中
CryptExportKey(hKey, NULL,PUBLICKEYBLOB, 0, pbKeyBlob,&dwBlobLen)
e) 计算数据文件的Hash值,保存在Hash对象hHash中
//生成一个空的Hash对象
CryptCreateHash(hCryptProv,CALG_MD5,0,0,&hHash)
//计算数据文件的Hash值,保存在Hash对象中
CryptHashData(hHash,pbBuffer,dwCount,0)
f) 对数据文件的Hash值进行签名,数字签名保存在pbSignature中
CryptSignHash(hHash, AT_SIGNATURE, NULL, 0, pbSignature, &dwSigLen)
g) 清理工作,如释放Buffer空间、密钥句柄、CSP句柄等。(同上)

验证签名:

a) 打开文件(同上)
b) 取得密钥容器(CSP)句柄(同上)
c) 导入 pbKeyBlob 公钥
CryptImportKey(hCryptProv, pbKeyBlob, dwBlobLen, 0, 0, &hPubKey)
注:必须是与签名时所用的私钥配对的公钥,在此例中,这个公钥在生成数字签名时已经导出到pbKeyBlob中。
d) 计算数据文件的Hash值,保存在Hash对象hHash中。(同上)
e) 验证数字签名
CryptVerifySignature(hHash, pbSignature, dwSigLen,hPubKey,NULL, 0)
f) 清理工作,如释放Buffer空间、密钥句柄、CSP句柄等。(同上)

PKCS#11

  • 在密码系统中,PKCS#11是公钥加密标准(PKCS, Public-Key Cryptography Standards)中的一份子 ,由RSA实验室(RSA Laboratories)发布[1],它为加密令牌定义了一组平台无关的API ,如硬件安全模块和智能卡。
  • PKCS#11的对象可根据其生命期长短的不同分成两大类:一类是持久存储的类对象,这类对象被保存在USB Key的安全存储区域当中,直到应用程序主动删除这些对象;另一类是会话对象,这类对象只存在于运行时建立的特定会话(Session对象)当中,一旦会话结束,这类对象也跟着被删除。决定对象生命期的模板属性是CKA_TOKEN,这是个布尔值,所有的对象都有这一属性。当该值为TRUE时,该对象将被保存到Key内的存储空间,否则,该对象保存在会话空间中,当会话结束后,该对象即销毁。
  • 指令列表
    img
    img
    img
    img
    img
  • 架构
    img

GMT 0016-2012

本标准规定了基于PKI密码体制的智能密码钥匙密码应用接口,描述了密码应用接口函数、数据类型、参数的定义和设备安全要求。适用于智能密码钥匙产品的研制、使用和检测。
智能密码钥匙密码应用接口位于智能密码钥匙应用程序与设备之间,如下图:
img
设备的应用结构:一个设备中存在设备认证密钥和多个应用,应用之间相互独立。设备的逻辑结构如下图:
img
设备管理系列函数:
img
访问控制系列函数:
img
应用管理函数:
img
容器管理系列函数:
img
密码服务系列函数:
img
img

GMT 0018-2012

  1. 本标准的目标是为公钥密码基础设施应用体系框架下的服务类密码设备制定统一的应用接口标准,通过该接口调用密码设备,向上层提供基础密码服务。为该类密码设备的开发、使用及检测提供标准依据和指导,有利于提高该类密码设备的产品化、标准化和系列化水平。
  2. 范围:本标准规定了公钥密码基础设施应用技术体系下服务类密码设备的应用接口标准,适用于服务类密码设备的研制、使用,以及基于该类密码设备的应用开发,也可用于指导该类密码设备的检测。
  3. 密码设备应用接口在公钥密码基础设施应用技术体系框架中的位置:在公钥密码基础设施应用技术体系框架中,密码设备服务层由密码机、密码卡、智能密码终瑞等设备组成,通过本标准规定的密码设备应用接口向通用密码服务层提供基础密码服务。
  4. 设备管理类函数:
    打开设备:SDF_OpenDevice
    关闭设备:SDF_CloseDevice
    创建会话:SDF_OpenSession
    关闭会话:SDF_CloseSession
    获取设备信息:SDF_GetDeviceInfo
    产生随机数:SDF_GenerateRandom
    获取私钥使用权限: SDF_GetPrivateKeyAccessRight
    释放私钥使用权限: SDF_ReleasePrivateKeyAccessRight
  5. 密钥管理类函数:
    导出 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
  6. 非对称算法运算类函数
    部公钥 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
  7. 对称算法运算类函数
    对称加密:SDF_Encrypt
    对称解密:SDF_Decrypt
    计算MAC:SDF_CalculateMAC
  8. 杂凑运算类函数
    杂凑运算初始化:SDF_HashInit
    多包杂凑运算:SDF_HashUpdate
    杂凑运算结束:SDF_HashFinal
  9. 安全要求
    (1)基于本标准设计、开发的密码设备在密钥管理方面,应满足以下要求:
    设备密钥的使用不对应用系统开放;
    密钥必须用安全的方法产生并存储;
    在任何时间、任何情况下,除公钥外的密钥均不能以明文形式出现在密码设备外;
    密码设备内部存储的密钥应具备有效的密钥保护机制,防止解剖、探测和非法读取;
    密码设备内部存储的密钥应具备权限控制机制,防止非法使用和导出。
    (2)密码服务要求:
    使用的密码算法应得到国家密码主管部门的批准;
    使用国家密码主管部门认可的密码算法芯片;
    本标准所列的所有接口函数均应能被应用系统任意调用。
    (3)设备状态要求:
    密码设备应具有初始和就绪两个状态;
    未安装设备密钥的密码设备应处于初始状态,已安装设备密钥的密码设备应处于就绪状态;
    在初始状态下,除可读取设备信息、设备密钥的生成或恢复操作外,不能执行任何操作,生成或恢复设备密钥后,密码设备处于就绪状态;
    在就绪状态下,除设备密钥的生成或恢复操作外,应能执行任何操作;
    在就绪状态下进行的密钥操作,设备操作员应经过密码设备的认证。
    (4)其他要求:
    密码设备应有安全机制和措施,保证密钥在生成、安装、导入、存储、备份.恢复及销毁整个生存期间的安全,此安全机制可由设备厂商自行设计实现

(一)SKF接口

龙脉密码钥匙驱动实例工具等\mToken-GM3000\skf\samples\windows\EncryptData\EncryptData.sln

(二)Crypto API

1.龙脉密码钥匙驱动实例工具等\mToken-GM3000\csp\samples\CryptAPI\VC\EncryptDecryptFile\EncryptFile.sln

2.龙脉密码钥匙驱动实例工具等\mToken-GM3000\csp\samples\CryptAPI\VC\EnumCerts\EnumCerts.sln

(三)PKCS#11

1.龙脉密码钥匙驱动实例工具等\mToken-GM3000\pkcs11\windows\samples\PKCStest\PKCStest.sln

(1)DES

img
img

(2)DES3

img

img

(3)RC2

img
img

(4)RC4

img

(5)RSA

img

(6)AES

img

2.龙脉密码钥匙驱动实例工具等\mToken-GM3000\pkcs11\windows\samples\GetUSBInfos\getusbinfos.sln
img

二、密码引擎-1-OpenEuler-OpenSSL编译

  1. 下载最新的OpenSSL源码(1.1版本)
  2. 用自己的8位学号建立一个文件夹,cd 你的学号,用pwd获得绝对路径
  3. 参考https://www.cnblogs.com/rocedu/p/5087623.html先在Ubuntu中完成OpenSSL编译安装,然后在OpenEuler中重现
    ./config --prefix=..(学号目录的绝对路径)指定OpenSSL编译链接
  4. 提交 test_openssl.c 编译运行截图

三、密码引擎-2-电子钥匙功能测试

  1. 在Ubuntu中运行 “龙脉密码钥匙驱动实例工具等\mToken-GM3000\skf\samples\linux_mac”中例程,提交运行结果截图
  2. 加分项:运行“龙脉密码钥匙驱动实例工具等\mToken-GM3000\skf\samples\windows”中例程,提交运行结果截图

四、密码引擎-4-国䀄算法交叉测试

1 在Ubuntu中使用OpenSSL用SM4算法加密上述文件,然后用龙脉eKey解密,提交代码和运行结果截图
2 在Ubuntu中基于OpenSSL产生一对公私钥对(SM2算法)
3 在Ubuntu中使用OpenSSL用SM3算法计算上述文件的Hash值,然后用OpenSSL SM2算法计算Hash值的签名,用龙脉eKey进行验签,提交代码和运行结果截图

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

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

SDLsecurity development lifecycle,即安全开发生命周期,是一种将安全融入到软件开发过程中的方法,被广泛应用于企业和政府机构的软件开发项目中。学习SDL有助于我们更好地了解安全开发生命周期的概念、原则和最佳实践,以及如何在软件开发中实现安全。**

一、安全开发生命周期概述

安全开发生命周期(SDL)是指在软件开发过程中,将安全性作为开发的一个关键目标,并根据需要,设计、开发、测试、部署和维护软件,以确保其安全性。SDL可以从需求分析开始,贯穿整个软件开发过程,直到最后的部署和维护。它包括以下六个基本阶段:

  1. 确定需求
  2. 设计安全性
  3. 编写安全代码
  4. 测试安全性
  5. 发布和部署
  6. 维护和更新

在每个阶段,SDL都会评估系统的安全风险,并采取必要的措施来减轻这些风险。

二、SDL的原则

SDL有一些核心原则,这些原则有助于确保软件开发过程中的安全性。

第一,安全应该是设计和开发的一个关键目标,而不是作为后期添加的一个附加项。

第二,SDL应该始终根据实际情况进行调整。不同的软件项目可能需要采取不同的安全措施。

第三,SDL应该始终保持灵活性。随着技术和威胁的发展,开发人员需要不断修正和更新安全策略。

第四,SDL应该使开发人员能够与安全专家紧密合作。这有助于确保开发人员对最新的安全威胁有所了解,以及在安全方面做出明智的决策。

三、SDL最佳实践

SDL的最佳实践有助于确保系统的安全性。这些最佳实践包括:

第一,在设计阶段就考虑安全。在该阶段,开发人员需要考虑所有可能的安全风险,并采取必要的措施来减轻这些风险。例如,应该考虑如何处理输入数据、如何管理权限和身份验证等问题。

第二,采用安全性最好的编程语言和框架。某些编程语言和框架比其他编程语言和框架更安全。

第三,使用安全的开发工具。开发人员应该使用文档、代码审查、静态代码分析工具等,来帮助减轻安全风险

第四,进行安全培训。开发团队应该受到充分的安全教育和培训,以了解最新的安全威胁和最佳实践,以及如何防范常见的攻击。

第五,定期进行安全测试。这包括漏洞评估、渗透测试等,可以帮助鉴定可能存在的安全漏洞并提供相应的修复建议。

第六,及时更新软件。开发人员应该随时关注相关的安全性更新和漏洞修补,及时更新软件版本,以修复已知的漏洞和安全问题。

四、SDL的优势

通过采用SDL,开发团队可以实现以下优势:

第一,提高软件的安全性。使用SDL方法可以在软件开发过程中获得更好地安全保障,从而减少相关安全漏洞和风险。

第二,提高生产力。采用SDL方法可以优化软件开发流程,因此可以提高生产效率和质量,并降低相关成本。

第三,提高用户满意度。由于采用SDL方法可以减少安全漏洞和风险,因此可以提高用户对产品安全性的信任感,从而提高用户满意度。

五、SDL的实施步骤

SDL的实施包括以下步骤:

第一步,确定需求。在该阶段,需要明确软件需求以及软件的预期用途和目标用户。

第二步,评估风险。在该阶段,需要评估软件可能面临的所有安全风险,并确定如何减轻这些风险。

第三步,设计安全性。在该阶段,需要制定相应的安全策略和安全控制措施,包括身份验证、访问控制

第四步,SDL可以帮助开发,编写安全代码。在该阶段,开发团队实现更好人员需要严格遵守相应的安全性最佳实践,并编写的安符合安全标准的代码。

六、SDL的具有安全性,但也存在一些挑战

安全开发生命周期面临的挑战如下:

1、 资源挑战:安全开发生命周期需要大量的人力和物力资源,由于这些资源的投入可能会影响产品的发布时间,因此组织在安全开发方面进行投资时需要权衡利弊。

2、知识挑战:显然,安全开发生命周期需要涉及很多领域的知识,因此开发团队需要具备广泛的知识,包括安全威胁、安全编码实践、网络安全等等,这些知识都需要长时间的学习和磨练。

3、文化挑战:在某些组织中,安全还没有被视为重要的事情,而是将其视为创新和速度的敌人,这需要改变企业文化,让组织更加注重安全。

4、流程挑战:开发生命周期在不同组织和项目之间有巨大的差异,因此需要根据组织的独特需求定制安全开发生命周期,以确保其有效性。

5、管理挑战:安全开发生命周期需要对开发团队进行监管和判断,以确保团队遵守安全开发准则和最佳实践,并采取必要的措施来纠正偏差。这需要一个有效的管理系统来实现。

二、电子公文传输系统

我们小组保护的数据有传递文件的路径以及用户的password,还对文件传递的过程对文件进行了加密保护。

你们小组项目中为了保护数据资产用的密码算法

实验感想

完成密码引擎的设计与实现,以及电子公文传输系统安全性设计方案与实现这两个实验,对我的学习和成长都有着很大的帮助。

首先,在实现密码引擎的过程中,我深入了解了密码学的基本原理,以及常用的加密算法和哈希函数。通过编写代码,我更加清晰地理解了这些概念的实际应用。

其次,在电子公文传输系统安全性设计方案与实现的实验中,我在经历了两个学期的学习之后,我学习到了很多东西,对于这个系统的实现虽然不是很完美,但是通过设计安全性方案和实现代码,我更加清晰地了解了如何保护信息的安全性和完整性。这对于未来从事信息安全相关工作的我来说,是非常有帮助的。

此外,在整个实验过程中,我也深刻体会到了实践的重要性。只有将理论知识与实际操作相结合,才能真正理解和掌握所学的内容。在实践中,我遇到了很多问题,但通过仔细思考和寻求教师和同学的帮助,我最终成功地完成了实验,并从中获得了很多有价值的经验。

总的来说,这两个实验让我对密码学和信息安全有了更深入的了解,也让我更加意识到实践的重要性。我相信这些经验和技能将对我未来的学习和职业生涯产生积极的影响。

posted on 2023-06-04 18:28  朴伤色  阅读(33)  评论(0编辑  收藏  举报