RSA加密直接使用服务端的代码发现无法服务端解密android的内容,查阅资料后发现最可能出现的问题

Java和Android端的RSA加密填充模式不同

默认设置下

java代码

1
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");

anroid代码

1
Cipher cipher = Cipher.getInstance("RSA/ECB/NoPadding");

如果android端和服务器的填充模式(通过Cipher设置)不同的话,是解密不了的
为了保持一致需要设置为一致

1
2
3
4
//默认设置,会导致模式不一致
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
//推荐android设置(与服务端保持一致就好)
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");

扩展:RSA的填充模式(Padding)

  • RSA_PKCS1_PADDING 填充模式,最常用的模式(Java默认)
    要求: 输入:必须 比 RSA 钥模长(modulus) 短至少11个字节, 也就是 RSA_size(rsa) – 11 如果输入的明文过长,必须切割,然后填充。
    输出:和modulus一样长
    根据这个要求,对于1024bit的密钥,block length = 1024/8 – 11 = 117 字节
  • RSA_PKCS1_OAEP_PADDING
    输入:RSA_size(rsa) – 41
    输出:和modulus一样长
  • RSA_NO_PADDING  不填充(android默认)
    输入:可以和RSA钥模长一样长,如果输入的明文过长,必须切割, 然后填充
    输出:和modulus一样长