C++ OpenSSL 之二:生成RSA文件

1.等同于生成private key: openssl genrsa -out "save_path" 2048

2.代码如下

bool MakeRsaKeySSL(const char *savePrivateKeyFilePath, const  char *savePublicKeyFilePath) {
    int             ret = 0;
    RSA             *r = NULL;
    BIGNUM          *bne = NULL;
    BIO             *bp_public = NULL, *bp_private = NULL;

    int             bits = 2048;
    unsigned long   e = RSA_F4;

    // 1. generate rsa key
    bne = BN_new();
    ret = BN_set_word(bne, e);
    if (ret != 1) {
        fprintf(stderr, "MakeLocalKeySSL BN_set_word err \n");
        goto free_all;
    }

    r = RSA_new();
    ret = RSA_generate_key_ex(r, bits, bne, NULL);
    if (ret != 1) {
        fprintf(stderr, "MakeLocalKeySSL RSA_generate_key_ex err \n");
        goto free_all;
    }

    // 2. save public key
    if (savePublicKeyFilePath != NULL) {
        bp_public = BIO_new_file(savePublicKeyFilePath, "w+");
        ret = PEM_write_bio_RSAPublicKey(bp_public, r);
        if (ret != 1) {
            fprintf(stderr, "MakeLocalKeySSL PEM_write_bio_RSAPublicKey err \n");
            goto free_all;
        }
    }

    // 3. save private key
    if (savePrivateKeyFilePath != NULL) {
        bp_private = BIO_new_file(savePrivateKeyFilePath, "w+");
        ret = PEM_write_bio_RSAPrivateKey(bp_private, r, NULL, NULL, 0, NULL, NULL);
    }

    // 4. free
free_all:

    BIO_free_all(bp_public);
    BIO_free_all(bp_private);
    RSA_free(r);
    BN_free(bne);

    return (ret == 1);
}

以上。

 

《C++ OpenSSL 之一:编译和使用》
《C++ OpenSSL 之二:生成RSA文件》
《C++ OpenSSL 之三:生成CSR文件》
《C++ OpenSSL 之四:CER转换为PEM》
《C++ OpenSSL 之五:生成P12文件

转载于:https://www.cnblogs.com/chevin/p/11041480.html

首先,为了使用 RSA 算法进行大文件签名和验证,你需要了解 OpenSSL 库和 RSA 算法的基本知识。OpenSSL 是一个开源的加密库,支持多种加密算法,包括 RSA 算法。RSA 算法是一种非对称加密算法,它使用公钥和私钥来加密和解密数据以及进行签名和验证。 下面是使用 OpenSSL 库进行大文件签名和验证的步骤: 1. 生成 RSA 密钥对 使用 OpenSSL生成 RSA 密钥对,可以使用以下命令: ```bash openssl genrsa -out private_key.pem 2048 openssl rsa -in private_key.pem -pubout -out public_key.pem ``` 这将生成一个 2048 位的 RSA 私钥和一个对应的公钥,保存在 private_key.pem 和 public_key.pem 文件中。 2. 加载 RSA 密钥 使用 OpenSSL 库加载 RSA 密钥,可以使用以下代码: ```c++ RSA* rsa = nullptr; FILE* fp = fopen("private_key.pem", "rb"); if (fp) { rsa = PEM_read_RSAPrivateKey(fp, nullptr, nullptr, nullptr); fclose(fp); } ``` 这将加载 private_key.pem 文件中的 RSA 私钥。 3. 对文件进行签名 使用 OpenSSL 库对文件进行签名,可以使用以下代码: ```c++ bool sign_file(const char* filename, const char* signature_filename, RSA* rsa) { bool success = false; FILE* fp = fopen(filename, "rb"); if (fp) { // 计算文件的 SHA256 摘要 SHA256_CTX sha256_ctx; SHA256_Init(&sha256_ctx); unsigned char buffer[4096]; size_t len; while ((len = fread(buffer, 1, sizeof(buffer), fp)) > 0) { SHA256_Update(&sha256_ctx, buffer, len); } unsigned char hash[SHA256_DIGEST_LENGTH]; SHA256_Final(hash, &sha256_ctx); fclose(fp); // 使用 RSA 私钥对摘要进行签名 unsigned char signature[RSA_size(rsa)]; unsigned int signature_length; if (RSA_sign(NID_sha256, hash, sizeof(hash), signature, &signature_length, rsa)) { fp = fopen(signature_filename, "wb"); if (fp) { fwrite(signature, 1, signature_length, fp); fclose(fp); success = true; } } } return success; } ``` 这将对指定的文件进行 SHA256 摘要计算,并使用 RSA 私钥对摘要进行签名,签名结果将保存在指定的文件中。 4. 对文件进行验证 使用 OpenSSL 库对文件进行验证,可以使用以下代码: ```c++ bool verify_file(const char* filename, const char* signature_filename, RSA* rsa) { bool success = false; FILE* fp = fopen(filename, "rb"); if (fp) { // 计算文件的 SHA256 摘要 SHA256_CTX sha256_ctx; SHA256_Init(&sha256_ctx); unsigned char buffer[4096]; size_t len; while ((len = fread(buffer, 1, sizeof(buffer), fp)) > 0) { SHA256_Update(&sha256_ctx, buffer, len); } unsigned char hash[SHA256_DIGEST_LENGTH]; SHA256_Final(hash, &sha256_ctx); fclose(fp); // 加载签名 unsigned char signature[RSA_size(rsa)]; unsigned int signature_length; fp = fopen(signature_filename, "rb"); if (fp) { signature_length = fread(signature, 1, sizeof(signature), fp); fclose(fp); // 使用 RSA 公钥对签名进行验证 if (RSA_verify(NID_sha256, hash, sizeof(hash), signature, signature_length, rsa)) { success = true; } } } return success; } ``` 这将对指定的文件进行 SHA256 摘要计算,并加载签名文件,使用 RSA 公钥对签名进行验证。 注意,在实际应用中,需要对签名和验证的结果进行适当的处理和错误处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值