项目中常常会遇到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生成的代码也有问题,特此记录。