Android开发 django后端 客户端加密时使用AES加密数据,AES密钥使用RSA加密,同时发送给服务器。服务器先RSA解密获取AES密钥,再AES解密数据。综合了两种加密算法的优点。帮我封装kotlin代码和python代码 并附上使用 方法
时间: 2024-04-12 22:32:23 浏览: 157
前端(javascript)使用AES、RSA对数据进行加密以及解密,本人亲测代码通过
当然可以!下面是一个示例的 Kotlin 代码和 Python 代码,用于在 Android 客户端和 Django 后端之间进行 AES 加密和 RSA 加密的数据传输:
Kotlin 代码(Android 客户端):
```kotlin
import javax.crypto.Cipher
import javax.crypto.spec.SecretKeySpec
import java.security.KeyFactory
import java.security.PrivateKey
import java.security.PublicKey
import java.security.spec.PKCS8EncodedKeySpec
import java.security.spec.X509EncodedKeySpec
import java.util.Base64
// AES 加密函数
fun encryptAES(data: String, key: String): String {
val cipher = Cipher.getInstance("AES/ECB/PKCS5Padding")
val secretKey = SecretKeySpec(key.toByteArray(), "AES")
cipher.init(Cipher.ENCRYPT_MODE, secretKey)
val encryptedBytes = cipher.doFinal(data.toByteArray())
return Base64.getEncoder().encodeToString(encryptedBytes)
}
// RSA 公钥加密函数
fun encryptRSA(data: String, publicKey: PublicKey): String {
val cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding")
cipher.init(Cipher.ENCRYPT_MODE, publicKey)
val encryptedBytes = cipher.doFinal(data.toByteArray())
return Base64.getEncoder().encodeToString(encryptedBytes)
}
// RSA 私钥解密函数
fun decryptRSA(data: String, privateKey: PrivateKey): String {
val cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding")
cipher.init(Cipher.DECRYPT_MODE, privateKey)
val encryptedBytes = Base64.getDecoder().decode(data)
val decryptedBytes = cipher.doFinal(encryptedBytes)
return String(decryptedBytes)
}
// 使用示例
fun main() {
// AES 密钥和数据
val aesKey = "AES_KEY"
val data = "Hello, World!"
// RSA 公钥和私钥
val publicKeyString = "PUBLIC_KEY"
val privateKeyString = "PRIVATE_KEY"
// 将 RSA 公钥和私钥转换为 PublicKey 和 PrivateKey 对象
val publicKeyBytes = Base64.getDecoder().decode(publicKeyString)
val privateKeyBytes = Base64.getDecoder().decode(privateKeyString)
val keyFactory = KeyFactory.getInstance("RSA")
val publicKey = keyFactory.generatePublic(X509EncodedKeySpec(publicKeyBytes))
val privateKey = keyFactory.generatePrivate(PKCS8EncodedKeySpec(privateKeyBytes))
// 使用 AES 密钥加密数据
val encryptedData = encryptAES(data, aesKey)
// 使用 RSA 公钥加密 AES 密钥
val encryptedAESKey = encryptRSA(aesKey, publicKey)
// 发送 encryptedData 和 encryptedAESKey 到服务器...
}
```
Python 代码(Django 后端):
```python
from Crypto.Cipher import AES, PKCS1_OAEP
from Crypto.PublicKey import RSA
from base64 import b64encode, b64decode
# AES 解密函数
def decryptAES(data, key):
cipher = AES.new(key.encode(), AES.MODE_ECB)
decryptedBytes = cipher.decrypt(b64decode(data))
return decryptedBytes.decode().strip()
# RSA 私钥解密函数
def decryptRSA(data, privateKey):
cipher = PKCS1_OAEP.new(privateKey)
decryptedBytes = cipher.decrypt(b64decode(data))
return decryptedBytes.decode().strip()
# 加载 RSA 私钥
def loadPrivateKey(privateKeyString):
privateKeyBytes = b64decode(privateKeyString)
privateKey = RSA.import_key(privateKeyBytes)
return privateKey
# 使用示例
if __name__ == '__main__':
# AES 密钥和数据
aesKey = "AES_KEY"
data = "Hello, World!"
# RSA 私钥
privateKeyString = "PRIVATE_KEY"
# 加载 RSA 私钥
privateKey = loadPrivateKey(privateKeyString)
# 使用 RSA 私钥解密 AES 密钥
decryptedAESKey = decryptRSA(encryptedAESKey, privateKey)
# 使用 AES 密钥解密数据
decryptedData = decryptAES(encryptedData, decryptedAESKey)
print(decryptedData)
```
请注意,以上代码只是一个示例,并且没有包含完整的异常处理。在实际使用中,你可能需要添加适当的错误处理和安全性检查。此外,确保在实际应用中使用安全的密钥和算法,并根据需要进行适当的配置和调整。
阅读全文