OpenSSL中的驗證是先對原始數(shù)據(jù)計算摘要, 再對摘要進(jìn)行私鑰加密. 驗證的過程是對原始消息計算摘要,解密驗證值, 和摘要對比是否一致.如果一致, 說明驗證有效:否則,則認(rèn)為原文或驗證值已經(jīng)被篡改.
函數(shù)介紹:
因為要先對原始數(shù)據(jù)計算摘要, 所以在計算摘要時用的函數(shù)是計算摘要的函數(shù)一樣. 最后在結(jié)束函數(shù)中進(jìn)行驗證或驗證. 為了方便描述, OpenSSL對計算摘要函數(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);
功能:計算簽名結(jié)束, 輸出簽名值。
參數(shù)說明:
Ctx:[IN]上下文變量
Md:[OUT] 簽名結(jié)果輸出值的指針 s:[OUT] 簽名的長度
Pkey:[IN] 簽名的私鑰。(*后面有私鑰的計算過程)
4、 驗證初始化函數(shù) (* 跟簽名調(diào)用同一個函數(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、 驗證更新函數(shù)(* 跟簽名調(diào)用同一個函數(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、 驗證結(jié)束函數(shù)
Int EVP_VerifyFinal(EVP_MD_CTX *ctx, const unsigned char *sigbuf, unsigned int siglen, EVP_PKey pkey);
功能:計算驗證結(jié)束, 考試大提示輸出驗證值。
參數(shù)說明:
Ctx:[IN]上下文變量
sigbuf:[IN] 簽名值 siglen:[IN] 簽名的長度
Pkey:[IN] 驗證簽名的公鑰。
計算私鑰過程: 直接寫代碼出來(*下面的代碼如果按百分算的話,最多只能得三十分, 所以不要照搬, 我這么寫只是想把過程說得簡單清楚點)
RSA rsa = RSA_generate_key(1024, RSA_F4, NULL, NULL);//產(chǎn)生一個1024位的RSA密鑰
EVP_PKEY *evpKey = EVP_PKEY_new(); //新建一個EVP_PKEY變量
EVP_PKEY_set1_RSA(evpKey, rsa); //保存RSA結(jié)構(gòu)體到EVP_PKEY結(jié)構(gòu)體
//完成任務(wù)后面就可以用evpKey來簽名了。
函數(shù)介紹:
因為要先對原始數(shù)據(jù)計算摘要, 所以在計算摘要時用的函數(shù)是計算摘要的函數(shù)一樣. 最后在結(jié)束函數(shù)中進(jìn)行驗證或驗證. 為了方便描述, OpenSSL對計算摘要函數(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);
功能:計算簽名結(jié)束, 輸出簽名值。
參數(shù)說明:
Ctx:[IN]上下文變量
Md:[OUT] 簽名結(jié)果輸出值的指針 s:[OUT] 簽名的長度
Pkey:[IN] 簽名的私鑰。(*后面有私鑰的計算過程)
4、 驗證初始化函數(shù) (* 跟簽名調(diào)用同一個函數(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、 驗證更新函數(shù)(* 跟簽名調(diào)用同一個函數(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、 驗證結(jié)束函數(shù)
Int EVP_VerifyFinal(EVP_MD_CTX *ctx, const unsigned char *sigbuf, unsigned int siglen, EVP_PKey pkey);
功能:計算驗證結(jié)束, 考試大提示輸出驗證值。
參數(shù)說明:
Ctx:[IN]上下文變量
sigbuf:[IN] 簽名值 siglen:[IN] 簽名的長度
Pkey:[IN] 驗證簽名的公鑰。
計算私鑰過程: 直接寫代碼出來(*下面的代碼如果按百分算的話,最多只能得三十分, 所以不要照搬, 我這么寫只是想把過程說得簡單清楚點)
RSA rsa = RSA_generate_key(1024, RSA_F4, NULL, NULL);//產(chǎn)生一個1024位的RSA密鑰
EVP_PKEY *evpKey = EVP_PKEY_new(); //新建一個EVP_PKEY變量
EVP_PKEY_set1_RSA(evpKey, rsa); //保存RSA結(jié)構(gòu)體到EVP_PKEY結(jié)構(gòu)體
//完成任務(wù)后面就可以用evpKey來簽名了。

