RAS算法使用公钥加密代码:
/** * 公钥加密 */ public static String encryptByPublicKey(String data, String key) throws GeneralSecurityException { byte[] keyBytes = Base64.decode(key, NO_WRAP); X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); PublicKey pubKey = keyFactory.generatePublic(keySpec); Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); cipher.init(Cipher.ENCRYPT_MODE, pubKey); byte[] mi = cipher.doFinal(data.getBytes()); return Base64.encodeToString(mi, Base64.DEFAULT); }
和后台调试了大半天总是鉴权失败,查找很多资料,甚至和后台java代码对比,也发现不了到底有什么不一样。
问题的根因在于android底层还是和原生的java有很多的区别。根因就在于这句代码:
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
在获取Cipher的实例时,参数改成RSA/ECB/PKCS1Padding即可。原因就是此处如果写成"RSA"加密出来的信息JAVA服务器无法解析 且每次加密出来的密文都是
一样的(RSA算法加密出来的算法应该是每次都不一样)
根本原因还没来得及去研究.有兴趣的同学可以去研究下
---------- 神坑。。。