Swift AES Encryption выдает ошибку, в то время как в Android нет - PullRequest
0 голосов
/ 29 октября 2018

Я пытался сделать шифрование AES в Swift, которое я делаю в Android, как это:

public static String Encrypt(String text, String key) {
    try {
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        byte[] keyBytes = new byte[16];
        byte[] b = key.getBytes("UTF-8");
        int len = b.length;
        if (len > keyBytes.length)
            len = keyBytes.length;
        System.arraycopy(b, 0, keyBytes, 0, len);
        SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");
        IvParameterSpec ivSpec = new IvParameterSpec(keyBytes);
        cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);

        byte[] results = cipher.doFinal(text.getBytes("UTF-8"));

        return Base64.encodeToString(results, Base64.DEFAULT);

    }
    catch (Exception ex){return  "error"+ex.getMessage();}
}

ниже соответствует коду в swift 3.2:

 func aesEncrypt(key: String, iv: String) throws -> String{                                   
        let data = self.data(using: String.Encoding.utf8)
        let enc = try AES(key: key.bytes, blockMode: BlockMode.CBC(iv: iv.bytes, padding: Padding.pkcs5).encrypt(data!.bytes)
        let encData = NSData(bytes: enc, length: Int(enc.count))
        let base64String: String = encData.base64EncodedString(options: NSData.Base64EncodingOptions(rawValue: 0));
        let result = String(base64String)
        return result!}

в Android это не имеет значения для ключа: я могу заполнить любой строкой (без ограничений по длине) но при использовании в Swift я должен использовать 32-символьную строку для ключа и 16-символьную строку для IV, в противном случае будет выдано сообщение об ошибке.

Вот использование Swift:

let data = "this is string which I want to be encrypted"
let key = "bbbb98232-a343-4343f-2111"
let iv = "0000000000000000" // lenght = 16 like android code
let encryptedString = data.aesEncrypt(key: key, iv: iv);

Может быть, какая-то ошибка в моем коде Swift !!

Спасибо заранее!

1 Ответ

0 голосов
/ 29 октября 2018

Вы можете попробовать приведенный ниже код Swift для шифрования AES. Его строковое расширение.

import Foundation
import CommonCrypto
extension String {

    func aesEncrypt(key: String, initializationVector: String, options: Int = kCCOptionPKCS7Padding) -> String? {
        if let keyData = key.data(using: String.Encoding.utf8),
            let data = self.data(using: String.Encoding.utf8),
            let cryptData    = NSMutableData(length: Int((data.count)) + kCCBlockSizeAES128) {

            let keyLength              = size_t(kCCKeySizeAES128)
            let operation: CCOperation = UInt32(kCCEncrypt)
            let algoritm: CCAlgorithm = UInt32(kCCAlgorithmAES128)
            let options: CCOptions   = UInt32(options)

            var numBytesEncrypted: size_t = 0

            let cryptStatus = CCCrypt(operation,
                                      algoritm,
                                      options,
                                      (keyData as NSData).bytes, keyLength,
                                      initializationVector,
                                      (data as NSData).bytes, data.count,
                                      cryptData.mutableBytes, cryptData.length,
                                      &numBytesEncrypted)

            if UInt32(cryptStatus) == UInt32(kCCSuccess) {
                cryptData.length = Int(numBytesEncrypted)
                let base64cryptString = cryptData.base64EncodedString(options: .lineLength64Characters)
                return base64cryptString
            } else {
                return nil
            }
        }
        return nil
    }
}
...