linux

如何利用OpenSSL进行数字签名验证

小樊
37
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
看了该问题的人还看了