温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Linux下C++的加密解密怎样实现

发布时间:2024-12-14 17:24:54 来源:亿速云 阅读:81 作者:小樊 栏目:云计算

在 Linux 下,使用 C++ 实现加密解密可以通过多种方式来完成,例如使用 OpenSSL、GnuPG 或者自定义算法等。下面我将提供一个简单的示例,展示如何使用 OpenSSL 库在 C++ 中实现 AES 加密和解密。

首先,确保你已经安装了 OpenSSL 库。在 Ubuntu 系统中,可以使用以下命令安装:

sudo apt-get install libssl-dev

接下来,创建一个名为 crypto.cpp 的文件,并添加以下代码:

#include <iostream>
#include <openssl/aes.h>
#include <openssl/rand.h>
#include <vector>
#include <cstring>

std::vector<unsigned char> pad(const std::vector<unsigned char> &data, int blockSize) {
    int padding = blockSize - data.size() % blockSize;
    std::vector<unsigned char> padded_data(data.size() + padding);
    std::memset(padded_data.data() + data.size(), padding, padding);
    return padded_data;
}

std::vector<unsigned char> unpad(const std::vector<unsigned char> &data, int blockSize) {
    int padding = data[data.size() - 1];
    std::vector<unsigned char> unpadded_data(data.begin(), data.end() - padding);
    return unpadded_data;
}

std::vector<unsigned char> encrypt(const std::vector<unsigned char> &plaintext, const std::vector<unsigned char> &key) {
    std::vector<unsigned char> padded_plaintext = pad(plaintext, AES_BLOCK_SIZE);
    std::vector<unsigned char> ciphertext(padded_plaintext.size() + AES_BLOCK_SIZE);
    AES_KEY aesKey;
    AES_set_encrypt_key(key.data(), key.size() * 8, &aesKey);

    AES_cbc_encrypt(padded_plaintext.data(), ciphertext.data(), padded_plaintext.size(), &aesKey, nullptr, AES_ENCRYPT);
    return ciphertext;
}

std::vector<unsigned char> decrypt(const std::vector<unsigned char> &ciphertext, const std::vector<unsigned char> &key) {
    std::vector<unsigned char> padded_ciphertext = ciphertext;
    AES_KEY aesKey;
    AES_set_decrypt_key(key.data(), key.size() * 8, &aesKey);

    AES_cbc_encrypt(padded_ciphertext.data(), padded_ciphertext.data(), padded_ciphertext.size(), &aesKey, nullptr, AES_DECRYPT);
    return unpad(padded_ciphertext, AES_BLOCK_SIZE);
}

int main() {
    std::vector<unsigned char> key = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f};
    std::vector<unsigned char> plaintext = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f};

    std::vector<unsigned char> encrypted = encrypt(plaintext, key);
    std::vector<unsigned char> decrypted = decrypt(encrypted, key);

    std::cout << "Plaintext: ";
    for (unsigned char byte : plaintext) {
        std::cout << std::hex << static_cast<int>(byte) << " ";
    }
    std::cout << std::endl;

    std::cout << "Encrypted: ";
    for (unsigned char byte : encrypted) {
        std::cout << std::hex << static_cast<int>(byte) << " ";
    }
    std::cout << std::endl;

    std::cout << "Decrypted: ";
    for (unsigned char byte : decrypted) {
        std::cout << std::hex << static_cast<int>(byte) << " ";
    }
    std::cout << std::endl;

    return 0;
}

在这个示例中,我们使用了 OpenSSL 的 AES 加密库来实现加密和解密功能。encrypt 函数接受明文和密钥作为参数,并返回加密后的密文。decrypt 函数接受密文和密钥作为参数,并返回解密后的明文。

要编译这个程序,你需要链接 OpenSSL 库。在命令行中,使用以下命令编译:

g++ crypto.cpp -o crypto -lcrypto

然后,运行编译后的程序:

./crypto

这将输出原始明文、加密后的密文以及解密后的明文。请注意,这个示例仅用于演示目的,实际应用中可能需要更多的错误处理和安全性考虑。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI