C++基礎(chǔ):OpenSSL常用函數(shù)(簽名與驗證)

字號:

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來簽名了。