//#include "stdafx.h"
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#pragma comment(lib, "libeay32.lib")
#pragma comment(lib, "ssleay32.lib")
/*pkcs7sign.cpp
auth:kagula
功能:呼叫openssl實現數字簽名功能例程(二)
環境:vs2008+sp1,openssl1.0.1
*//*
功能:初始化openssl
*/void initopenssl()
/*功能:對length長度的input指向的記憶體塊進行base64編碼
入口:const void *input 指向記憶體塊的指標
int length 記憶體塊的有效長度
返回:char * 返回字串指標,使用完畢後,必須用free函式釋放。
*/char *base64(const void *input, int length)
/*功能:base64解碼
入口:char *inputbase64 base64編碼的簽名
void *retbuf 快取大小
返回:void *retbuf 解碼後資料存放在這塊記憶體中
int *retbuflen 解碼後資料的長度
*/void *decodebase64(char *inputbase64, void *retbuf,int *retbuflen)
while( err==1 && i<*retbuflen );
bio_free_all(bmem);
*retbuflen = --i;
return retbuf;}/*
功能:對明文進行簽名
入口:char*certfile 證書(例如:***.pfx)
char* pwd 證書的密碼
char* plaintext 待簽名的字串
int flag 簽名方式
出口:char * 簽名後的資料以base64形式返回
使用完畢後,必須用free函式釋放。
*/char * pkcs7_getsign(char*certfile,char* pwd, char* plaintext,int flag)
pkcs12 *p12= d2i_pkcs12_fp(fp, null);
fclose (fp);
if (!p12)
//取pkey物件、x509證書、證書鏈
evp_pkey *pkey=null;
x509 *x509=null;
stack_of(x509) *ca = null;
if (!pkcs12_parse(p12, pwd, &pkey, &x509, &ca))
pkcs12_free(p12);
//明文轉為bio物件
//《vc++網路安全程式設計範例(14)-openssl bio程式設計 》
bio *bio = bio_new(bio_s_mem());
bio_puts(bio,plaintext);
//數字簽名
//pkcs7_nochain:簽名中不包含證書鏈,第三個引數為null值的話,可不加這個flag標記
//pkcs7_nosmimecap:簽名不需要支援smime
pkcs7* pkcs7 = pkcs7_sign(x509,pkey, ca,bio, flag);
if(pkcs7==null)
//共有兩種編碼,一種是asn1,另一種是der編碼。
//取資料簽名(der格式)
//openssl學習筆記之pkcs7-data內容型別的編碼解碼
////入口:pkcs7物件
//出口:der物件
unsigned char *der;
unsigned char *dertmp;
unsigned long derlen;
derlen = i2d_pkcs7(pkcs7,null);
der = (unsigned char *) malloc(derlen);
memset(der,0,derlen);
dertmp = der;
i2d_pkcs7(pkcs7,&dertmp);
//der轉base64
return base64(der,derlen);}/*
功能:驗證簽名
入口:char*certfile 證書(含匙)
char* plaintext 明文
char* ciphertext 簽名
出口:bool true 簽名驗證成功
bool false 驗證失敗
*/bool pkcs7_verifysign(char*certfile,char* plaintext,char* ciphertext )
//base64解碼
unsigned char *retbuf[1024*8];
int retbuflen = sizeof(retbuf);
memset(retbuf,0,sizeof(retbuf));
decodebase64(ciphertext,(void *)retbuf,&retbuflen);
//從簽名中取pkcs7物件
bio* vin = bio_new_mem_buf(retbuf,retbuflen);
pkcs7 *p7 = d2i_pkcs7_bio(vin,null);
//取stack_of(x509)物件
stack_of(x509) *stack=sk_x509_new_null();//x509_store_new()
sk_x509_push(stack,x509);
//明碼資料轉為bio
bio *bio = bio_new(bio_s_mem());
bio_puts(bio,plaintext);
//驗證簽名
int err = pkcs7_verify(p7, stack, null,bio, null, pkcs7_noverify);
if (err != 1)
return true;
}int main(int argc, char* argv)
/*關於openssl的補充參考資料
[1]convert a pkcs 12 cert to pem format .
*/
openssl 命令列實現數字簽名
一 傳送方a 生成私鑰 openssl genrsa passout pass 123456 out apri.pem 1024 生成公鑰 openssl rsa passin pass 123456 pubout in apri.pem out apub.pem 用b的公鑰加密資料 openssl...
實現數字簽名
數字簽名演算法 dsa,digital signature algorithm 是一種公開金鑰演算法,不能用於加密,只能用於數字簽名。主要用作為接收者驗證數字的完整性和資料傳送者的身份,dsa演算法的安全性基於解離散對數的困難性。package main import crypto dsa cryp...
C 實現數字簽名
c 實現數字簽名 using system using system.collections.generic using system.windows.forms using system.security.cryptography namespace dsaexample private void...