OpenSSL: RSA分段解密实战

本文是OpenSSL RSA加解密系列的实战篇,详细介绍了在实际项目中遇到的RSA分段解密问题。通过C语言实现,阐述了超过128字节数据如何分段解密的流程,并提供了源码示例。文章还解释了RSA加密明文最大长度与解密最大字节数不同的原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


原文 OpenSSL: 实战-RSA分段解密,优快云同步发布。

转载请注明出处,谢谢!


简介

本篇是继 OpenSSL: 简单易上手的RSA加解密 后的补充篇,实战篇。

在实际项目中,并没有像上篇文章写的那么简单,实际情况要复杂的多。万变不离其宗,抽丝剥茧,复杂事务的背后一定是有其本质原因和原理的存在,而我们就是挖掘原理,探索本质的福尔摩斯。

今天这篇文章,带领大家参与到实际项目中运用RSA加解密,在阅读下面内容之前,期望大家可以下载 openssl 的源码,或者下载我 上篇文中 的代码示例。

我下载的是 openssl-source-1.1.0f 这个版本的源码,正好对应我从 precompiled-openssl 下载的编译版本。
在这里插入图片描述

项目概述

该项目的开发语言仍然采用C语言来实现,我们借助 openssl 来模拟实际项目中的案例。

服务端使用 RSA 加密原始数据,然后采用 Base64 编码该加密数据经过 HTTP 传输给到客户端;

客户端接收到该数据,先使用 Base64 解码数据,然后再使用 RSA 解密数据,最终得到原始数据。

这里特别注意,客户端收到的数据大小可能会大于 128 字节,我们知道 RSA 加密明文最大长度 117 字节,而解密的最大值是 128 字节,所以超过该大小需要分段解密数据。

大概流程图如下:
在这里插入图片描述
很简单的一个项目,对吧,接着往下看吧 😃-

解个小惑

也许有些朋友会问,为毛 RSA 加密的明文大小是 117 字节,而解密的最大字节数是 128 字节,两者一样不是更好吗,至少好理解呀?

得出上面结论的前提是我们RSA密钥长度是 1024 位即 128 字节(1024/8=128),同理如果是 512 位的密钥,那么最大的 RSA 解密字节长度应该是(512/8)64 字节,最大加密的明文长度是(64-11)53 字节。

在 openssl 源码中,我们可以看到如下代码:

# define RSA_PKCS1_PADDING_SIZE  11

rsa_sign.c 文件中可以看到 RSA_sign 函数:

int RSA_sign(int type, const unsigned char *m, unsigned int m_len,
             unsigned char *sigret, unsigned int *siglen, RSA *rsa)
{
   
   
    int encrypt_len, encoded_len = 0, ret = 0;
    unsigned char *tmps = NULL;
    const unsigned char *encoded = NULL;

    if (rsa->meth->rsa_sign) {
   
   
        return rsa->meth->rsa_sign(type, m, m_len, sigret, siglen, rsa);
    }

    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值