python生成RSA密匙对

from Crypto.PublicKey import RSA
from Crypto import Random
RANDOM_GENERATOR = Random.new().read
    rsa = RSA.generate(1024, RANDOM_GENERATOR)
    # 秘钥对的生成
    PRIVATE_PEM = rsa.exportKey()
    with open('master-private.pem', 'w') as f:
        f.write(PRIVATE_PEM.decode('utf-8'))
    PUBLIC_PEM = rsa.publickey().exportKey()
    with open('master-public.pem', 'w') as f:
        f.write(PUBLIC_PEM.decode('utf-8'))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是基于OpenSSL的C++代码实现: ```cpp #include <openssl/rsa.h> #include <openssl/sha.h> #include <openssl/bio.h> #include <openssl/pem.h> void generateRSAKeyPair(char* publicKey, char* privateKey) { RSA *rsa = RSA_new(); BIGNUM *bn = BN_new(); SHA256_CTX sha256; unsigned char hash[SHA256_DIGEST_LENGTH]; char hexHash[SHA256_DIGEST_LENGTH * 2 + 1]; BIO *bio = NULL; int ret; // 生成RSA密钥对 BN_set_word(bn, RSA_F4); RSA_generate_key_ex(rsa, 2048, bn, NULL); BN_free(bn); // 生成公钥PEM文件 bio = BIO_new(BIO_s_mem()); ret = PEM_write_bio_RSAPublicKey(bio, rsa); if (ret != 1) { printf("Error: Failed to write public key!\n"); RSA_free(rsa); BIO_free(bio); return; } ret = BIO_flush(bio); if (ret != 1) { printf("Error: Failed to flush BIO!\n"); RSA_free(rsa); BIO_free(bio); return; } ret = BIO_get_mem_data(bio, &publicKey); if (ret <= 0) { printf("Error: Failed to get public key data from BIO!\n"); RSA_free(rsa); BIO_free(bio); return; } publicKey[ret] = '\0'; BIO_free(bio); // 生成私钥PEM文件 bio = BIO_new(BIO_s_mem()); ret = PEM_write_bio_RSAPrivateKey(bio, rsa, NULL, NULL, 0, NULL, NULL); if (ret != 1) { printf("Error: Failed to write private key!\n"); RSA_free(rsa); BIO_free(bio); return; } ret = BIO_flush(bio); if (ret != 1) { printf("Error: Failed to flush BIO!\n"); RSA_free(rsa); BIO_free(bio); return; } ret = BIO_get_mem_data(bio, &privateKey); if (ret <= 0) { printf("Error: Failed to get private key data from BIO!\n"); RSA_free(rsa); BIO_free(bio); return; } privateKey[ret] = '\0'; BIO_free(bio); // 计算公钥SHA256哈希值 SHA256_Init(&sha256); ret = i2d_RSAPublicKey(rsa, NULL); if (ret <= 0) { printf("Error: Failed to get public key data length!\n"); RSA_free(rsa); return; } unsigned char *publicKeyData = (unsigned char *)malloc(ret); ret = i2d_RSAPublicKey(rsa, &publicKeyData); if (ret <= 0) { printf("Error: Failed to get public key data!\n"); RSA_free(rsa); free(publicKeyData); return; } SHA256_Update(&sha256, publicKeyData, ret); free(publicKeyData); SHA256_Final(hash, &sha256); // 将SHA256哈希值转换为十六进制字符串 for (int i = 0; i < SHA256_DIGEST_LENGTH; i++) { sprintf(hexHash + i * 2, "%02x", hash[i]); } hexHash[SHA256_DIGEST_LENGTH * 2] = '\0'; printf("Public Key:\n%s\n", publicKey); printf("Private Key:\n%s\n", privateKey); printf("Public Key SHA256 Hash:\n%s\n", hexHash); RSA_free(rsa); } ``` 其,`generateRSAKeyPair`函数接受两个`char`类型的指针参数,用于返回生成的公钥和私钥PEM文件内容。该函数实现了以下操作: 1. 生成2048位RSA密钥对; 2. 将公钥PEM文件内容写入内存`BIO`,并获取其数据; 3. 将私钥PEM文件内容写入内存`BIO`,并获取其数据; 4. 计算公钥的SHA256哈希值,并将其转换为十六进制字符串; 5. 打印公钥、私钥和SHA256哈希值。 需要注意的是,该实现使用了OpenSSL的函数,因此需要在编译时链接OpenSSL
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值