項目中常常會遇到Android前端使用后端提供的公鑰加密數據的場景。需要注意Java后端的java.util.Base64
默認Base64標準和Android的android.util.Base64
是不一樣的。
此外,RSA算法標準也需要前后端顯式約定。
示例代碼:
import android.util.Base64;import java.nio.charset.StandardCharsets;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.spec.X509EncodedKeySpec;public class RSACrypto {public static final String PUB_KEY = "xxxxxxxxxxxxxx你的后端公鑰";public static PublicKey getPublicKey() throws Exception {byte[] keyBytes = Base64.decode(PUB_KEY, Base64.DEFAULT);X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);KeyFactory keyFactory = KeyFactory.getInstance("RSA");return keyFactory.generatePublic(keySpec);}public static String publicEncrypt(PublicKey publicKey, String encrypted) throws Exception {Cipher cipher = Cipher.getInstance("RSA/None/PKCS1Padding");cipher.init(Cipher.ENCRYPT_MODE, publicKey);byte[] data = cipher.doFinal(encrypted.getBytes(StandardCharsets.UTF_8));return Base64.encodeToString(data, Base64.NO_WRAP);}
}
其中,加密結果用Base64.NO_WRAP編碼,公鑰用Base64.DEFAULT解碼,加密算法是RSA/None/PKCS1Padding。網上關于Android的RSA加密示例代碼很多都沒提到,GPT生成的代碼也有問題,特此記錄。