zoukankan      html  css  js  c++  java
  • RSA非对称加解密算法填充方式(Padding)

    摘自:https://blog.csdn.net/makenothing/article/details/88429511

    1. padding模式

    1.1 三类常见填充方式

    RSA加密常用的填充模式有三种:RSA_PKCS1_PADDING, RSA_PKCS1_OAEP_PADDING, RSA_NO_PADDING。

    与对称加密算法DES,AES一样,RSA算法也是一个块加密算法( block cipher algorithm),总是在一个固定长度的块上进行操作。但跟AES等不同的是,block length是跟key length有关的。

    每次RSA加密的明文的长度是受RSA填充模式限制的,但是RSA每次加密的块长度就是key length。

    填充方式输入输出条件
    RSA_PKCS1_PADDING 必须 比 RSA 钥模长(modulus) 短至少11个字节, 也就是 RSA_size(rsa) – 11 和modulus一样长  
    RSA_PKCS1_OAEP_PADDING RSA_size(rsa) – 41 和modulus一样长  
    RSA_NO_PADDING 可以和RSA钥模长一样长,如果输入的明文过长,必须切割, 然后填充 和modulus一样长  

    1.2 不同模式下的加密的最大数据长度

    • 在不同的padding模式下,使用相同长度的密钥可以加密的数据最大长度不同;
    • 在不同密钥长度下,使用相同的padding模式可以加密的数据最大长度也不同;

    因此,脱离了密钥长度而讨论padding模式可以加密的最大长度是不严谨的。

    常用的密钥长度有1024bits,2048bits等,理论上1024bits的密钥可以加密的数据最大长度为1024bits(即1024/8 = 128bytes)。2048bits的密钥可以加密的数据最大长度为2048bits(2048/8 = 256bytes),但是RSA在实际应用中不可能使用这种“教科书式的RSA”系统。实际应用中RSA经常与填充技术(padding)一起使用,可以增加RSA的安全性。填充技术实现的不好,RSA也不会安全。原因如下:

      1. RSA加密是确定的,即给定一个密钥,特定明文总会映射到特定的密文。攻击者可以根据密文中统计信息获取明文的一些信息。
      2. 填充技术如果比较弱,那么较小的明文和小型公开指数e将易于受到攻击。
      3. RSA有个特性叫做延展性,如果攻击者可以将一种密文转换为另一种密文,儿这种新密文会导致对明文的转换变得可知,这种特性并没有解密明文,而是以一种可预测的方式操纵了明文,比如:银行交易系统中,攻击者根据新密文,直接去修改原密文中金额的数据,可以在用户和接受方无法感知的情况下进行修改。
        所以,填充技术关系到RSA的安全性的高低。最优非对称填充(OAEP)就是一种优秀的填充方式,对应上述表格中RSA_PKCS1_OAEP_PADDING填充方式。
  • 相关阅读:
    【深入理解Java虚拟机】类加载机制
    【深入理解Java虚拟机】四种引用类型的特点
    【深入理解Java虚拟机】JVM内存区域
    【每日一题】单词搜索
    过滤器和拦截器有啥区别,这次会了!
    Filter过滤器简单入门
    SpringMVC的运行流程+常用注解总结
    SpringAOP+源码解析,切就完事了
    Spring的循环依赖,学就完事了【附源码】
    Markdown的流程图制作
  • 原文地址:https://www.cnblogs.com/LiuYanYGZ/p/14012280.html
Copyright © 2011-2022 走看看