在数字时代,数据安全至关重要。加密与解密技术是保护信息安全的重要手段。C语言作为一种高效、稳定的编程语言,在实现加密解密算法方面有着广泛的应用。本文将带您走进C语言编程的世界,揭秘数字加密与解密的技巧。
加密算法简介
加密算法是一种将明文转换为密文的算法,其目的是为了保护信息不被非法获取。常见的加密算法有对称加密算法、非对称加密算法和哈希算法。
对称加密算法
对称加密算法使用相同的密钥进行加密和解密。常见的对称加密算法有DES、AES、RC4等。以下是一个使用AES算法的C语言加密示例:
#include <openssl/aes.h>
#include <openssl/rand.h>
#include <stdio.h>
#include <string.h>
void AES_encrypt(const unsigned char *plaintext, unsigned char *ciphertext, const unsigned char *key) {
AES_keyexpansion(key, key, 32); // AES-256
unsigned char iv[16];
RAND_bytes(iv, 16); // 生成随机向量
AES_cbc_encrypt(plaintext, ciphertext, strlen((char *)plaintext), &key[0], iv, AES_ENCRYPT);
}
int main() {
const unsigned char key[32] = "1234567890123456"; // 密钥长度为32字节
const unsigned char plaintext[] = "Hello, World!";
unsigned char ciphertext[256];
AES_encrypt(plaintext, ciphertext, key);
printf("Encrypted: %s\n", ciphertext);
return 0;
}
非对称加密算法
非对称加密算法使用一对密钥进行加密和解密,即公钥和私钥。常见的非对称加密算法有RSA、ECC等。以下是一个使用RSA算法的C语言加密示例:
#include <openssl/pem.h>
#include <openssl/rsa.h>
#include <openssl/err.h>
#include <stdio.h>
#include <string.h>
void RSA_encrypt(const unsigned char *plaintext, unsigned char *ciphertext, RSA *rsa) {
BIGNUM *bn = BN_new();
BN_set_word(bn, RSA_get_modulus(rsa)); // 设置模数
BIGNUM *exponent = BN_new();
BN_set_word(exponent, RSA_get_exponent(rsa)); // 设置指数
unsigned char *p = BN_bn2bin(exponent); // 转换为二进制
unsigned char *m = BN_bn2bin(bn); // 转换为二进制
int len = RSA_size(rsa);
BIGNUM *decrypted = BN_new();
BN_bin2bn(p, len, decrypted); // 解密
BN_mod_inverse(decrypted, decrypted, bn); // 求模逆
unsigned char *decrypted_bin = BN_bn2bin(decrypted);
memcpy(ciphertext, decrypted_bin, len);
BN_free(bn);
BN_free(exponent);
BN_free(decrypted);
BN_free(decrypted_bin);
}
int main() {
FILE *pubkey_file = fopen("public_key.pem", "r");
RSA *rsa = PEM_read_RSAPublicKey(pubkey_file, NULL, NULL, NULL);
fclose(pubkey_file);
const unsigned char plaintext[] = "Hello, World!";
unsigned char ciphertext[256];
RSA_encrypt(plaintext, ciphertext, rsa);
printf("Encrypted: %s\n", ciphertext);
RSA_free(rsa);
return 0;
}
哈希算法
哈希算法是一种将任意长度的数据映射为固定长度的散列值的算法。常见的哈希算法有MD5、SHA-1、SHA-256等。以下是一个使用SHA-256算法的C语言哈希示例:
#include <openssl/sha.h>
#include <stdio.h>
#include <string.h>
void SHA256(const unsigned char *data, size_t data_len, unsigned char *hash) {
SHA256_CTX sha256;
SHA256_Init(&sha256);
SHA256_Update(&sha256, data, data_len);
SHA256_Final(hash, &sha256);
}
int main() {
const unsigned char data[] = "Hello, World!";
unsigned char hash[SHA256_DIGEST_LENGTH];
SHA256(data, strlen((char *)data), hash);
printf("Hash: ");
for (int i = 0; i < SHA256_DIGEST_LENGTH; i++) {
printf("%02x", hash[i]);
}
printf("\n");
return 0;
}
解密技巧
解密是加密的逆过程,即使用相应的密钥将密文转换为明文。以下是对称加密、非对称加密和哈希算法的解密示例:
对称加密解密
void AES_decrypt(const unsigned char *ciphertext, unsigned char *plaintext, const unsigned char *key) {
AES_keyexpansion(key, key, 32); // AES-256
unsigned char iv[16];
RAND_bytes(iv, 16); // 生成随机向量
AES_cbc_encrypt(ciphertext, plaintext, strlen((char *)plaintext), &key[0], iv, AES_DECRYPT);
}
int main() {
const unsigned char key[32] = "1234567890123456"; // 密钥长度为32字节
const unsigned char ciphertext[] = "Encrypted text";
unsigned char plaintext[256];
AES_decrypt(ciphertext, plaintext, key);
printf("Decrypted: %s\n", plaintext);
return 0;
}
非对称加密解密
void RSA_decrypt(const unsigned char *ciphertext, unsigned char *plaintext, RSA *rsa) {
BIGNUM *bn = BN_new();
BN_set_word(bn, RSA_get_modulus(rsa)); // 设置模数
BIGNUM *exponent = BN_new();
BN_set_word(exponent, RSA_get_exponent(rsa)); // 设置指数
unsigned char *p = BN_bn2bin(exponent); // 转换为二进制
unsigned char *m = BN_bn2bin(bn); // 转换为二进制
int len = RSA_size(rsa);
BIGNUM *decrypted = BN_new();
BN_bin2bn(p, len, decrypted); // 解密
BN_mod_inverse(decrypted, decrypted, bn); // 求模逆
unsigned char *decrypted_bin = BN_bn2bin(decrypted);
memcpy(plaintext, decrypted_bin, len);
BN_free(bn);
BN_free(exponent);
BN_free(decrypted);
BN_free(decrypted_bin);
}
int main() {
FILE *privkey_file = fopen("private_key.pem", "r");
RSA *rsa = PEM_read_RSAPrivateKey(privkey_file, NULL, NULL, NULL);
fclose(privkey_file);
const unsigned char ciphertext[] = "Encrypted text";
unsigned char plaintext[256];
RSA_decrypt(ciphertext, plaintext, rsa);
printf("Decrypted: %s\n", plaintext);
RSA_free(rsa);
return 0;
}
哈希算法验证
void SHA256(const unsigned char *data, size_t data_len, unsigned char *hash) {
SHA256_CTX sha256;
SHA256_Init(&sha256);
SHA256_Update(&sha256, data, data_len);
SHA256_Final(hash, &sha256);
}
int main() {
const unsigned char data[] = "Hello, World!";
unsigned char hash[SHA256_DIGEST_LENGTH];
unsigned char target_hash[SHA256_DIGEST_LENGTH] = "5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8"; // 目标哈希值
SHA256(data, strlen((char *)data), hash);
int result = memcmp(hash, target_hash, SHA256_DIGEST_LENGTH);
if (result == 0) {
printf("Hash verified!\n");
} else {
printf("Hash verification failed!\n");
}
return 0;
}
总结
本文介绍了C语言编程中数字加密与解密的技巧,包括对称加密、非对称加密和哈希算法。通过学习这些技巧,您可以更好地保护您的数据安全。在实际应用中,请根据您的需求选择合适的加密算法,并确保密钥的安全性。
