• rsa加密--选择padding模式需要注意的问题。。。


    最近在做一个项目中需要,在android对一个密码字段首先进行

    一次md5加密后再进行一次rsa加密,然后把加密的结果通过

    json协议传输给nginx服务器进行解密。在android中,可以直接

    使用java提供Cipher类来进行加密,nginx服务器使用openssl来进行解密。

    android客户端使用RSA加密的字段,要使nginx服务器能正常解密,

    这里需要客户端和服务器统一RSA加密所用的填充方式。

    RSA加密常用的填充方式有下面3种:

    1.RSA_PKCS1_PADDING 填充模式,最常用的模式

    要求:
    输入:必须 比 RSA 钥模长(modulus) 短至少11个字节, 也就是 RSA_size(rsa) – 11
    如果输入的明文过长,必须切割, 然后填充

    输出:和modulus一样长

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

    2.RSA_PKCS1_OAEP_PADDING
    输入:RSA_size(rsa) – 41

    输出:和modulus一样长

    3.for RSA_NO_PADDING  不填充

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

    输出:和modulus一样长

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

    但跟AES等不同的是, block length是跟key length有关的。

    每次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的区别就是加密前的编码方式不一样。

    http://tools.ietf.org/html/rfc2313 这里面有一些关于RSA加密PKCS#1标准的有关介绍,感兴趣的同学

    可以去看一下。。。

  • 相关阅读:
    [ACM] hdu 1671 Phone List (特里)
    Android 记录的(MediaRecorder)而播放(MediaPlayer)
    菜鸟进阶Android Touch事件传递(四)
    九度oj题目&吉大考研11年机试题全解
    怎样取消shutdown关机命令?-shutdown命令的使用解析
    怎样下载并编译Android4.0内核源代码goldfish(图文)
    三角函数图像
    HTML里面Textarea换行总结
    java中使用队列:java.util.Queue
    ContentProvider简单介绍
  • 原文地址:https://www.cnblogs.com/lzl-sml/p/3501447.html
Copyright © 2020-2023  润新知