使用openssl计算文件的md5,sha256,以及用aes算法对密码进行加密

目录

计算文件md5值

计算文件SHA-256值

使用 openssl api 用aes算法 对密码加密和解密


计算文件md5值

要使用 OpenSSL API 计算文件的 MD5 值,您可以使用 OpenSSL 提供的一组函数。以下是一个简单的示例,演示如何使用 OpenSSL API 计算文件的 MD5 值:

#include <stdio.h>
#include <stdlib.h>
#include <openssl/md5.h>

#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 <filename>\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值

计算文件的 SHA-256 值与计算 MD5 值类似,只需在代码中使用 OpenSSL 的 SHA-256 相关函数即可。以下是一个简单的示例:

#include <stdio.h>
#include <stdlib.h>
#include <openssl/sha.h>

#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 <filename>\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算法 对密码加密和解密

下面是使用 OpenSSL API 进行 AES 对称加密和解密的示例。在这个例子中,使用 EVP 接口进行 AES-256-CBC 加密和解密。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/evp.h>
#include <openssl/err.h>

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;
}

请注意,这只是一个简单的示例,实际应用中应该更加注意密钥的安全生成和管理。在生产环境中,请谨慎处理密钥,并确保采用适当的密钥管理策略。

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个简单的示例代码,它使用 OpenSSL 库中的 AES 加密算法对配置文件进行加密,并使用 SHA256 哈希算法生成密钥。在加密过程中,程序会检查试用期是否已过期,如果已过期,则会提示用户购买授权或更新试用期。 ```cpp #include <openssl/aes.h> #include <openssl/evp.h> #include <openssl/rand.h> #include <openssl/sha.h> #include <iostream> #include <fstream> #include <cstring> #include <ctime> // 定义加密算法类型 #define AES_KEY_LENGTH 256 // 密钥长度,可以是128、192或256位 #define AES_BLOCK_LENGTH 128 // 分组长度,固定为128位 #define AES_PADDING_LENGTH 128 // 填充长度,固定为128位 // 定义加密文件路径和密码 const char *CONFIG_FILE = "/path/to/config_file"; const char *PASSWORD = "password"; // 生成随机初始化向量 void generate_iv(unsigned char *iv) { RAND_bytes(iv, AES_BLOCK_LENGTH / 8); } // 加密数据 void encrypt_data(unsigned char *data, int data_len, unsigned char *key, unsigned char *iv, unsigned char *output) { // 初始化加密器 EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new(); EVP_EncryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, key, iv); // 加密数据 int out_len = 0; EVP_EncryptUpdate(ctx, output, &out_len, data, data_len); // 输出填充数据 int final_len = 0; EVP_EncryptFinal_ex(ctx, output + out_len, &final_len); // 清理加密器 EVP_CIPHER_CTX_free(ctx); } // 加密文件 void encrypt_file(const char *filename, const char *password) { // 打开文件 std::ifstream input(filename, std::ios::binary | std::ios::in); if (!input.good()) { std::cerr << "Failed to open file " << filename << std::endl; exit(EXIT_FAILURE); } // 获取文件大小 input.seekg(0, std::ios::end); int file_size = input.tellg(); input.seekg(0, std::ios::beg); // 读取文件数据 unsigned char *data = new unsigned char[file_size]; input.read((char *) data, file_size); // 生成密钥和随机初始化向量 unsigned char key[AES_KEY_LENGTH / 8]; unsigned char iv[AES_BLOCK_LENGTH / 8]; SHA256((const unsigned char *) password, strlen(password), key); generate_iv(iv); // 加密文件数据 unsigned char *output = new unsigned char[file_size + AES_PADDING_LENGTH / 8]; encrypt_data(data, file_size, key, iv, output); // 输出加密数据 std::ofstream output_file(filename, std::ios::binary | std::ios::out); output_file.write((char *) iv, AES_BLOCK_LENGTH / 8); output_file.write((char *) output, file_size + AES_PADDING_LENGTH / 8); // 清理资源 delete[] data; delete[] output; } // 检查试用期是否已过期 bool check_trial_period() { // TODO: 实现试用期检查逻辑 // 在此处检查试用期是否已过期,如果已过期,则返回false,否则返回true return true; } // 锁定配置文件 void lock_config_file(const char *filename) { // TODO: 实现配置文件锁定逻辑 // 在此处实现配置文件锁定逻辑,使其无法被删除或修改 } // 主函数 int main() { // 检查试用期是否已过期 if (!check_trial_period()) { std::cerr << "Trial period has expired" << std::endl; exit(EXIT_FAILURE); } // 加密配置文件 encrypt_file(CONFIG_FILE, PASSWORD); // 锁定配置文件 lock_config_file(CONFIG_FILE); // 输出提示信息 std::cout << "Configuration file has been encrypted and locked" << std::endl; std::cout << "Please contact the vendor to purchase a license or extend the trial period" << std::endl; return 0; } ``` 请注意,此示例代码仅用于演示加密和锁定配置文件的基本思路,实际实现需要根据具体需求进行调整和优化。另外,此代码中的试用期检查和配置文件锁定逻辑需要根据具体需求进行实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

telllong

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值