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