数字签名及加密C语言实现
时间: 2023-12-14 11:36:52 浏览: 143
数字签名和加密是两个不同的概念,需要分别实现。
首先,数字签名是一种用于验证数据完整性和身份验证的技术,其基本原理是使用私钥对数据进行加密,然后使用公钥进行解密,以确保数据的来源和完整性。以下是一个使用 OpenSSL 库进行数字签名的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <openssl/rsa.h>
#include <openssl/pem.h>
#define KEY_LENGTH 2048
#define SIGN_LENGTH 256
int main()
{
RSA *rsa;
unsigned char data[] = "Hello, world!";
unsigned char sign[SIGN_LENGTH];
unsigned int sign_len;
// 生成 RSA 密钥对
rsa = RSA_generate_key(KEY_LENGTH, RSA_F4, NULL, NULL);
// 对数据进行签名
if (RSA_sign(NID_sha256, data, sizeof(data) - 1, sign, &sign_len, rsa) != 1) {
printf("Error: RSA_sign\n");
exit(1);
}
// 验证签名
if (RSA_verify(NID_sha256, data, sizeof(data) - 1, sign, sign_len, rsa) != 1) {
printf("Error: RSA_verify\n");
exit(1);
}
printf("Signature passed verification.\n");
RSA_free(rsa);
return 0;
}
```
其次,加密是一种保护数据机密性的技术,其基本原理是使用公钥对数据进行加密,然后使用私钥进行解密。以下是一个使用 OpenSSL 库进行加密的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <openssl/rsa.h>
#include <openssl/pem.h>
#define KEY_LENGTH 2048
int main()
{
RSA *rsa;
unsigned char data[] = "Hello, world!";
unsigned char encrypted[KEY_LENGTH / 8];
unsigned char decrypted[KEY_LENGTH / 8];
int encrypted_length, decrypted_length;
// 生成 RSA 密钥对
rsa = RSA_generate_key(KEY_LENGTH, RSA_F4, NULL, NULL);
// 对数据进行加密
encrypted_length = RSA_public_encrypt(sizeof(data) - 1, data, encrypted, rsa, RSA_PKCS1_PADDING);
if (encrypted_length == -1) {
printf("Error: RSA_public_encrypt\n");
exit(1);
}
// 对数据进行解密
decrypted_length = RSA_private_decrypt(encrypted_length, encrypted, decrypted, rsa, RSA_PKCS1_PADDING);
if (decrypted_length == -1) {
printf("Error: RSA_private_decrypt\n");
exit(1);
}
printf("Encrypted: ");
for (int i = 0; i < encrypted_length; i++) {
printf("%02X ", encrypted[i]);
}
printf("\n");
printf("Decrypted: %s\n", decrypted);
RSA_free(rsa);
return 0;
}
```
需要注意的是,在实际应用中,数字签名和加密通常是结合使用的,以确保数据的完整性和机密性。
阅读全文