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

目录

计算文件md5值

计算文件SHA-256值

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


计算文件md5值

要使用 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值

计算文件的 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算法 对密码加密和解密

下面是使用 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;
}

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

你可能感兴趣的:(C++基础实战,加密与解密,算法,C++,加密,解密)