AES加密与解密

AES(Advanced Encryption Standard)是一种对称加密算法,广泛应用于数据加密和保护领域。本文将介绍如何在iOS中使用AES进行加密,并在Java中进行解密。

AES概述

AES是一种对称加密算法,使用相同的密钥进行加密和解密。它采用固定的块大小(128位)和密钥大小(128位、192位或256位),并使用一系列的轮函数来进行加密。

AES的加密过程如下:

  1. 将明文按照块大小分割成多个块。
  2. 对每个块应用一系列的轮函数。
  3. 轮函数包括字节替换、行移位、列混淆和密钥加法。
  4. 重复上述过程多次,直到得到密文。

解密过程与加密过程相反,需要对密文应用逆向的轮函数。

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