OpenSSL中的驗(yàn)證是先對(duì)原始數(shù)據(jù)計(jì)算摘要, 再對(duì)摘要進(jìn)行私鑰加密. 驗(yàn)證的過(guò)程是對(duì)原始消息計(jì)算摘要,解密驗(yàn)證值, 和摘要對(duì)比是否一致.如果一致, 說(shuō)明驗(yàn)證有效:否則,則認(rèn)為原文或驗(yàn)證值已經(jīng)被篡改.
函數(shù)介紹:
因?yàn)橐葘?duì)原始數(shù)據(jù)計(jì)算摘要, 所以在計(jì)算摘要時(shí)用的函數(shù)是計(jì)算摘要的函數(shù)一樣. 最后在結(jié)束函數(shù)中進(jìn)行驗(yàn)證或驗(yàn)證. 為了方便描述, OpenSSL對(duì)計(jì)算摘要函數(shù)進(jìn)行了宏定義封裝.下邊是函數(shù)定義:
1、 簽名初始化函數(shù)
#define EVP_SignInit_ex(a, b, c) EVP_DigestInit_ex(a, b, c)
Int EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE *imp1);
2、 簽名更新函數(shù)
#define EVP_SignUpdate(a, b, c) EVP_DigestUpdate(a, b, c)
Int EVP_DigestUpdate(EVP_MD_CTX *ctx, const *d, size_t cnt);
3、 簽名結(jié)束函數(shù)
Int EVP_SignFinal(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *s, EVP_PKey pkey);
功能:計(jì)算簽名結(jié)束, 輸出簽名值。
參數(shù)說(shuō)明:
Ctx:[IN]上下文變量
Md:[OUT] 簽名結(jié)果輸出值的指針 s:[OUT] 簽名的長(zhǎng)度
Pkey:[IN] 簽名的私鑰。(*后面有私鑰的計(jì)算過(guò)程)
4、 驗(yàn)證初始化函數(shù) (* 跟簽名調(diào)用同一個(gè)函數(shù))
#define EVP_VerifyInit_ex(a, b, c) EVP_DigestInit_ex(a, b, c)
Int EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE *imp1);
5、 驗(yàn)證更新函數(shù)(* 跟簽名調(diào)用同一個(gè)函數(shù))
#define EVP_VerifyUpdate(a, b, c) EVP_DigestUpdate(a, b, c)
Int EVP_DigestUpdate(EVP_MD_CTX *ctx, const *d, size_t cnt);
6、 驗(yàn)證結(jié)束函數(shù)
Int EVP_VerifyFinal(EVP_MD_CTX *ctx, const unsigned char *sigbuf, unsigned int siglen, EVP_PKey pkey);
功能:計(jì)算驗(yàn)證結(jié)束, 考試大提示輸出驗(yàn)證值。
參數(shù)說(shuō)明:
Ctx:[IN]上下文變量
sigbuf:[IN] 簽名值 siglen:[IN] 簽名的長(zhǎng)度
Pkey:[IN] 驗(yàn)證簽名的公鑰。
計(jì)算私鑰過(guò)程: 直接寫(xiě)代碼出來(lái)(*下面的代碼如果按百分算的話,最多只能得三十分, 所以不要照搬, 我這么寫(xiě)只是想把過(guò)程說(shuō)得簡(jiǎn)單清楚點(diǎn))
RSA rsa = RSA_generate_key(1024, RSA_F4, NULL, NULL);//產(chǎn)生一個(gè)1024位的RSA密鑰
EVP_PKEY *evpKey = EVP_PKEY_new(); //新建一個(gè)EVP_PKEY變量
EVP_PKEY_set1_RSA(evpKey, rsa); //保存RSA結(jié)構(gòu)體到EVP_PKEY結(jié)構(gòu)體
//完成任務(wù)后面就可以用evpKey來(lái)簽名了。
函數(shù)介紹:
因?yàn)橐葘?duì)原始數(shù)據(jù)計(jì)算摘要, 所以在計(jì)算摘要時(shí)用的函數(shù)是計(jì)算摘要的函數(shù)一樣. 最后在結(jié)束函數(shù)中進(jìn)行驗(yàn)證或驗(yàn)證. 為了方便描述, OpenSSL對(duì)計(jì)算摘要函數(shù)進(jìn)行了宏定義封裝.下邊是函數(shù)定義:
1、 簽名初始化函數(shù)
#define EVP_SignInit_ex(a, b, c) EVP_DigestInit_ex(a, b, c)
Int EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE *imp1);
2、 簽名更新函數(shù)
#define EVP_SignUpdate(a, b, c) EVP_DigestUpdate(a, b, c)
Int EVP_DigestUpdate(EVP_MD_CTX *ctx, const *d, size_t cnt);
3、 簽名結(jié)束函數(shù)
Int EVP_SignFinal(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *s, EVP_PKey pkey);
功能:計(jì)算簽名結(jié)束, 輸出簽名值。
參數(shù)說(shuō)明:
Ctx:[IN]上下文變量
Md:[OUT] 簽名結(jié)果輸出值的指針 s:[OUT] 簽名的長(zhǎng)度
Pkey:[IN] 簽名的私鑰。(*后面有私鑰的計(jì)算過(guò)程)
4、 驗(yàn)證初始化函數(shù) (* 跟簽名調(diào)用同一個(gè)函數(shù))
#define EVP_VerifyInit_ex(a, b, c) EVP_DigestInit_ex(a, b, c)
Int EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE *imp1);
5、 驗(yàn)證更新函數(shù)(* 跟簽名調(diào)用同一個(gè)函數(shù))
#define EVP_VerifyUpdate(a, b, c) EVP_DigestUpdate(a, b, c)
Int EVP_DigestUpdate(EVP_MD_CTX *ctx, const *d, size_t cnt);
6、 驗(yàn)證結(jié)束函數(shù)
Int EVP_VerifyFinal(EVP_MD_CTX *ctx, const unsigned char *sigbuf, unsigned int siglen, EVP_PKey pkey);
功能:計(jì)算驗(yàn)證結(jié)束, 考試大提示輸出驗(yàn)證值。
參數(shù)說(shuō)明:
Ctx:[IN]上下文變量
sigbuf:[IN] 簽名值 siglen:[IN] 簽名的長(zhǎng)度
Pkey:[IN] 驗(yàn)證簽名的公鑰。
計(jì)算私鑰過(guò)程: 直接寫(xiě)代碼出來(lái)(*下面的代碼如果按百分算的話,最多只能得三十分, 所以不要照搬, 我這么寫(xiě)只是想把過(guò)程說(shuō)得簡(jiǎn)單清楚點(diǎn))
RSA rsa = RSA_generate_key(1024, RSA_F4, NULL, NULL);//產(chǎn)生一個(gè)1024位的RSA密鑰
EVP_PKEY *evpKey = EVP_PKEY_new(); //新建一個(gè)EVP_PKEY變量
EVP_PKEY_set1_RSA(evpKey, rsa); //保存RSA結(jié)構(gòu)體到EVP_PKEY結(jié)構(gòu)體
//完成任務(wù)后面就可以用evpKey來(lái)簽名了。