go to index

android端和Java端RSA加解密不一致的解决办法

read time 2 min read
Android 安卓 Java RSA 加密 解密

概述

在开发过程中,有时会遇到 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),以避免字符集不一致导致的问题。