rsa实现数字签名代码
时间: 2023-10-26 08:24:02 浏览: 256
下面是使用C语言实现RSA数字签名的简单示例代码,其中使用了OpenSSL库中的RSA算法和SHA-256哈希函数:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/rsa.h>
#include <openssl/evp.h>
#include <openssl/sha.h>
#define KEY_LENGTH 2048
#define PUB_EXP 65537
int main(int argc, char *argv[])
{
// 生成RSA密钥对
RSA *rsa = RSA_generate_key(KEY_LENGTH, PUB_EXP, NULL, NULL);
if (rsa == NULL) {
printf("Error: failed to generate RSA key pair!\n");
return -1;
}
// 待签名的消息
char *msg = "Hello, world!";
size_t msg_len = strlen(msg);
// 计算消息的SHA-256摘要
unsigned char digest[SHA256_DIGEST_LENGTH];
SHA256((unsigned char *)msg, msg_len, digest);
// 使用RSA私钥对摘要进行加密,得到签名
unsigned char signature[KEY_LENGTH / 8];
unsigned int signature_len;
if (RSA_sign(NID_sha256, digest, SHA256_DIGEST_LENGTH, signature, &signature_len, rsa) != 1) {
printf("Error: failed to sign message with RSA private key!\n");
return -1;
}
// 将签名和消息一起发送给接收方
printf("Message: %s\n", msg);
printf("Signature: ");
for (int i = 0; i < signature_len; i++) {
printf("%02x", signature[i]);
}
printf("\n");
// 使用RSA公钥对签名进行解密,得到摘要
unsigned char decrypted[SHA256_DIGEST_LENGTH];
unsigned int decrypted_len;
if (RSA_verify(NID_sha256, digest, SHA256_DIGEST_LENGTH, signature, signature_len, rsa) != 1) {
printf("Error: failed to verify RSA signature with public key!\n");
return -1;
}
// 对比摘要和原消息的摘要是否相等
if (memcmp(digest, decrypted, SHA256_DIGEST_LENGTH) == 0) {
printf("Signature is valid!\n");
} else {
printf("Error: invalid signature!\n");
}
// 释放RSA密钥对
RSA_free(rsa);
return 0;
}
```
需要注意的是,在实际应用中,为了提高数字签名的安全性,通常需要结合其他技术,如随机数生成、消息扰动、时间戳、证书链等。
阅读全文