rsa签名算法c实现
时间: 2023-08-01 12:13:14 浏览: 84
rsa签名 C语言实现
4星 · 用户满意度95%
RSA签名算法是一种非对称加密算法,常用于数字签名和身份认证。以下是RSA签名算法的C语言实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/rsa.h>
#include <openssl/pem.h>
#define KEY_LENGTH 2048
#define PUB_EXP 3
#define PRI_EXP 65537
int main()
{
RSA *rsa = RSA_new();
BIGNUM *bne = BN_new();
BIO *bp_public = BIO_new_file("public.pem", "rb");
BIO *bp_private = BIO_new_file("private.pem", "rb");
if (!rsa || !bne || !bp_public || !bp_private)
{
printf("failed to initialize RSA.\n");
return -1;
}
if (!BN_set_word(bne, PUB_EXP))
{
printf("failed to set public exponent.\n");
return -1;
}
if (!RSA_generate_key_ex(rsa, KEY_LENGTH, bne, NULL))
{
printf("failed to generate RSA key pair.\n");
return -1;
}
if (!PEM_write_bio_RSAPublicKey(bp_public, rsa))
{
printf("failed to write public key.\n");
return -1;
}
if (!PEM_write_bio_RSAPrivateKey(bp_private, rsa, NULL, NULL, 0, NULL, NULL))
{
printf("failed to write private key.\n");
return -1;
}
// 签名
char message[] = "hello world";
unsigned char signature[RSA_size(rsa)];
unsigned int siglen;
if (RSA_sign(NID_sha1, (unsigned char *)message, strlen(message), signature, &siglen, rsa) != 1)
{
printf("failed to sign message.\n");
return -1;
}
// 验证签名
if (RSA_verify(NID_sha1, (unsigned char *)message, strlen(message), signature, siglen, rsa) != 1)
{
printf("failed to verify signature.\n");
return -1;
}
printf("signature verified successfully.\n");
RSA_free(rsa);
BN_free(bne);
BIO_free(bp_public);
BIO_free(bp_private);
return 0;
}
```
这个例子中,我们使用OpenSSL库来实现RSA签名算法。首先,我们生成一个RSA密钥对。然后,我们使用私钥对消息进行签名,使用公钥对签名进行验证。注意,签名和验证时要使用相同的哈希算法,这里我们使用SHA1。
该示例生成的公钥和私钥将分别保存在public.pem和private.pem文件中。你可以使用以下命令来生成这两个文件:
```sh
openssl genrsa -out private.pem 2048
openssl rsa -in private.pem -pubout -out public.pem
```
这将生成一个2048位的RSA密钥对,并将私钥保存在private.pem文件中,将公钥保存在public.pem文件中。
阅读全文