概述
在开发过程中,有时会遇到 Android 端和 Java 端(如 Spring Boot)使用 RSA 算法进行加解密时出现不一致的问题。具体表现为:在服务端加密的数据,在 Android 端解密时失败。
问题原因
主要原因是两端使用的 RSA 标准不同,导致加解密算法不匹配。为了解决这一问题,需要确保两端使用相同的加密标准。
解决方案
统一加密标准
1. Android 端
在 Android 端应使用以下标准进行加解密操作:
java
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
2. 服务端(Java)
在服务端(如 Spring Boot)应使用相同的加密标准:
java
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
示例代码
Android 端解密示例
java
public String decrypt(String encryptedData, PrivateKey privateKey) throws Exception {
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] decryptedBytes = cipher.doFinal(Base64.decode(encryptedData, Base64.DEFAULT));
return new String(decryptedBytes, StandardCharsets.UTF_8);
}
服务端(Java)加密示例
java
public String encrypt(String plainText, PublicKey publicKey) throws Exception {
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] encryptedBytes = cipher.doFinal(plainText.getBytes(StandardCharsets.UTF_8));
return Base64.getEncoder().encodeToString(encryptedBytes);
}
注意事项
- 加密标准一致性:确保两端使用相同的加密标准(如
RSA/ECB/PKCS1Padding
),以避免加解密不一致的问题。 - Base64 编码:在传输加密数据时,通常使用 Base64 编码以确保数据格式正确。
- 字符编码:确保在加密和解密过程中使用相同的字符编码(如 UTF-8),以避免字符集不一致导致的问题。