zoukankan      html  css  js  c++  java
  • C++调用openssl库生成RSA加密秘钥对

    直接上代码。默认生成的是pkcs#1格式

    // ---- rsa非对称加解密 ---- //    
    #define KEY_LENGTH  1024               // 密钥长度  
    #define PUB_KEY_FILE "pubkey.pem"    // 公钥路径  
    #define PRI_KEY_FILE "prikey.pem"    // 私钥路径  
      
    // 函数方法生成密钥对   
    void generateRSAKey(std::string strKey[2])  
    {  
        // 公私密钥对    
        size_t pri_len;  
        size_t pub_len;  
        char *pri_key = NULL;  
        char *pub_key = NULL;  
      
        // 生成密钥对    
        RSA *keypair = RSA_generate_key(KEY_LENGTH, RSA_F4, NULL, NULL);  
      
        BIO *pri = BIO_new(BIO_s_mem());
        BIO *pub = BIO_new(BIO_s_mem()); 
      
        PEM_write_bio_RSAPrivateKey(pri, keypair, NULL, NULL, 0, NULL, NULL);  
        PEM_write_bio_RSAPublicKey(pub, keypair);  
      
        // 获取长度    
        pri_len = BIO_pending(pri);  
        pub_len = BIO_pending(pub); 
      
        // 密钥对读取到字符串
        pri_key = (char *)malloc(pri_len + 1);  
        pub_key = (char *)malloc(pub_len + 1);  
      
        BIO_read(pri, pri_key, pri_len);  
        BIO_read(pub, pub_key, pub_len);  
      
        pri_key[pri_len] = '';  
        pub_key[pub_len] = '';  
      
        // 存储密钥对    
        strKey[0] = pub_key;  
        strKey[1] = pri_key;  
      
        // 存储到磁盘(这种方式存储的是begin rsa public key/ begin rsa private key开头的)  
        FILE *pubFile = fopen(PUB_KEY_FILE, "w");  
        if (pubFile == NULL)  
        {  
            assert(false);  
            return;  
        }  
        fputs(pub_key, pubFile);  
        fclose(pubFile);  
      
        FILE *priFile = fopen(PRI_KEY_FILE, "w");  
        if (priFile == NULL)  
        {  
            assert(false);  
            return;  
        }  
        fputs(pri_key, priFile);  
        fclose(priFile);  
      
        // 内存释放  
        RSA_free(keypair);  
        BIO_free_all(pub);  
        BIO_free_all(pri);  
      
        free(pri_key);  
        free(pub_key);  
    }  

    附1:C++ 使用openssl库实现 DES 加密——CBC模式 && RSA加密——公加私解——私加公解

  • 相关阅读:
    shiro3
    shiro2
    shiro1
    Android设计模式之策略模式
    Notify通知
    Menu菜单
    Windows下配置cygwin和ndk编译环境
    Android组件化和插件化开发
    android MVP模式介绍与实战
    实现LoaderCallbacks接口动态循环加载网上图片并展示在手机屏幕上 ...
  • 原文地址:https://www.cnblogs.com/azbane/p/10180263.html
Copyright © 2011-2022 走看看