OpenSSL是一個強大的工具,可以用于多種加密任務,包括驗證數字簽名。以下是使用OpenSSL驗證簽名的基本步驟:
data.txt
)。signature.sig
)。public_key.pem
)。openssl dgst -sha256 -verify public_key.pem -signature signature.sig data.txt
-sha256
:指定使用的哈希算法(這里使用SHA-256,可以根據需要更改)。-verify public_key.pem
:指定簽名者的公鑰文件。-signature signature.sig
:指定簽名文件。data.txt
:待驗證的數據文件。如果驗證成功,你會看到類似以下的輸出:
Verified OK
如果驗證失敗,你會看到錯誤信息,例如:
Verification Failure
如果你需要在自己的應用程序中使用OpenSSL進行簽名驗證,可以參考以下示例代碼(使用C語言):
#include <openssl/rsa.h>
#include <openssl/pem.h>
#include <openssl/sha.h>
#include <openssl/err.h>
#include <stdio.h>
int verify_signature(const char *data, int data_len, const char *signature, int sig_len, const char *pubkey_file) {
FILE *fp = fopen(pubkey_file, "r");
if (!fp) {
fprintf(stderr, "Unable to open public key file\n");
return 0;
}
RSA *rsa = PEM_read_RSA_PUBKEY(fp, NULL, NULL, NULL);
fclose(fp);
if (!rsa) {
fprintf(stderr, "Error reading public key\n");
return 0;
}
EVP_PKEY *pkey = EVP_PKEY_new();
EVP_PKEY_assign_RSA(pkey, rsa);
EVP_MD_CTX *mdctx = EVP_MD_CTX_new();
if (!mdctx) {
fprintf(stderr, "Error creating context\n");
EVP_PKEY_free(pkey);
return 0;
}
if (EVP_DigestVerifyInit(mdctx, NULL, EVP_sha256(), NULL, pkey) != 1) {
fprintf(stderr, "Error initializing verification\n");
EVP_MD_CTX_free(mdctx);
EVP_PKEY_free(pkey);
return 0;
}
if (EVP_DigestVerifyUpdate(mdctx, data, data_len) != 1) {
fprintf(stderr, "Error updating verification\n");
EVP_MD_CTX_free(mdctx);
EVP_PKEY_free(pkey);
return 0;
}
int result = EVP_DigestVerifyFinal(mdctx, signature, sig_len) == 1;
EVP_MD_CTX_free(mdctx);
EVP_PKEY_free(pkey);
return result;
}
int main() {
const char *data = "Hello, World!";
int data_len = strlen(data);
const char *signature = "..."; // Base64 encoded signature
int sig_len = strlen(signature);
const char *pubkey_file = "public_key.pem";
if (verify_signature(data, data_len, signature, sig_len, pubkey_file)) {
printf("Signature is valid\n");
} else {
printf("Signature is invalid\n");
}
return 0;
}
通過以上步驟,你可以使用OpenSSL輕松驗證數字簽名。