Android RSA 公钥加密

在安卓开发中,数据的安全性是非常重要的。一种常见的保护数据的方式是使用非对称加密算法,其中 RSA 是最常用的一个算法。本文将介绍如何在 Android 中使用 RSA 公钥加密数据,并提供相应的代码示例。

什么是 RSA 加密

RSA 是一种非对称加密算法,它使用一对密钥:公钥和私钥。公钥用于加密数据,私钥用于解密数据。由于公钥可以公开,因此任何人都可以使用公钥加密数据。而只有持有私钥的人才能解密这些数据。

RSA 加密的原理是基于大数分解的难题。其核心思想是选择两个大素数 p 和 q,然后计算 n = p * q。再选择一个与 (p-1)*(q-1) 互质的整数 e,作为公钥的一部分。然后,根据 e 和 n 计算出 d,作为私钥的一部分。公钥是 (e, n),私钥是 (d, n)。

加密时,将明文 m 经过公式 c = m^e mod n 计算得到密文 c。解密时,将密文 c 经过公式 m = c^d mod n 计算得到明文 m。

在 Android 中使用 RSA 加密

在 Android 中使用 RSA 加密数据需要以下步骤:

  1. 生成密钥对:使用 KeyPairGenerator 类生成一对公钥和私钥。示例代码如下:
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(2048); // 设置密钥长度
KeyPair keyPair = keyPairGenerator.generateKeyPair();

PublicKey publicKey = keyPair.getPublic();
PrivateKey privateKey = keyPair.getPrivate();
  1. 加密数据:使用公钥对数据进行加密。示例代码如下:
String data = "Hello, RSA!";
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] encryptedData = cipher.doFinal(data.getBytes());
  1. 解密数据:使用私钥对加密后的数据进行解密。示例代码如下:
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] decryptedData = cipher.doFinal(encryptedData);
String decryptedString = new String(decryptedData);

示例代码

以下是一个完整的示例代码,演示了如何在 Android 中使用 RSA 公钥加密数据:

import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;

import javax.crypto.Cipher;

public class RSACryptor {
    private PublicKey publicKey;
    private PrivateKey privateKey;

    public RSACryptor() {
        try {
            KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
            keyPairGenerator.initialize(2048);
            KeyPair keyPair = keyPairGenerator.generateKeyPair();

            publicKey = keyPair.getPublic();
            privateKey = keyPair.getPrivate();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public byte[] encrypt(String data) {
        try {
            Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
            cipher.init(Cipher.ENCRYPT_MODE, publicKey);
            return cipher.doFinal(data.getBytes());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public String decrypt(byte[] encryptedData) {
        try {
            Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
            cipher.init(Cipher.DECRYPT_MODE, privateKey);
            byte[] decryptedData = cipher.doFinal(encryptedData);
            return new String(decryptedData);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

序列图

下面是使用 Mermaid 语法绘制的 RSA 加密的序列图:

sequenceDiagram
    participant Android
    participant Server

    Android->>Server: 生成密钥对
    Server-->>Android: 返回公钥和私钥

    Android->>Server: 加密数据
    Server-->>Android: 返回加密后的数据

    Android->>Server: 解密数据
    Server-->>Android: 返回解密后的数据

总结

本文介绍了在 Android 中使用 RSA 公钥