iOS使用CryptoSwift加密AES / CBC / PKCS5PADDING与Java的等效加密无法正常工作

问题描述

我正在构建一个快速的应用程序,其中我需要使用AES / CBC / PKCS5PADDING加密类型。加密API参数并解密API响应。

我已经成功添加了android java,并且工作正常。 现在,我试图快速实现相同的加密类型'AES / CBC / PKCS5PADDING'密码大小16。

问题:对于Android和iOS,我得到的加密结果不同

示例: 字符串:嗨,你好吗

适用于Android的加密字符串: + A3p093WWrXU3Ey9i / Lv1Q ==

用于swift(iOS)的加密字符串: Bp23PQX6yaCghvKFTieJDw ==

快速实施

import Foundation
import CommonCrypto

func aesEncrypt(key: String,iv: String,message: String) throws -> String{
    let data = message.data(using: .utf8)!
    // let enc = try AES(key: key,iv: iv,padding: .pkcs5).encrypt([UInt8](data))
    let enc = try AES(key: Array(key.utf8),blockMode: CBC(iv: Array(iv.utf8)),padding: .pkcs5).encrypt([UInt8](data))
    let encryptedData = Data(enc)
    return encryptedData.base64EncodedString()
}

func aesDecrypt(key: String,message: String) throws -> String {
    let data = NSData(base64Encoded: message,options: NSData.Base64DecodingOptions(rawValue: 0))!
    let dec = try AES(key: key,padding: .pkcs5).decrypt([UInt8](data))
    let decryptedData = Data(dec)
    return String(bytes: decryptedData.bytes,encoding: .utf8) ?? "Could not decrypt"
}

Android实现

package com.example.uribanew.utils;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

public class EncrytData {

private static String CIPHER_NAME = "AES/CBC/PKCS5PADDING";

private static int CIPHER_KEY_LEN = 16; //128 bits

private static String KEY   = ""; // key to use should be 16 bytes long (128 bits)
private static String IV    = ""; // initialization vector

/**
 * Encrypt data using AES Cipher (CBC) with 128 bit key
 *
 * @param data - data to encrypt
 * @return encryptedData data in base64 encoding with iv attached at end after a :
 */
public static String encrypt(String data) {

    try {
        IvParameterSpec ivSpec = new IvParameterSpec(IV.getBytes("UTF-8"));
        SecretKeySpec secretKey = new SecretKeySpec(fixKey(KEY).getBytes("UTF-8"),"AES");

        Cipher cipher = Cipher.getInstance(EncrytData.CIPHER_NAME);
        cipher.init(Cipher.ENCRYPT_MODE,secretKey,ivSpec);

        byte[] encryptedData = cipher.doFinal((data.getBytes()));

        String encryptedDataInBase64 = android.util.Base64.encodetoString(encryptedData,android.util.Base64.DEFAULT); //Base64.getEncoder().encodetoString(encryptedData);

        return encryptedDataInBase64;

    } catch (Exception ex) {
        throw new RuntimeException(ex);
    }
}

private static String fixKey(String key) {

    if (key.length() < EncrytData.CIPHER_KEY_LEN) {
        int numPad = EncrytData.CIPHER_KEY_LEN - key.length();

        for (int i = 0; i < numPad; i++) {
            key += "0"; //0 pad to len 16 bytes
        }

        return key;

    }

    if (key.length() > EncrytData.CIPHER_KEY_LEN) {
        return key.substring(0,CIPHER_KEY_LEN); //truncate to 16 bytes
    }

    return key;
}

/**
 * Decrypt data using AES Cipher (CBC) with 128 bit key
 *
 * @param data - encrypted data with iv at the end separate by :
 * @return decrypted data string
 */

public static String decrypt(String data) {

    try {
        IvParameterSpec ivSpec = new IvParameterSpec(IV.getBytes("UTF-8"));
        // SecretKeySpec secretKey = new SecretKeySpec(KEY.getBytes("UTF-8"),"AES");
        SecretKeySpec secretKey = new SecretKeySpec(fixKey(KEY).getBytes("UTF-8"),"AES");

        Cipher cipher = Cipher.getInstance(EncrytData.CIPHER_NAME);
        cipher.init(Cipher.DECRYPT_MODE,ivSpec);

        byte[] decodedEncryptedData = android.util.Base64.decode(data,android.util.Base64.DEFAULT); //Base64.getDecoder().decode(parts[0]);

        byte[] original = cipher.doFinal(decodedEncryptedData);

        return new String(original);
    } catch (Exception ex) {
        throw new RuntimeException(ex);
    }
}
}

请让我知道为什么使用相同的加密类型时,对于Android和iOS却获得不同的加密字符串。让我知道我在做什么错

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)