legongju.com
我们一直在努力
2025-01-15 17:25 | 星期三

C语言中如何实现数据的加密解密

在C语言中,实现数据的加密和解密通常需要使用一些加密算法

  1. 包含必要的头文件:
#include
#include 
#include
  1. 定义一个简单的异或加密函数:
void xor_encrypt(char *data, int key) {
    for (int i = 0; i < strlen(data); i++) {
        data[i] ^= key;
    }
}
  1. 编写主函数以测试加密和解密功能:
int main() {
    char data[] = "Hello, World!";
    int key = 42;

    printf("Original data: %s\n", data);

    // 加密数据
    xor_encrypt(data, key);
    printf("Encrypted data: %s\n", data);

    // 解密数据
    xor_encrypt(data, key);
    printf("Decrypted data: %s\n", data);

    return 0;
}

这个例子中,我们使用了一个简单的异或加密算法。请注意,这种加密方法并不安全,仅适用于演示目的。在实际应用中,建议使用更安全的加密库,如OpenSSL。

要使用OpenSSL库进行加密和解密,你需要安装OpenSSL并链接到你的项目。然后,可以使用OpenSSL提供的EVP系列函数进行加密和解密操作。这里是一个使用AES-256-CBC模式的加密和解密示例:

  1. 包含必要的头文件:
#include
#include
#include
  1. 编写加密和解密函数:
int encrypt(unsigned char *plaintext, int plaintext_len, unsigned char *key, unsigned char *iv, unsigned char *ciphertext) {
    EVP_CIPHER_CTX *ctx;
    int len;
    int ciphertext_len;

    if (!(ctx = EVP_CIPHER_CTX_new())) {
        return -1;
    }

    if (1 != EVP_EncryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, key, iv)) {
        EVP_CIPHER_CTX_free(ctx);
        return -1;
    }

    if (1 != EVP_EncryptUpdate(ctx, ciphertext, &len, plaintext, plaintext_len)) {
        EVP_CIPHER_CTX_free(ctx);
        return -1;
    }

    ciphertext_len = len;

    if (1 != EVP_EncryptFinal_ex(ctx, ciphertext + len, &len)) {
        EVP_CIPHER_CTX_free(ctx);
        return -1;
    }

    ciphertext_len += len;

    EVP_CIPHER_CTX_free(ctx);

    return ciphertext_len;
}

int decrypt(unsigned char *ciphertext, int ciphertext_len, unsigned char *key, unsigned char *iv, unsigned char *plaintext) {
    EVP_CIPHER_CTX *ctx;
    int len;
    int plaintext_len;

    if (!(ctx = EVP_CIPHER_CTX_new())) {
        return -1;
    }

    if (1 != EVP_DecryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, key, iv)) {
        EVP_CIPHER_CTX_free(ctx);
        return -1;
    }

    if (1 != EVP_DecryptUpdate(ctx, plaintext, &len, ciphertext, ciphertext_len)) {
        EVP_CIPHER_CTX_free(ctx);
        return -1;
    }

    plaintext_len = len;

    if (1 != EVP_DecryptFinal_ex(ctx, plaintext + len, &len)) {
        EVP_CIPHER_CTX_free(ctx);
        return -1;
    }

    plaintext_len += len;

    EVP_CIPHER_CTX_free(ctx);

    return plaintext_len;
}
  1. 编写主函数以测试加密和解密功能:
int main() {
    unsigned char key[32];
    unsigned char iv[16];
    unsigned char plaintext[] = "Hello, World!";
    unsigned char ciphertext[128];
    unsigned char decrypted_text[128];
    int ciphertext_len;
    int decrypted_text_len;

    // 生成随机密钥和初始化向量
    RAND_bytes(key, sizeof(key));
    RAND_bytes(iv, sizeof(iv));

    // 加密数据
    ciphertext_len = encrypt(plaintext, strlen((char *)plaintext), key, iv, ciphertext);
    if (ciphertext_len == -1) {
        printf("Encryption failed\n");
        return 1;
    }

    // 解密数据
    decrypted_text_len = decrypt(ciphertext, ciphertext_len, key, iv, decrypted_text);
    if (decrypted_text_len == -1) {
        printf("Decryption failed\n");
        return 1;
    }

    decrypted_text[decrypted_text_len] = '\0';

    printf("Original text: %s\n", plaintext);
    printf("Decrypted text: %s\n", decrypted_text);

    return 0;
}

这个示例使用了AES-256-CBC模式进行加密和解密。请注意,在实际应用中,密钥和初始化向量应该从安全的源生成,而不是使用随机数生成器。

未经允许不得转载 » 本文链接:https://www.legongju.com/article/109321.html

相关推荐

  • C语言中string的存储结构是怎样的

    C语言中string的存储结构是怎样的

    在C语言中,字符串通常以字符数组的形式存储。每个字符都被存储在数组的一个位置上,并以null字符(‘\0’)作为结尾标志。这意味着字符串的长度可以动态变化,但必...

  • 在C语言中处理string的常用方法有哪些

    在C语言中处理string的常用方法有哪些

    在C语言中处理string的常用方法包括以下几种: 使用char数组:在C语言中,字符串通常被表示为char类型的字符数组。可以使用char数组来存储和操作字符串数据。 使...

  • C语言如何实现类似string的功能

    C语言如何实现类似string的功能

    在C语言中,可以使用字符数组和相关的字符串处理函数来实现类似string的功能。以下是一些实现string功能的常用方法: 使用字符数组:
    可以使用字符数组来存...

  • C语言中string库函数的使用示例

    C语言中string库函数的使用示例

    #include #include int main() {
    char str1[20] = “Hello”;
    char str2[20] = “World”;
    // 将str2拼接到str1的末尾
    strcat(str1, str2);...

  • 如何获取Ubuntu libpng的最新补丁

    如何获取Ubuntu libpng的最新补丁

    在Ubuntu系统中,libpng的最新补丁通常通过系统的软件包管理器自动更新。Ubuntu 24.04是一个长期支持(LTS)版本,它提供了系统升级与安全补丁,包括libpng这样的...

  • mybatis bigint类型的数据加密与解密

    mybatis bigint类型的数据加密与解密

    MyBatis 本身并不提供数据加密和解密的功能,但你可以在 Java 代码中实现加密和解密,然后将加密后的数据存储到数据库中。以下是一个使用 MyBatis 对 bigint 类型...

  • rdesktop的加密连接如何配置

    rdesktop的加密连接如何配置

    rdesktop本身不支持加密连接,但可以通过配置TLS(传输层安全性协议)证书来增强连接的安全性。以下是配置TLS证书的步骤: 申请TLS证书: 使用acme.sh工具生成和...

  • 如何配置Linux系统以防止anon攻击

    如何配置Linux系统以防止anon攻击

    防止匿名攻击是确保Linux系统安全的重要措施。以下是一些关键的配置步骤和最佳实践: 更新系统和软件包: 保持系统和软件包更新至最新版本,以修复已知的安全漏洞...