RSA 与 AES 加密效率对比,用调研事实说明问题,用算法原理解决疑惑

原创博文,欢迎转载,转载时请务必附上博文链接,感谢您的尊重。

系列文章目录

RSA+AES数据传输的加密解密【篇】,项目实战(专题汇总)


前言

往期的所有文章里,我都会在第一行放上跳转【总结】的链接,希望只关注重点的朋友不会在内容上浪费时间。

但是,这期的系列列文章我不会这样做,因为希望需要的朋友仔细的读一读,慢慢的品一品,10分钟时间就能搞定现在主流的“加密解密”架构,何乐而不为呢?

 


一、时间调研

1. 实验背景

  • 为了降低难度,我们以读取纯文本文件为例,把内容分行加密后再写到另一个文件中,最后计算时长(解密相反);
  • 测试项目在我本地,在Junit测试单元上设置JVM内存配置为(-Xmx1024M -Xms1024M);
  • 由于知道 RSA 较慢,所以两种方式使用的文件大小不一样,时间忽略小数,精确到秒;
  • 每种情况我会尝试10次,去掉最高和最低,然后取一个平均值;
  • 测试方法并不完全科学,没有权威性,只做学习参考

2. AES(对称加密)

 原始文件大小(M)加密后文件大小(M)加密平均用时(秒)解密平均用时(秒)
11.63.200
23.26.401
36.412.812
412.825.636
525.651.2612
651.2102.41224

结论:

  • 经测试,加密 1G 的文件大概需要 4 分多钟左右;.
  • 加密后的文件大小是原始文件大小的两倍,刚好,解密文件所需时间也是加密时间的两倍;
  • 说明,AES 算法加密时间与被加密文件大小呈正线性关系。

3. RSA(非对称加密)

 原始文件大小(KB)加密后文件大小(KB)加密平均用时(秒)解密平均用时(秒)
16601
2484809
3192192140
4384384285
57687683170
6153615364330

结论:

  • 加密后的文件与原始文件的大小基本相同;
  • 加密时,随着文件越来越大,RSA 算法的加密时间增加并不明显(与解密时间比);
  • 解密时,随着文件越来越大,RSA 算法的解密时间与解密文件的大小呈现线性增长趋势;
  • 解密的效率远低于加密效率,按照表里的时间估算,加密1G的文件需要1分钟,但是解密却需要65小时。

二、原理

小编承认,AES 和 RSA 加密算法是个很复杂的过程,一本书都可能说不明白,一篇博文要讲清楚更不现实。

鉴于以上考虑,我只总结个重点,方便理解差异性。打算深入研究的话,推荐两篇前辈的博文:

AES加密算法的详细介绍与实现https://blog.csdn.net/qq_28205153/article/details/55798628

阮一峰的网络日志 之 RSA算法原理:http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html

1. AES(对称加密)

AES 的基础运算实际有3种,Sbox,XOR以及移位。

在现有的 CMOS 数字逻辑里,移位代价极低,移位运算的基础操作是异或,代价较低。

唯一代价较高的运算是Sbox,然而,尽管 8bit 的 Sbox 可能比 8-bit 的加法器更慢,但 AES 也只使用 8-bit 的 Sbox 而已,每轮的16个Sbox之间并没有关系,完全可以并行。

还有一点,尽管操作复杂,但由于空间很小,只有256种可能,所以 AES 中的许多中间计算过程是可以事先计算好的,加密数据时许多中间过程可以直接查表,而不需要实时地计算。

2. RSA(非对称加密)

RSA 的基本运算是【幂模运算】,也就是:c^e mod N,这里面无论是c,e还是N,都是数百个二进制位(128/256/512/…)的大数。

模的部分有优化算法处理暂且不谈,我们只看幂运算本身。幂运算的基础单位是乘法,而乘法的基础单位是加法。数字逻辑或者硬件设计的话,应该听说过这个“加法”在电路上比异或要麻烦的多。

所以,加密还好说,公钥可以选的比较小,幂指数没那么大,解密的话,由于私钥不可避免是很大的,幂指数大导致幂模效率必然很低。

虽然后续对这一步进行了很多优化(如:平方乘算法),但是优化后和 AES 算法比,还是要慢很多。


总结

  • 相同的时间条件下,AES 解密的文件是 M 级,而 RSA 解密只有 KB 级,两者解密速度差异相当明显;
  • AES 加密时间是解密时间的一半,而加密前的文件大小也刚好是加密后文件的一半;
  • 对于同一个文件来说,RSA 的加密时间相对解密时间来讲,完全可以忽略不计;
  • 相比AES,RSA 不适合对大的数据进行解密操作,虽然它的安全级别更高。

我是IT无知君,您的点赞、评论和关注,是我创作的动力源泉。
学无止境,气有浩然,让我们一起加油,天涯未远,江湖有缘再见!!

  • 7
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
对于使用C语言实现AES加密算法RSA加密算法,你可以按照以下步骤进行操作: 1. AES加密算法的实现: - 首先,你需要导入相关的库文件,如openssl/aes.h。 - 接下来,你可以选择使用AES-128、AES-192或AES-256等不同的密钥长度。选择一个适合的密钥长度后,你可以生成一个随机的密钥,并设置初始向量(IV)。 - 然后,你可以使用AES加密函数,如AES_set_encrypt_key()和AES_encrypt(),将明文加密为密文。 - 最后,记得释放相关的资源,并清理内存。 2. RSA加密算法的实现: - 首先,你需要导入相关的库文件,如openssl/rsa.h。 - 接下来,你可以使用RSA_generate_key函数生成RSA的公钥和私钥。 - 然后,你可以使用RSA公钥对明文进行加密,使用RSA私钥对密文进行解密。 - 除此之外,你还可以使用RSA私钥对明文进行签名,使用RSA公钥对签名进行验证。 下面是一个示例代码,演示了如何使用C语言实现AESRSA加密算法: ```c #include <stdio.h> #include <openssl/aes.h> #include <openssl/rsa.h> #include <openssl/pem.h> #include <openssl/err.h> // AES加密函数 void aes_encrypt(const unsigned char *plain_text, unsigned char *cipher_text, const unsigned char *key, const unsigned char *iv) { AES_KEY aes_key; AES_set_encrypt_key(key, 128, &aes_key); AES_cbc_encrypt(plain_text, cipher_text, 128, &aes_key, iv, AES_ENCRYPT); } // RSA加密函数 int rsa_encrypt(const unsigned char *plain_text, int plain_text_len, unsigned char *cipher_text, RSA *rsa) { int rsa_len = RSA_size(rsa); int result = RSA_public_encrypt(plain_text_len, plain_text, cipher_text, rsa, RSA_PKCS1_PADDING); return result; } int main() { // AES加密示例 unsigned char aes_key[16]; // 128位密钥 unsigned char iv[16]; // 初始向量 unsigned char plain_text[] = "Hello, AES!"; unsigned char cipher_text[128]; // 生成随机的密钥和初始向量 // ... // 使用AES加密算法加密明文 aes_encrypt(plain_text, cipher_text, aes_key, iv); printf("AES Encrypted Text: %s\n", cipher_text); // RSA加密示例 RSA *rsa = RSA_generate_key(2048, RSA_F4, NULL, NULL); unsigned char rsa_plain_text[] = "Hello, RSA!"; unsigned char rsa_cipher_text[256]; // 使用RSA公钥加密明文 rsa_encrypt(rsa_plain_text, sizeof(rsa_plain_text), rsa_cipher_text, rsa); printf("RSA Encrypted Text: %s\n", rsa_cipher_text); RSA_free(rsa); return 0; } ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java Punk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值