呼叫OpenSSL實現數字簽名功能例程(二)

2021-06-27 05:05:16 字數 3511 閱讀 8439

//#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...