最近花了些时间研究了一下数字签名,因为电子签名在当今时代太重要了,电子商务、网上银行、电子政务等,许多领域都离不开它。说到电子签名,首先要介绍几个基本概念。
一、对称加密
所谓对称加密,就是加密与解密使用同样的钥匙。对称加密的特点:加密效率高,速度快,但是由于加解密使用同样的钥匙,如果保护密钥的安全是个问题。
另:基于Key的加密方式是加密学的极大一个进步,因为Key的更换是很容易的,而算法的开发、更换是成本较高的。
二、非对称加密
所谓非对称加密,就是加密与解密使用不同的密钥。最常见的算法是RSA,以发明者命名。用一把钥匙加密,则要用另外一把解密。两把钥匙一把为私钥(自已用,自已掌握)、一把为公钥(大家用,用的人都知道)。
三、摘要算法
对文本或文件,计算出一段固定长度信息,称之为摘要信息,常用的算法用:MD5,SHA1。不同的文本或者文件摘要不同,摘要信息就如同文档的指纹一样。
所谓的电子签名,就是先对文档计算摘要信息,然后使用私钥加密,这个过程就是电子签名。验证电子签名的时候,使用公钥解密签名信息得到摘要信息,然后再自行对文档计算一次摘要信息。两个摘要信息相同,则称为电子签名吻合。如果两个摘要信息相同,则说明文档未被修改过,且是由签名者发出。
电子签名与文件签名有相同之处,采用电子签名也能确认以下两点:
第一,信息是由签名者发出的;
第二,信息由签发后到收到为止未曾做过任何修改。
开发电子签名程序有两种常见的方法,一种是使用开源的openssl库,一种是使用微软的cryptoAPI。
openssl相对好入门一点,而且可以跨平台,是开发者的首选。
网上用许多使用openssl开发签名程序的例子,但多数签名后直接验证,过程讲解不够清晰,而且不包括读取私钥、公钥功能,不够全面。我使用openssl开发包做了一个较完整的签名及验证的原形程序。将签名及验证分成两个部分,签名后,可以直接验证,当然是成功的了;也可以修改签名对象、或者签名信息,再进行验证,看是否成功。
两个核心函数如下,整个程序,请到我的网络硬盘下载(http://wallimn.ys168.com
)
读取私钥的函数:
EVP_PKEY *LoadPrivateKey(const char *filename,const char * password)
{
BIO *bp;
EVP_PKEY *pkey;
if ((bp = BIO_new(BIO_s_file())) == NULL)
{
return (NULL);
}
BIO_read_filename(bp, filename);
if ((pkey = PEM_read_bio_PrivateKey(bp, NULL, NULL, (char *)password))
== NULL)
{
BIO_free(bp);
return (NULL);
}
BIO_free(bp);
return (pkey);
}
读取公钥的函数:
EVP_PKEY *LoadPublicKey(const char *filename)
{
FILE *fp;
fp = fopen(filename,"rb");
if(fp==NULL){
return NULL;
}
unsigned char derCert[4096];
unsigned long derCertLen;
derCertLen = fread(derCert,1,sizeof(derCert)/sizeof(derCert[0]),fp);
fclose(fp);
const unsigned char *pTmp = derCert;
X509 *x= d2i_X509(NULL,&pTmp,derCertLen);
if(x==NULL){
ERR_load_ERR_strings();
ERR_load_crypto_strings();
ERR_print_errors_fp(stderr);
return NULL;
}
EVP_PKEY *pubKey =X509_get_pubkey(x);
return pubKey;
}
***********本人原创,欢迎转载,转载请保留本人信息*************/
作者:wallimn
电邮:wallimn@sohu.com
博客:http://blog.csdn.net/wallimn
/***********本人原创,欢迎转载,转载请保留本人信息*************/
分享到:
相关推荐
而OpenSSL是一个强大的安全套接层(SSL)和传输层安全(TLS)协议实现库,包含了各种加密算法、证书管理功能以及SSL协议,并提供了丰富的应用程序供测试或其他目的使用。本篇将详细介绍如何在Qt中利用OpenSSL实现RSA...
在Linux环境下,C语言通过OpenSSL库实现SHA1WithRSA签名和验证是常见的加密操作,主要涉及以下几个核心知识点: 1. **OpenSSL库**:OpenSSL是一个强大的安全套接字层密码库,包含各种主要的密码算法、常用的密钥和...
基于OpenSSL库实现RSA的加密、解密、签名和验证签名是常见的实践方法。OpenSSL是一个强大的安全套接层(SSL/TLS)和通用加密库,提供了包括RSA在内的多种加密算法。 1. **RSA加密**:RSA加密过程基于两个大素数的...
基于VC6的openssl库, (1) lib\libeay32.lib及lib\ssleay32.lib是已经编译好的VC6可用的静态库, 只要把这两个文件拷到VC6的lib目录中即可。 (2) include\openssl是openssl相关的头文件, 只要把openssl这个文件夹...
使用 OpenSSL 命令可以生成证书和自签名,以下是相关知识点的总结: 一、预安装准备 在开始使用 OpenSSL 之前,需要安装相关的软件和工具。首先,需要安装 Visual Studio 2005,因为 OpenSSL 的编译需要使用 VC++ ...
这里`no-shared`表示不生成动态库,`--prefix`指定安装路径,`VC6`指明使用VC6编译器。 4. 执行`msdoom`命令开始编译。 5. 完成编译后,使用`nmake install`命令将库文件、头文件等安装到指定路径。 6. 编译完成后...
利用OPENSSL,实现用国标SM2进行签名和验签名操作
本文将深入探讨如何使用OpenSSL库在C++中实现RSA加密、解密以及签名和验签功能,特别关注SHA256WithRSA这一安全强度更高的签名方法。 首先,RSA的核心原理是基于大整数因子分解的困难性。它包含一对密钥,即公钥和...
4. **预处理**:在命令行中使用VC6的预处理器`nmake`或`msbuild`进行预处理,生成Makefile,这通常涉及到运行`Configure`脚本并指定目标平台和编译选项,例如: ``` Configure VC-WIN32 ``` 5. **编译动态库**:...
实现数字签名和密钥交换,公钥加密没有实现。全部源代码,需要Openssl库支持,VC工程。 KDF使用标准HASH算法,没有使用SM3。 可参考作者的SM3算法实现KDF。 ECC曲线使用SM2算法建议曲线,内含SM2建议曲线测试。 仅...
在IT行业中,加密和安全通信是至关...这个过程可能会遇到各种问题,但通过理解OpenSSL的构建过程和VC2013的特性,我们可以逐步解决这些问题,实现成功移植。希望这个指南能对你和其他开发者在进行类似工作时提供帮助。
4) 使用VC6的nmake工具或Visual Studio的解决方案进行编译。 5) 编译完成后,会得到.lib和.h头文件,这些就是静态库和对应的接口定义。 **4. 使用OpenSSL静态库** 在项目中使用OpenSSL静态库,需要将生成的.lib...
OpenSSL 是一个强大的安全套接层(SSL)和传输层安全(TLS)协议实现库,同时也包含了一系列用于加密、解密、签名、验证等安全操作的实用工具。OpenSSL 1.0.2o 版本是该库的一个稳定版本,提供了对 SSLv3、TLSv1.0、...
vc++ openssl 实现加密des
通常,OpenSSL 使用 nmake 编译器进行构建,但这种方法无法实现调试功能。为了能够在开发过程中进行调试,我们需要将编译过程与 VC 工程集成,这样就可以利用 VS2008 的调试器进行程序的单步调试和错误排查。 描述...
编译64位静态库则使用 `config --prefix=C:\openssl-1.1.1k --openssldir=C:\openssl-1.1.1k VC-WIN64A no-shared`。 4. **编译和安装**:运行 `nmake` 进行编译,完成后运行 `nmake install` 安装到指定路径。 5....
本篇主要围绕"openssl vc 编程实例"这一主题,探讨如何使用Visual C++(简称VC)进行OpenSSL的客户端和服务端程序开发。 首先,OpenSSL中的`s_server`和`s_client`是两个核心命令行工具,分别代表服务器端和客户端...
《Visual Studio 2019下使用VC-LTL构建OpenSSL的详解》 在软件开发领域,OpenSSL是一个广泛使用的开源库,它提供了强大的加密和安全功能,包括SSL/TLS协议,以及各种加密算法。然而,与OpenSSL的使用相关的挑战之一...
在给定的标题"vc6.0+openssl实现MD5加密器源码"中,我们讨论的是使用Visual C++ 6.0(简称VC6.0)编译器以及OpenSSL库来实现一个MD5加密器的源代码项目。VC6.0是微软发布的一款经典C++开发工具,虽然现在已经有些...
在VC6环境下,我们可以使用如OpenSSL等开源库来实现电子签章功能。OpenSSL提供了丰富的公钥基础设施(PKI)支持,包括RSA、DSA等加密算法。首先,我们需要创建一对公钥和私钥,私钥由签名人保管,公钥可以公开。然后...