zoukankan      html  css  js  c++  java
  • RSA加密常用的填充方式 以及 常见错误

    一、RSA加密常用的填充方式

    1.RSA_PKCS1_PADDING 

    输入:比 RSA modulus 短至少11个字节。如果输入的明文过长,必须切割,然后填充

    输出:和modulus一样长

    根据这个要求,对于512bit的密钥, block length = 512/8 – 11 = 53 字节

             1024                                      1024/8 - 11 = 117

    当java.security.KeyPairGenerator.initialize(int keysize) 来定义密钥长度为1024时,那么我们需要加密的明文长度不能超过117字节

    否则 javax.crypto.IllegalBlockSizeException: Data must not be longer than 117 bytes 

          

    2.RSA_PKCS1_OAEP_PADDING
    输入: 比 RSA modulus 短至少41个字节

    输出:和modulus一样长

    3.RSA_NO_PADDING

    输入:可以和RSA modulus一样长,如果输入的明文过长,必须切割, 然后填充

    输出:和modulus一样长

    和AES一样, RSA也是一个块加密算法( block cipher algorithm),总是在一个固定长度的块上进行操作。

    和AES不同的是, RSA block length是跟key length有关的。

    The AES algorithm has a 128-bit block size, regardless of whether you key length is 256, 192 or 128 bits.

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

    需要注意:

    假如你选择的秘钥长度为1024bit共128个byte:

    1.当你在客户端选择RSA_NO_PADDING填充模式时,如果你的明文不够128字节,加密的时候会在你的明文前面填充零。

    解密后的明文也会包括前面填充的零,这是服务器需要注意把解密后的字段前向填充的零去掉,才是真正之前加密的明文。

    2.当你选择RSA_PKCS1_PADDING填充模式时,如果你的明文不够128字节

    加密的时候会在你的明文中随机填充一些数据,所以会导致对同样的明文每次加密后的结果都不一样。

    对加密后的密文,服务器使用相同的填充方式都能解密。解密后的明文也就是之前加密的明文。

    3.RSA_PKCS1_OAEP_PADDING填充模式没有使用过, 他是PKCS#1推出的新的填充方式,安全性是最高的,

    和前面RSA_PKCS1_PADDING的区别就是加密前的编码方式不一样。

    二、常见错误

    1.java.security.NoSuchAlgorithmException: Cannot find any provider supporting RSA/NONE/OAEPPADDING

    import java.security.Security;  
    import org.bouncycastle.jce.provider.BouncyCastleProvider;  
      
    Security.addProvider(new BouncyCastleProvider());

    2.ArrayIndexOutOfBoundsException: too much data for RSA block

    3.java.security.InvalidKeyException: Illegal key size

    因为美国法律限制,JAVA默认支持AES  128 Bit 的key, 如果你计划使用 192 Bit 或者 256 Bit key, java complier 会抛出 Illegal key size Exception

    解决方案有两种:

    1. 需要安装Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 
    2. 设置设置key的长度为16个字符(128 /8=16)就不报错了。
  • 相关阅读:
    狄慧201771010104《面向对象程序设计(java)》第十一周学习总结
    狄慧201771010104《面向对象程序设计(java)》第十周学习总结
    狄慧201771010104《面向对象程序设计(java)》第九周学习总结
    狄慧201771010104《面向对象程序设计(java)》第八周学习总结
    狄慧201771010104《面向对象程序设计(java)》第七周学习总结
    狄慧201771010104《面向对象程序设计(java)》第六周学习总结
    狄慧201771010104《面向对象程序设计(java)》第四周学习总结
    狄慧201771010104《面向对象程序设计(java)》第三周学习总结
    如何在cisco官网上下载Cisco packet tracer模拟器
    王之泰《面向对象程序设计(java)》课程学习总结
  • 原文地址:https://www.cnblogs.com/yuyutianxia/p/7053110.html
Copyright © 2011-2022 走看看