Android RSA數據加密與Java服務端RSA私鑰解密出錯問題

 

1. 出錯描述:服務RSA解密拋出javax.crypto.BadPaddingException: Decryption errorjava

2.出錯緣由:Android系統使用的虛擬機(dalvik)跟SUN標準JDK是有所區別的,其中他們默認的RSA實現就不一樣。即Android端用Cipher.getInstance("RSA")方法進行加密時,使用的provider是Bouncycastle Security provider,Bouncycastle Security provider默認實現的是「RSA/None/NoPadding」算法,而服務器(PC)端用Cipher.getInstance("RSA")進行解密時,使用的是Sun的security provider,實現的是「RSA/None/PKCS1Padding」算法,因此,解密時會失敗。算法

3. 解決方法:Android端的加密算法以下服務器

/**
 * 公鑰加密
 * @param data 待加密數據
 * @param key 密鑰
 * @return byte[] 加密數據
 * */
public static byte[] encryptByPublicKey(byte[] data,String key) throws Exception{

    //解密密鑰
    byte[] keyBytes = decryptBASE64(key);

    //實例化密鑰工廠
    KeyFactory keyFactory=KeyFactory.getInstance(KEY_ALGORITHM);
    //初始化公鑰
    //密鑰材料轉換
    X509EncodedKeySpec x509KeySpec=new X509EncodedKeySpec(keyBytes);
    //產生公鑰
    PublicKey pubKey=keyFactory.generatePublic(x509KeySpec);

    //數據加密
    Cipher cipher=Cipher.getInstance("RSA/None/PKCS1Padding");//Android端使用
    cipher.init(Cipher.ENCRYPT_MODE, pubKey);
    return cipher.doFinal(data);
}
相關文章
相關標籤/搜索