`

用Openssl实现电子签名(VC)

阅读更多

 

最近花了些时间研究了一下数字签名,因为电子签名在当今时代太重要了,电子商务、网上银行、电子政务等,许多领域都离不开它。说到电子签名,首先要介绍几个基本概念。
一、对称加密
所谓对称加密,就是加密与解密使用同样的钥匙。对称加密的特点:加密效率高,速度快,但是由于加解密使用同样的钥匙,如果保护密钥的安全是个问题。
另:基于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

网络硬盘:http://wallimn.ys168.com
时间:2008-9-13
/***********本人原创,欢迎转载,转载请保留本人信息*************/
2
0
分享到:
评论

相关推荐

    Qt利用OpenSSl实现RSA数字签名

    而OpenSSL是一个强大的安全套接层(SSL)和传输层安全(TLS)协议实现库,包含了各种加密算法、证书管理功能以及SSL协议,并提供了丰富的应用程序供测试或其他目的使用。本篇将详细介绍如何在Qt中利用OpenSSL实现RSA...

    linux c 使用openssl实现SHA1WithRSA实现,签名,验签

    在Linux环境下,C语言通过OpenSSL库实现SHA1WithRSA签名和验证是常见的加密操作,主要涉及以下几个核心知识点: 1. **OpenSSL库**:OpenSSL是一个强大的安全套接字层密码库,包含各种主要的密码算法、常用的密钥和...

    基于openssl的RSA的加密,解密,签名和验证签名

    基于OpenSSL库实现RSA的加密、解密、签名和验证签名是常见的实践方法。OpenSSL是一个强大的安全套接层(SSL/TLS)和通用加密库,提供了包括RSA在内的多种加密算法。 1. **RSA加密**:RSA加密过程基于两个大素数的...

    Openssl.rar_C++_VC6_openssl vc6_openssl 静态库

    基于VC6的openssl库, (1) lib\libeay32.lib及lib\ssleay32.lib是已经编译好的VC6可用的静态库, 只要把这两个文件拷到VC6的lib目录中即可。 (2) include\openssl是openssl相关的头文件, 只要把openssl这个文件夹...

    用openssl命令制作生成证书和自签名

    使用 OpenSSL 命令可以生成证书和自签名,以下是相关知识点的总结: 一、预安装准备 在开始使用 OpenSSL 之前,需要安装相关的软件和工具。首先,需要安装 Visual Studio 2005,因为 OpenSSL 的编译需要使用 VC++ ...

    openssl1.02o的vc6编译静态动态库+lib.pdb调试文件

    这里`no-shared`表示不生成动态库,`--prefix`指定安装路径,`VC6`指明使用VC6编译器。 4. 执行`msdoom`命令开始编译。 5. 完成编译后,使用`nmake install`命令将库文件、头文件等安装到指定路径。 6. 编译完成后...

    Openssl实现SM2非对称签名

    利用OPENSSL,实现用国标SM2进行签名和验签名操作

    C++使用Openssl进行RSA加密解密及签名验签功能(SHA256)

    本文将深入探讨如何使用OpenSSL库在C++中实现RSA加密、解密以及签名和验签功能,特别关注SHA256WithRSA这一安全强度更高的签名方法。 首先,RSA的核心原理是基于大整数因子分解的困难性。它包含一对密钥,即公钥和...

    OpenSSL1.0.1e,VC6编译动态库和静态库

    4. **预处理**:在命令行中使用VC6的预处理器`nmake`或`msbuild`进行预处理,生成Makefile,这通常涉及到运行`Configure`脚本并指定目标平台和编译选项,例如: ``` Configure VC-WIN32 ``` 5. **编译动态库**:...

    国密SM2算法基于Openssl实现

    实现数字签名和密钥交换,公钥加密没有实现。全部源代码,需要Openssl库支持,VC工程。 KDF使用标准HASH算法,没有使用SM3。 可参考作者的SM3算法实现KDF。 ECC曲线使用SM2算法建议曲线,内含SM2建议曲线测试。 仅...

    openssl 1.0.1k 移植到vc2013

    在IT行业中,加密和安全通信是至关...这个过程可能会遇到各种问题,但通过理解OpenSSL的构建过程和VC2013的特性,我们可以逐步解决这些问题,实现成功移植。希望这个指南能对你和其他开发者在进行类似工作时提供帮助。

    openssl-vc6静态库

    4) 使用VC6的nmake工具或Visual Studio的解决方案进行编译。 5) 编译完成后,会得到.lib和.h头文件,这些就是静态库和对应的接口定义。 **4. 使用OpenSSL静态库** 在项目中使用OpenSSL静态库,需要将生成的.lib...

    openssl 1.0.2o经vc6.0编译过的源码和.dll

    OpenSSL 是一个强大的安全套接层(SSL)和传输层安全(TLS)协议实现库,同时也包含了一系列用于加密、解密、签名、验证等安全操作的实用工具。OpenSSL 1.0.2o 版本是该库的一个稳定版本,提供了对 SSLv3、TLSv1.0、...

    des.rar_VC Openssl DES_des openssl_java openssl des_openssl vc

    vc++ openssl 实现加密des

    openssl0.9.8 vc可编译代码

    通常,OpenSSL 使用 nmake 编译器进行构建,但这种方法无法实现调试功能。为了能够在开发过程中进行调试,我们需要将编译过程与 VC 工程集成,这样就可以利用 VS2008 的调试器进行程序的单步调试和错误排查。 描述...

    openssl1.1.1k-vc10.rar

    编译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 编程实例

    本篇主要围绕"openssl vc 编程实例"这一主题,探讨如何使用Visual C++(简称VC)进行OpenSSL的客户端和服务端程序开发。 首先,OpenSSL中的`s_server`和`s_client`是两个核心命令行工具,分别代表服务器端和客户端...

    VS2019_VC_LTL_x86_OpenSSL.zip

    《Visual Studio 2019下使用VC-LTL构建OpenSSL的详解》 在软件开发领域,OpenSSL是一个广泛使用的开源库,它提供了强大的加密和安全功能,包括SSL/TLS协议,以及各种加密算法。然而,与OpenSSL的使用相关的挑战之一...

    vc6.0+openssl实现MD5加密器源码

    在给定的标题"vc6.0+openssl实现MD5加密器源码"中,我们讨论的是使用Visual C++ 6.0(简称VC6.0)编译器以及OpenSSL库来实现一个MD5加密器的源代码项目。VC6.0是微软发布的一款经典C++开发工具,虽然现在已经有些...

    电子签章的实现 VC6源码

    在VC6环境下,我们可以使用如OpenSSL等开源库来实现电子签章功能。OpenSSL提供了丰富的公钥基础设施(PKI)支持,包括RSA、DSA等加密算法。首先,我们需要创建一对公钥和私钥,私钥由签名人保管,公钥可以公开。然后...

Global site tag (gtag.js) - Google Analytics