溫馨提示×

如何利用OpenSSL進行數字簽名驗證

小樊
46
2025-08-15 19:03:15
欄目: 云計算

使用OpenSSL進行數字簽名驗證的步驟如下:

準備工作

  1. 獲取公鑰

    • 確保你有簽名者的公鑰文件(通常是.pem格式)。
  2. 獲取簽名文件和原始數據

    • 簽名文件(通常是.sig.pem格式)。
    • 原始數據文件(可以是任意格式,如文本文件)。

驗證步驟

方法一:使用OpenSSL命令行工具

  1. 驗證簽名

    openssl dgst -sha256 -verify public_key.pem -signature signature_file.sig original_data_file
    
    • -sha256:指定使用的哈希算法(根據實際情況選擇,如SHA-1、SHA-256等)。
    • -verify public_key.pem:指定公鑰文件。
    • -signature signature_file.sig:指定簽名文件。
    • original_data_file:指定原始數據文件。
  2. 解釋輸出

    • 如果驗證成功,輸出將顯示Verified OK。
    • 如果驗證失敗,輸出將顯示Verification Failure。

方法二:使用OpenSSL編程接口(C語言示例)

如果你需要在程序中進行數字簽名驗證,可以使用OpenSSL的API。以下是一個簡單的C語言示例:

#include <openssl/rsa.h>
#include <openssl/pem.h>
#include <openssl/sha.h>
#include <openssl/err.h>
#include <stdio.h>
#include <stdlib.h>

int verify_signature(const char *public_key_file, const char *signature_file, const char *original_data_file) {
    FILE *fp = fopen(public_key_file, "r");
    if (!fp) {
        perror("Unable to open public key file");
        return 0;
    }

    RSA *rsa = PEM_read_RSA(fp, NULL, NULL, NULL);
    fclose(fp);
    if (!rsa) {
        fprintf(stderr, "Error reading public key\n");
        return 0;
    }

    fp = fopen(signature_file, "rb");
    if (!fp) {
        perror("Unable to open signature file");
        RSA_free(rsa);
        return 0;
    }

    unsigned char *signature = malloc(RSA_size(rsa));
    size_t signature_len = fread(signature, 1, RSA_size(rsa), fp);
    fclose(fp);
    if (signature_len != RSA_size(rsa)) {
        fprintf(stderr, "Error reading signature\n");
        free(signature);
        RSA_free(rsa);
        return 0;
    }

    fp = fopen(original_data_file, "rb");
    if (!fp) {
        perror("Unable to open original data file");
        free(signature);
        RSA_free(rsa);
        return 0;
    }

    unsigned char *data = malloc(RSA_size(rsa));
    size_t data_len = fread(data, 1, RSA_size(rsa), fp);
    fclose(fp);
    if (data_len != RSA_size(rsa)) {
        fprintf(stderr, "Error reading original data\n");
        free(signature);
        free(data);
        RSA_free(rsa);
        return 0;
    }

    int result = RSA_verify(NID_sha256, data, data_len, signature, signature_len, rsa);
    free(signature);
    free(data);
    RSA_free(rsa);

    if (result == 1) {
        printf("Verification successful\n");
        return 1;
    } else if (result == 0) {
        printf("Verification failed\n");
        return 0;
    } else {
        fprintf(stderr, "Verification error: %s\n", ERR_error_string(ERR_get_error(), NULL));
        return 0;
    }
}

int main() {
    const char *public_key_file = "public_key.pem";
    const char *signature_file = "signature_file.sig";
    const char *original_data_file = "original_data_file";

    verify_signature(public_key_file, signature_file, original_data_file);

    return 0;
}

注意事項

  • 確保所有文件路徑正確。
  • 根據實際情況選擇合適的哈希算法。
  • 處理可能的錯誤情況,如文件讀取失敗、內存分配失敗等。

通過以上步驟,你可以使用OpenSSL進行數字簽名驗證。

0
亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女