在Android客户端和Python服务器之间使用AES + RSA加密时,如果出现“填充块损坏”的错误,可能是由于加密算法或密钥不一致导致的。
首先,确保Android客户端和Python服务器使用相同的加密算法和密钥长度。例如,在AES加密中,常用的密钥长度有128位、192位和256位。确保使用相同的密钥长度可以避免填充块损坏的错误。
其次,确保Android客户端和Python服务器使用相同的填充模式。常见的填充模式有PKCS5Padding和PKCS7Padding。确保在加解密过程中使用相同的填充模式可以避免填充块损坏的错误。
下面是一个Android客户端和Python服务器之间使用AES + RSA加密的示例代码:
Android客户端代码:
// AES加密
public static String encrypt(String plaintext, SecretKey secretKey) throws Exception {
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] encryptedBytes = cipher.doFinal(plaintext.getBytes("UTF-8"));
return Base64.encodeToString(encryptedBytes, Base64.DEFAULT);
}
// RSA加密
public static String encryptWithRSA(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("UTF-8"));
return Base64.encodeToString(encryptedBytes, Base64.DEFAULT);
}
Python服务器代码:
from Crypto.Cipher import AES, PKCS1_OAEP
from Crypto.PublicKey import RSA
from Crypto.Util.Padding import pad, unpad
import base64
# AES解密
def decrypt(ciphertext, key):
cipher = AES.new(key, AES.MODE_CBC)
decryptedBytes = cipher.decrypt(base64.b64decode(ciphertext))
return unpad(decryptedBytes, 16).decode('utf-8')
# RSA解密
def decryptWithRSA(ciphertext, privateKey):
cipher = PKCS1_OAEP.new(privateKey)
decryptedBytes = cipher.decrypt(base64.b64decode(ciphertext))
return decryptedBytes.decode('utf-8')
请注意,代码示例中使用的AES密钥和RSA密钥需要在Android客户端和Python服务器之间安全地交换和存储。此外,示例代码中仅提供了加密和解密的方法,如需完整的通信过程,还需要实现密钥交换和消息传递等部分。