V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
larkifly
V2EX  ›  程序员

C 语言如何利用 openssl 进行 rsa pkcs1 加密

  •  
  •   larkifly · 2015-12-12 19:31:13 +08:00 · 4702 次点击
    这是一个创建于 3269 天前的主题,其中的信息可能已经有所发展或是发生改变。

    今天用 no_padding 没问题,用 pkcs1 就报错。报错如下:
    140310769923944:error:0406D06E:lib(4):func(109):reason(110):rsa_pk1.c:151

    代码如下:

    char *rsa_encrypt(char *plain, char *to, char *key_path) {
        char *p_en;
        RSA *p_rsa;
        FILE *file;
        int f_len, rsa_len;
        if((file = fopen(key_path, "r")) == NULL){
            perror("open file error");
            return NULL;
        }
    
        if((p_rsa = PEM_read_RSAPublicKey(file, NULL, NULL, NULL)) ==  NULL){
            ERR_print_errors_fp(stdout);
            return NULL;
        }
    
        f_len = strlen(plain);
        rsa_len = RSA_size(p_rsa);
        p_en = (char *)malloc(rsa_len+1);
        memset(to, 0, rsa_len+1);
        if(RSA_public_encrypt(rsa_len, (unsigned char*)plain, (unsigned char*)p_en, p_rsa, RSA_PKCS1_PADDING) < 0){
            ERR_print_errors_fp(stdout);
            return NULL;
        }
        strcpy(to, (char *)p_en);
        RSA_free(p_rsa);
        fclose(file);
    }
    
    9 条回复    2015-12-15 15:24:57 +08:00
    jukka
        1
    jukka  
       2015-12-12 21:35:51 +08:00
    google: c openssl rsa example
    Xbluer
        2
    Xbluer  
       2015-12-12 22:33:31 +08:00
    不用 google , man RSA_public_encrypt 即可。
    RSA_PKCS1_PADDING 模式下,明文长度 < rsa_len - 11
    semicircle21
        3
    semicircle21  
       2015-12-13 18:23:57 +08:00
    我并不是安全工程师, 只是普通程序员, 所以, 不那么靠谱的安利一下:
    cryptopp 比 openssl 好用多了 ...
    larkifly
        4
    larkifly  
    OP
       2015-12-14 09:52:26 +08:00
    @jukka
    @Xbluer

    google 了,并没有 google 到
    larkifly
        5
    larkifly  
    OP
       2015-12-14 09:52:50 +08:00
    @semicircle21 性能怎么样?
    kimmykuang
        6
    kimmykuang  
       2015-12-14 12:45:14 +08:00 via Android
    @Xbluer 超过了会直接报错而不是截断吗
    Xbluer
        7
    Xbluer  
       2015-12-14 18:42:19 +08:00
    @kimmykuang 不会直接截断。直接截断产生的结果(即密文)是错误的,不符合函数定义的功能。如果需要加密的明文长度较长,则需要分组加密。
    taozhijiangscu
        8
    taozhijiangscu  
       2015-12-15 15:22:03 +08:00
    openssl 自带很多例子, grep 一下游没有相似的呢
    taozhijiangscu
        9
    taozhijiangscu  
       2015-12-15 15:24:57 +08:00
    @taozhijiangscu
    https://github.com/taozhijiang/st_utils/blob/master/source/st_openssl.c

    一般是 AES 块加密,速度性能比较好, RSA 用来加密加密串就好了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   915 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 22:11 · PVG 06:11 · LAX 14:11 · JFK 17:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.