在Ubuntu下使用OpenSSL验证签名,可以按照以下步骤进行:
准备文件:
.sig或.pem格式)。.pem格式)。验证签名: 打开终端,使用以下命令进行验证:
openssl dgst -sha256 -verify public_key.pem -signature signature_file.sig original_data_file
解释:
-sha256:指定使用的哈希算法(这里使用SHA-256,可以根据需要更改)。-verify public_key.pem:指定公钥文件。-signature signature_file.sig:指定签名文件。original_data_file:指定要验证的原始数据文件。如果验证成功,终端会显示Verified OK。如果验证失败,会显示错误信息。
如果你需要在程序中使用OpenSSL库来验证签名,可以参考以下示例代码(使用C语言):
#include <openssl/pem.h>
#include <openssl/rsa.h>
#include <openssl/sha.h>
#include <openssl/err.h>
#include <stdio.h>
#include <string.h>
int verify_signature(const char *public_key_file, const char *signature_file, const char *original_data_file) {
FILE *pub_key_fp = fopen(public_key_file, "r");
if (!pub_key_fp) {
fprintf(stderr, "Failed to open public key file\n");
return 0;
}
RSA *rsa_public_key = PEM_read_RSA_PUBKEY(pub_key_fp, NULL, NULL, NULL);
fclose(pub_key_fp);
if (!rsa_public_key) {
fprintf(stderr, "Failed to read public key\n");
return 0;
}
FILE *sig_fp = fopen(signature_file, "rb");
if (!sig_fp) {
fprintf(stderr, "Failed to open signature file\n");
RSA_free(rsa_public_key);
return 0;
}
unsigned char *signature = malloc(RSA_size(rsa_public_key));
size_t sig_len;
if (fread(signature, 1, RSA_size(rsa_public_key), sig_fp) != RSA_size(rsa_public_key)) {
fprintf(stderr, "Failed to read signature\n");
free(signature);
fclose(sig_fp);
RSA_free(rsa_public_key);
return 0;
}
sig_len = RSA_size(rsa_public_key);
fclose(sig_fp);
FILE *data_fp = fopen(original_data_file, "rb");
if (!data_fp) {
fprintf(stderr, "Failed to open original data file\n");
free(signature);
RSA_free(rsa_public_key);
return 0;
}
unsigned char *data = malloc(RSA_size(rsa_public_key));
size_t data_len;
if (fread(data, 1, RSA_size(rsa_public_key), data_fp) != RSA_size(rsa_public_key)) {
fprintf(stderr, "Failed to read original data\n");
free(signature);
free(data);
fclose(data_fp);
RSA_free(rsa_public_key);
return 0;
}
data_len = RSA_size(rsa_public_key);
fclose(data_fp);
int result = RSA_verify(NID_sha256, data, data_len, signature, sig_len, rsa_public_key);
free(signature);
free(data);
RSA_free(rsa_public_key);
if (result == 1) {
printf("Signature is valid\n");
return 1;
} else if (result == 0) {
printf("Signature is invalid\n");
return 0;
} else {
fprintf(stderr, "Verification failed due to error\n");
ERR_print_errors_fp(stderr);
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;
}
sudo apt-get install libssl-devERR_print_errors_fp(stderr)来打印详细的错误信息。通过以上方法,你可以在Ubuntu下使用OpenSSL验证签名。