openssl 版本 1.1.0f
/** * 公钥加密 * @param data * @param type 0 为默认,1 为使用的 key1 密钥对,2 为使用的 key2 密钥对 * @return */ std::string MyRSA::encryptRSA(const std::string& data, int *lenreturn, int type) { int ret, fle; BIO *bio = NULL; RSA *r = NULL; if(type == 2){ bio = BIO_new_mem_buf((void *)PUBLICKEY_KEY2, -1); }else if(type == 1){ bio = BIO_new_mem_buf((void *)PUBLICKEY_KEY1, -1); }else{ bio = BIO_new_mem_buf((void *)PUBLICKEY, -1); } if (bio == NULL) //从字符串读取 RSA 公钥 { LOGE("BIO_new_mem_buf failed!\n"); } r = PEM_read_bio_RSA_PUBKEY(bio, NULL, NULL, NULL); flen = RSA_size(r); lenreturn = &flen; LOGE("wiket test RSA encryptRSA:RSA_size %d", flen); static std::string text; text.clear(); char *dst = NULL; dst = (char *) malloc(flen+1); memset(dst, 0, flen + 1); //RSA_PKCS1_PADDING 最大加密长度 为 128 -11 //RSA_NO_PADDING 最大加密长度为 128 ret = RSA_public_encrypt(flen - 11, (unsigned char*)data.c_str(), (unsigned char*)dst, r, RSA_PKCS1_PADDING); LOGE("wiket test RSA encryptRSA:after encryptChar_size %d", strlen(dst)); text.assign(dst); LOGE("wiket test RSA encryptRSA:after encryptStr_size %d", text.length()); RSA_free(r); BIO_free_all(bio); free(dst); CRYPTO_cleanup_all_ex_data(); //清除管理 CRYPTO_EX_DATA 的全局 hash 表中的数据,避免内存泄漏 return text; }
然而通过上述函数加密得到的密文长度非固定 128 位
请问大神们,如果需要最终得到的密文( dst )长度固定为 128 该如何实现?
![]() | 1 RLib 2017-08-02 16:57:56 +08:00 RSA1024 的话, 密文的长度就是固定的 RSA_size(r) = 128 bytes, 你这里对密文不要直接当成文本计算长度, 可以考虑 hexencode 或者 base64 |
![]() | 2 wiket OP @RLib 通过对密文进行 hexencode 和 base64encode 之后,很大的概率得到的 string 长度会不固定,这样子传给第三方无法进行 decode 后再进行解密了。 仅仅密文长度是 128 的时候,经过 base64encode 或者 hexencode,给到第三方就能够解密 |
3 gnaggnoyil 2017-08-03 01:19:26 +08:00 我不知道你是用什么观测方式得到结论密文长度不是 128 位的.但是如果你是通过在函数外部查看*lenreturn 的值来观测的话,我很明确地告诉你,你并没有观测到密文的长度对 dangling pointer 解引用是未定义行为. |
![]() | 4 wiket OP @gnaggnoyil 我是通过 strlen(dst)获取的长度 按照我的理解,既然密钥是 128 位的,那么不考虑明文长度超长的情况下,应该每次通过 RSA_public_encrypt ()得到的密文长度应该是一致的呀。 是否是我的代码里面的变量使用方式不对? 请问有什么方式能保证我得到的 dst 或者 text 的长度是 128 位的吗? |