OpenSSL入门:密码学基础知识
原创密码学基础知识
密码学是一门研究怎样确保信息平安的学科,它包括加密和解密技术,以确保信息在传输或存储过程中的机密性、完整性和可用性。OpenSSL是一个开源的加密工具包,它提供了大量的密码学功能。在起始学习OpenSSL之前,了解一些密码学基础知识是非常必要的。
1. 加密算法
加密算法是密码学的核心,它将明文转换成密文的过程称为加密,将密文转换成明文的过程称为解密。以下是几种常见的加密算法:
1.1 对称加密算法
对称加密算法使用相同的密钥进行加密和解密。常见的对称加密算法有:
- DES(数据加密标准)
- 3DES(三重数据加密算法)
- AES(高级加密标准)
以下是一个使用AES加密算法的示例代码:
#include
int main() {
const char *key = "12345678";
const char *iv = "12345678";
const char *plaintext = "Hello, World!";
unsigned char ciphertext[256];
AES_KEY aes_key;
AES_set_encrypt_key(key, 128, &aes_key);
AES_cbc_encrypt((unsigned char *)plaintext, ciphertext, strlen(plaintext), &aes_key, (unsigned char *)iv, AES_ENCRYPT);
// 输出密文
for (int i = 0; i < strlen(plaintext); i++) {
printf("%02x", ciphertext[i]);
}
return 0;
}
1.2 非对称加密算法
非对称加密算法使用一对密钥,即公钥和私钥。公钥用于加密,私钥用于解密。常见的非对称加密算法有:
- RSA
- DSA
- ECC(椭圆曲线加密)
以下是一个使用RSA加密算法的示例代码:
#include
#include
#include
int main() {
RSA *rsa = RSA_new();
BIGNUM *bn = BN_new();
BIGNUM *pubkey_bn = BN_new();
BIGNUM *privkey_bn = BN_new();
unsigned char *pubkey = NULL;
unsigned char *privkey = NULL;
unsigned char *message = "Hello, World!";
unsigned char *encrypted = NULL;
int message_len = 0;
// 生成密钥对
BN_set_word(bn, RSA_F4);
RSA_generate_key_ex(rsa, 2048, bn, NULL);
// 获取公钥和私钥
pubkey_bn = RSA_get_n(rsa);
privkey_bn = RSA_get_d(rsa);
message_len = RSA_size(rsa);
// 生成公钥和私钥字符串
pubkey = RSA_bn2pubkey(pubkey_bn, NULL);
privkey = RSA_bn2privkey(privkey_bn, NULL);
// 加密消息
encrypted = RSA_encrypt(message, message_len, rsa, RSA_NO_PADDING);
// 输出加密后的消息
for (int i = 0; i < message_len; i++) {
printf("%02x", encrypted[i]);
}
// 清理资源
RSA_free(rsa);
BN_free(bn);
BN_free(pubkey_bn);
BN_free(privkey_bn);
OPENSSL_free(pubkey);
OPENSSL_free(privkey);
OPENSSL_free(encrypted);
return 0;
}
2. 数字签名
数字签名是一种用于验证信息完整性和身份的技术。它使用私钥对数据进行签名,公钥可以用来验证签名的有效性。数字签名的关键用途包括:
- 确保消息在传输过程中未被篡改
- 验证消息发送者的身份
- 提供消息的不可否认性
以下是一个使用RSA算法生成数字签名的示例代码:
#include
#include
#include
int main() {
RSA *rsa = RSA_new();
BIGNUM *bn = BN_new();
unsigned char *message = "Hello, World!";
unsigned char *signature = NULL;
unsigned int signature_len = 0;
// 生成密钥对