算法 加密并设置授权时间以及返回过期信息-----C++版本

以下是将上述Python代码转换为C++的等效代码示例:

#include <iostream>
#include <string>
#include <chrono>
#include <ctime>
#include <sstream>
#include <iomanip>
#include <openssl/evp.h>
#include <openssl/aes.h>

std::string generate_key() {
    constexpr size_t key_length = 32;  // 密钥长度为32字节
    std::string key;
    key.resize(key_length);

    FILE* fp = fopen("/dev/urandom", "r");
    if (fp) {
        fread(&key[0], 1, key_length, fp);
        fclose(fp);
    }

    return key;
}

std::string encrypt_data(const std::string& key, const std::string& data) {
    const unsigned char* key_data = reinterpret_cast<const unsigned char*>(key.data());
    const unsigned char* data_data = reinterpret_cast<const unsigned char*>(data.data());
    std::string encrypted_data;

    AES_KEY aes_key;
    AES_set_encrypt_key(key_data, 256, &aes_key);
    encrypted_data.resize(data.length() + AES_BLOCK_SIZE);

    unsigned char* encrypted_data_data = reinterpret_cast<unsigned char*>(&encrypted_data[0]);
    AES_cbc_encrypt(data_data, encrypted_data_data, data.length(), &aes_key, nullptr, AES_ENCRYPT);

    return encrypted_data;
}

std::string decrypt_data(const std::string& key, const std::string& encrypted_data) {
    const unsigned char* key_data = reinterpret_cast<const unsigned char*>(key.data());
    const unsigned char* encrypted_data_data = reinterpret_cast<const unsigned char*>(encrypted_data.data());
    std::string decrypted_data;

    AES_KEY aes_key;
    AES_set_decrypt_key(key_data, 256, &aes_key);
    decrypted_data.resize(encrypted_data.length());

    unsigned char* decrypted_data_data = reinterpret_cast<unsigned char*>(&decrypted_data[0]);
    AES_cbc_encrypt(encrypted_data_data, decrypted_data_data, encrypted_data.length(), &aes_key, nullptr, AES_DECRYPT);

    return decrypted_data;
}

std::string set_expiration(const std::string& key, const std::string& expiration_time) {
    std::time_t timestamp = std::time(nullptr);
    std::ostringstream oss;
    oss << timestamp;

    std::string encrypted_timestamp = encrypt_data(key, oss.str());
    return encrypted_timestamp + expiration_time;
}

std::string check_expiration(const std::string& key, const std::string& data, const std::string& expiration_time) {
    std::string encrypted_timestamp = data;  // .substr(0, 44)从加密数据中获取时间戳部分
    std::string decrypted_timestamp = decrypt_data(key, encrypted_timestamp);
    std::time_t timestamp = std::stol(decrypted_timestamp);

    std::time_t current_time = std::time(nullptr);
    double elapsed_seconds = std::difftime(current_time, timestamp);
    double expiration_seconds = std::stod(expiration_time);

    if (elapsed_seconds > expiration_seconds) {
        return "授权已过期";
    } else {
        return "授权有效";
    }
}

int main() {
    std::string key = generate_key();
    std::string data = "Hello, World!";

    std::string encrypted_data = encrypt_data(key, data);
    std::cout << "加密后的数据: " << encrypted_data << std::endl;

    std::string decrypted_data = decrypt_data(key, encrypted_data);
    std::cout << "解密后的数据: " << decrypted_data << std::endl;

    std::string expiration_info = set_expiration(key, "60");
    std::cout << "加密后的数据(包含授权时间和过期信息): " << expiration_info << std::endl;

    std::string result = check_expiration(key, expiration_info, "60");
    std::cout << result << std::endl;

    return 0;
}

在C++代码中,我们使用了OpenSSL库中的AES算法来进行加密和解密操作。请确保在编译和运行代码时已正确链接OpenSSL库。

此外,请注意C++代码中的时间戳使用了std::time(nullptr)来获取当前时间,使用std::difftime来计算时间差。输出控制使用了std::cout进行打印。

请根据您的实际环境和需求进行相应的调整和扩展。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值