目录
计算文件md5值
计算文件SHA-256值
使用 openssl api 用aes算法 对密码加密和解密
要使用 OpenSSL API 计算文件的 MD5 值,您可以使用 OpenSSL 提供的一组函数。以下是一个简单的示例,演示如何使用 OpenSSL API 计算文件的 MD5 值:
#include
#include
#include
#define BUFFER_SIZE 1024
int calculate_md5(const char *filename, unsigned char *digest) {
FILE *file = fopen(filename, "rb");
if (!file) {
perror("Unable to open file");
return -1;
}
MD5_CTX md5_context;
MD5_Init(&md5_context);
unsigned char buffer[BUFFER_SIZE];
size_t bytesRead;
while ((bytesRead = fread(buffer, 1, BUFFER_SIZE, file)) != 0) {
MD5_Update(&md5_context, buffer, bytesRead);
}
MD5_Final(digest, &md5_context);
fclose(file);
return 0;
}
int main(int argc, char *argv[]) {
if (argc != 2) {
fprintf(stderr, "Usage: %s \n", argv[0]);
return 1;
}
const char *filename = argv[1];
unsigned char digest[MD5_DIGEST_LENGTH];
if (calculate_md5(filename, digest) == 0) {
printf("MD5(%s) = ", filename);
for (int i = 0; i < MD5_DIGEST_LENGTH; i++) {
printf("%02x", digest[i]);
}
printf("\n");
return 0;
} else {
return 1;
}
}
在上面的示例中,calculate_md5
函数负责打开文件、读取文件内容并更新 MD5 上下文,最后计算最终的 MD5 值。main
函数接受文件名作为命令行参数,并打印出文件的 MD5 值。
请注意,为了编译此代码,您需要在编译命令中链接 OpenSSL 库。例如,在 Linux 系统上,您可以使用以下命令:
gcc -o md5_example md5_example.c -lssl -lcrypto
在 Windows 上,您需要链接相应的 OpenSSL 静态库或动态库,具体取决于您的配置。
计算文件的 SHA-256 值与计算 MD5 值类似,只需在代码中使用 OpenSSL 的 SHA-256 相关函数即可。以下是一个简单的示例:
#include
#include
#include
#define BUFFER_SIZE 1024
int calculate_sha256(const char *filename, unsigned char *digest) {
FILE *file = fopen(filename, "rb");
if (!file) {
perror("Unable to open file");
return -1;
}
SHA256_CTX sha256_context;
SHA256_Init(&sha256_context);
unsigned char buffer[BUFFER_SIZE];
size_t bytesRead;
while ((bytesRead = fread(buffer, 1, BUFFER_SIZE, file)) != 0) {
SHA256_Update(&sha256_context, buffer, bytesRead);
}
SHA256_Final(digest, &sha256_context);
fclose(file);
return 0;
}
int main(int argc, char *argv[]) {
if (argc != 2) {
fprintf(stderr, "Usage: %s \n", argv[0]);
return 1;
}
const char *filename = argv[1];
unsigned char digest[SHA256_DIGEST_LENGTH];
if (calculate_sha256(filename, digest) == 0) {
printf("SHA256(%s) = ", filename);
for (int i = 0; i < SHA256_DIGEST_LENGTH; i++) {
printf("%02x", digest[i]);
}
printf("\n");
return 0;
} else {
return 1;
}
}
在这个示例中,calculate_sha256
函数负责打开文件、读取文件内容并更新 SHA-256 上下文,最后计算最终的 SHA-256 值。main
函数接受文件名作为命令行参数,并打印出文件的 SHA-256 值。
编译此代码的方法类似于之前提到的 MD5 示例。确保在编译命令中链接 OpenSSL 库,例如:
gcc -o sha256_example sha256_example.c -lssl -lcrypto
下面是使用 OpenSSL API 进行 AES 对称加密和解密的示例。在这个例子中,使用 EVP 接口进行 AES-256-CBC 加密和解密。
#include
#include
#include
#include
#include
void handleErrors(void)
{
ERR_print_errors_fp(stderr);
abort();
}
int encrypt(const unsigned char *plaintext, int plaintext_len, const unsigned char *key, const unsigned char *iv, unsigned char *ciphertext)
{
EVP_CIPHER_CTX *ctx;
int len;
int ciphertext_len;
if (!(ctx = EVP_CIPHER_CTX_new()))
handleErrors();
if (1 != EVP_EncryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, key, iv))
handleErrors();
if (1 != EVP_EncryptUpdate(ctx, ciphertext, &len, plaintext, plaintext_len))
handleErrors();
ciphertext_len = len;
if (1 != EVP_EncryptFinal_ex(ctx, ciphertext + len, &len))
handleErrors();
ciphertext_len += len;
EVP_CIPHER_CTX_free(ctx);
return ciphertext_len;
}
int decrypt(const unsigned char *ciphertext, int ciphertext_len, const unsigned char *key, const unsigned char *iv, unsigned char *plaintext)
{
EVP_CIPHER_CTX *ctx;
int len;
int plaintext_len;
if (!(ctx = EVP_CIPHER_CTX_new()))
handleErrors();
if (1 != EVP_DecryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, key, iv))
handleErrors();
if (1 != EVP_DecryptUpdate(ctx, plaintext, &len, ciphertext, ciphertext_len))
handleErrors();
plaintext_len = len;
if (1 != EVP_DecryptFinal_ex(ctx, plaintext + len, &len))
handleErrors();
plaintext_len += len;
EVP_CIPHER_CTX_free(ctx);
return plaintext_len;
}
int main()
{
const unsigned char key[] = "0123456789abcdef";
const unsigned char iv[] = "0123456789abcdef";
const unsigned char plaintext[] = "Hello, AES!";
int plaintext_len = strlen((char *)plaintext);
unsigned char ciphertext[128];
int ciphertext_len = encrypt(plaintext, plaintext_len, key, iv, ciphertext);
printf("Ciphertext is:\n");
for (int i = 0; i < ciphertext_len; i++)
{
printf("%02x", ciphertext[i]);
}
printf("\n");
unsigned char decryptedtext[128];
int decryptedtext_len = decrypt(ciphertext, ciphertext_len, key, iv, decryptedtext);
printf("Decrypted text is:\n");
for (int i = 0; i < decryptedtext_len; i++)
{
printf("%c", decryptedtext[i]);
}
printf("\n");
return 0;
}
请注意,这只是一个简单的示例,实际应用中应该更加注意密钥的安全生成和管理。在生产环境中,请谨慎处理密钥,并确保采用适当的密钥管理策略。