AES加密与解密
AES(Advanced Encryption Standard)是一种对称加密算法,广泛应用于数据加密和保护领域。本文将介绍如何在iOS中使用AES进行加密,并在Java中进行解密。
AES概述
AES是一种对称加密算法,使用相同的密钥进行加密和解密。它采用固定的块大小(128位)和密钥大小(128位、192位或256位),并使用一系列的轮函数来进行加密。
AES的加密过程如下:
- 将明文按照块大小分割成多个块。
- 对每个块应用一系列的轮函数。
- 轮函数包括字节替换、行移位、列混淆和密钥加法。
- 重复上述过程多次,直到得到密文。
解密过程与加密过程相反,需要对密文应用逆向的轮函数。
iOS中的AES加密
在iOS中,可以使用CommonCrypto
库来实现AES加密。下面是一个示例代码:
import CommonCrypto
func aesEncrypt(data: Data, key: Data, iv: Data) throws -> Data {
let cryptLength = size_t(data.count + kCCBlockSizeAES128)
var cryptData = Data(count: cryptLength)
let keyLength = size_t(kCCKeySizeAES128)
let options = CCOptions(kCCOptionPKCS7Padding)
var numBytesEncrypted: size_t = 0
let cryptStatus = cryptData.withUnsafeMutableBytes { cryptBytes in
data.withUnsafeBytes { dataBytes in
iv.withUnsafeBytes { ivBytes in
key.withUnsafeBytes { keyBytes in
CCCrypt(CCOperation(kCCEncrypt),
CCAlgorithm(kCCAlgorithmAES),
options,
keyBytes, keyLength,
ivBytes,
dataBytes, data.count,
cryptBytes, cryptLength,
&numBytesEncrypted)
}
}
}
}
if cryptStatus == kCCSuccess {
cryptData.removeSubrange(numBytesEncrypted..<cryptData.count)
return cryptData
} else {
throw CryptoError.encryptError
}
}
上述代码定义了一个名为aesEncrypt
的函数,用于对数据进行AES加密。函数使用给定的密钥和初始向量(IV)进行加密,并返回加密后的数据。
调用示例:
let dataToEncrypt = "Hello, World!".data(using: .utf8)!
let key = "0123456789abcdef".data(using: .utf8)!
let iv = "abcdef0123456789".data(using: .utf8)!
do {
let encryptedData = try aesEncrypt(data: dataToEncrypt, key: key, iv: iv)
print("Encrypted data: \(encryptedData.base64EncodedString())")
} catch {
print("Encryption failed: \(error)")
}
Java中的AES解密
在Java中,可以使用javax.crypto
包来实现AES解密。下面是一个示例代码:
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
public class AESDecryptor {
public static String aesDecrypt(String data, String key, String iv) throws Exception {
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
IvParameterSpec ivParameterSpec = new IvParameterSpec(iv.getBytes("UTF-8"));
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);
byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(data));
return new String(decryptedBytes);
}
public static void main(String[] args) {
String encryptedData = "gRiZa5D4HoF4ztxdyxBL8A==";
String key = "0123456789abcdef";
String iv = "abcdef0123456789";
try {
String decryptedData = aesDecrypt(encryptedData, key, iv);
System.out.println("Decrypted data: " + decryptedData);
} catch (Exception e) {
System.out.println("Decryption failed: " + e.getMessage());
}
}
}
上述代码定义了一个名为aesDecrypt
的函数,用于对数据进行AES解密。函数使用给定的密钥和初始向量(IV)进行解密,并返回解密后的数据。
调用示例:
String encryptedData = "gRiZa5D4HoF4ztxdyxBL8A