第一部分
1.在 www.trustauth.cn、https://freessl.cn等网站上申请自己的数字证书,名称用自己的姓名,邮箱用自己的QQ邮箱。申请成功后,保存自己的pfx格式证书和cer格式证书(后缀名可能因提供证书服务的公司而异)。
这一题因为没有自己的域名,所以直接用老师给的本地的证书,就不进行申请了
2.使用程序SFT进行测试,测试“加密文件,签名,签名、加密”,“解密文件,验证签名,解密、验证签名”用自己的数字证书 和 2930508316@qq.com 的数字证书(包含2930508316@qq.com的私钥的证书是“2930508316@qq.com.pfx”,包含2930508316@qq.com的公钥的证书是“2930508316@qq.com.cer”)进行测试。要测试到签名文件被篡改的情况(在签名之后人工修改签名文件,验证签名时会提示有错)
截图为证:截取有代表性的图,放在下面:
3.“信息安全实验3.txt.S” 这个文件是用myteacherwei@qq.com的
私钥进行了签名,要求你验证签名,验证签名时需要用到myteacherwei@qq.com的公钥myteacherwei@qq.com.cer,把文件“信息安全实验3.txt”中的内容复制出来放在下面:
同学们:好好学习、天天向上!
第二部分
了解CryptoAPI编程(crypto_api_doc.pdf),尝试用CryptoAPI或OpenSSL或其它加解密编程接口写一个简单的加解密程序(完成本地文件的加密解密,参考SFT的本地文件加解密功能,要有界面),开发工具不限。
部分代码:
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0400
#endif
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <windows.h>
#include <wincrypt.h>
#include <iostream.h>
#define MY_ENCODING_TYPE (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)
#define KEYLENGTH 0x00800000
#define ENCRYPT_ALGORITHM CALG_RC4
#define ENCRYPT_BLOCK_SIZE 8
#include <iostream.h>
#include "Dec.h"
/*
功能:解密密文szSource文件,解密后的数据存储到szDestination文件中
*/
BOOL Dec::DecryptFile(
PCHAR szSource, //密文文件名
PCHAR szDestination, //解密后数据存储文件
PCHAR szPassword) //口令,即密码,其实口令和密码是两回事,了解一下就行了,作用一样
{
// 局部变量申明与初始化.
FILE *hSource;
FILE *hDestination;
HCRYPTPROV hCryptProv;
HCRYPTKEY hKey;
PBYTE pbBuffer;
DWORD dwBlockLen;
DWORD dwBufferLen;
DWORD dwCount;
BOOL status = FALSE;
// 打开密文文件.
if(!(hSource = fopen(szSource,"rb")))
{
cout<<"打开密文文件出错!"<<endl;
}
// 打开目标文件,用于存储解密后的数据.
if(!(hDestination = fopen(szDestination,"wb")))
{
cout<<"打开明文文件出错!"<<endl;
}
//获取加密服务者句柄
hCryptProv = GetCryptProv();
//获取或创建会话密钥
if(!szPassword|| strcmp(szPassword,"")==0 )
{
//从密文文件导入保存的会话密钥
hKey = GenKeyFromFile( hCryptProv,hSource);
}
else
{
// 通过输入密码重新创建会话密钥.
hKey=GenKeyByPassword( hCryptProv, szPassword);
}
// 计算一次解密的数据长度,它是ENCRYPT_BLOCK_SIZE 的整数倍
dwBlockLen = 1000 - 1000 % ENCRYPT_BLOCK_SIZE;
dwBufferLen = dwBlockLen;
// 分配内存空间.
if(!(pbBuffer = (BYTE *)malloc(dwBufferLen)))
{
cout<<"所需内存不够!"<<endl;
}
// 解密密文文件,解密后数据保存在目标文件
do {
// 每次从密文文件中读取dwBlockLen字节数据.
dwCount = fread(
pbBuffer,
1,
dwBlockLen,
hSource);
if(ferror(hSource))
{
cout<<"读取密文文件出错!"<<endl;
}
// 解密 数据
if(!CryptDecrypt(
hKey,
0,
feof(hSource),
0,
pbBuffer,
&dwCount))
{
cout<<"解密数据时出错!"<<endl;
}
// 把解密后的数据写入目标文件中.
fwrite(
pbBuffer,
1,
dwCount,
hDestination);
if(ferror(hDestination))
{
cout<<"把解密后的数据写入目标文件中时出错!"<<endl;
}
} while(!feof(hSource));
status = TRUE;
// 关闭文件
if(hSource)
{
if(fclose(hSource))
cout<<"关闭原文件出错"<<endl;
}
if(hDestination)
{
if(fclose(hDestination))
cout<<"关闭目标文件出错"<<endl;
}
// 释放内存空间
if(pbBuffer)
free(pbBuffer);
// 销毁会话密钥
if(hKey)
{
if(!(CryptDestroyKey(hKey)))
cout<<"销毁会话密钥时出错"<<endl;
}
// 释放CSP句柄
if(hCryptProv)
{
if(!(CryptReleaseContext(hCryptProv, 0)))
cout<<"释放CSP句柄时出错!"<<endl;
}
return status;
} // end Decryptfile
HCRYPTPROV Dec::GetCryptProv()
{
HCRYPTPROV hCryptProv; // 加密服务提供者句柄
//获取加密提供者句柄
if(CryptAcquireContext(
&hCryptProv, // 加密服务提供者句柄
NULL, // 密钥容器名,这里使用登陆用户名
MS_ENHANCED_PROV, // 加密服务提供者
PROV_RSA_FULL, // 加密服务提供者类型,可以提供加密和签名等功能
0)) // 标志
{
cout<<"加密服务提供者句柄获取成功!\n";//cout<<"加密服务提供者句柄获取成功"<<endl;
}
else
{
//重新建立一个新的密钥集
if(!CryptAcquireContext(&hCryptProv, NULL, MS_ENHANCED_PROV, PROV_RSA_FULL, CRYPT_NEWKEYSET))
{
cout<<"重新建立一个新的密钥集出错!"<<endl;
}
}
return hCryptProv;
}
HCRYPTKEY Dec::GenKeyFromFile(HCRYPTPROV hCryptProv,FILE* hSource)
{
HCRYPTKEY hKey;
PBYTE pbKeyBlob;
DWORD dwKeyBlobLen;
//从密文文件中获取密钥数据块长度,并分配内存空间.
fread(&dwKeyBlobLen, sizeof(DWORD), 1, hSource);
if(ferror(hSource) || feof(hSource))
{
cout<<"读取密文文件中密钥数据块长度出错!"<<endl;
}
if(!(pbKeyBlob = (BYTE *)malloc(dwKeyBlobLen)))
{
cout<<"内存分配出错"<<endl;
}
// 从密文文件中获取密钥数据块
fread(pbKeyBlob, 1, dwKeyBlobLen, hSource);
if(ferror(hSource) || feof(hSource))
{
cout<<"读取密文文件中密钥数据块出错!"<<endl;
}
// 导入会话密钥到 CSP.
if(!CryptImportKey(
hCryptProv,
pbKeyBlob,
dwKeyBlobLen,
0,
0,
&hKey))
{
cout<<"Error during CryptImportKey!"<<endl;
}
if(pbKeyBlob)
free(pbKeyBlob);
//返回导出的会话密钥
return hKey;
}
HCRYPTKEY Dec::GenKeyByPassword(HCRYPTPROV hCryptProv,PCHAR szPassword)
{
HCRYPTKEY hKey;
HCRYPTHASH hHash;
// 创建哈希句柄.
if(CryptCreateHash(
hCryptProv,
CALG_MD5,
0,
0,
&hHash))
{
cout<<"一个哈希句柄已经被创建. \n";
}
else
{
cout<<"Error during CryptCreateHash!"<<endl;
}
// 计算输入密码的哈希值.
if(CryptHashData(
hHash,
(BYTE *)szPassword,
strlen(szPassword),
0))
{
cout<<"此密码已经被添加到了哈希表中. \n";
}
else
{
cout<<"Error during CryptHashData"<<endl;
}
// 通过哈希值创建会话密钥.
if(CryptDeriveKey(
hCryptProv,
ENCRYPT_ALGORITHM,
hHash,
KEYLENGTH,
&hKey))
{
cout<<"从这个密码的哈希值获得了一个加密密钥. \n";
}
else
{
cout<<"哈希值创建会话密钥时出错!"<<endl;
}
// 销毁哈希句柄.
if(hHash)
{
if(!(CryptDestroyHash(hHash)))
cout<<"销毁哈希句柄时出错"<<endl;
hHash = 0;
}
//返回创建的会话密钥
return hKey;
}
3.在桌面创建一个文件
4.对文件加密
5.对文件解密
6.查看效果
源文件: https://download.csdn.net/download/m0_51278236/86707124