Невозможно расшифровать строку, зашифрованную с помощью openssl -aes256 в swift - PullRequest
0 голосов
/ 16 мая 2019

Я хочу зашифровать ключи вне приложения и перейти к приложению.В приложении при использовании этих ключей снова приходится дешифровать строку с помощью ключа, который использовался при шифровании.

Какой ключ использовать при расшифровке в Swift?«FUUU» или ключ, сгенерированный командой openssl

В Mac я создаю зашифрованную строку, используя openssl -aes256, но при расшифровке в swift всегда возвращает nil.Если я устанавливаю ключ, сгенерированный openssl, то выдает ошибку «Ошибка: не удалось установить ключ».и «Ошибка: не удалось установить начальный вектор».

echo -n "TEST1" | openssl enc -aes256 -k FUUU -nosalt -a -p

Консольный вывод

key=59C12FFF74992ED40F4DF80A56AB55AE7C513B17CB4B8CF8342E9444C7F7AF3B
iv =0BEE68AD25123B7076B91A5AFB549E33
bYbkQJcDFZt3y3UQEMbEeg==

Расшифровка в Swift

let encryptedMessage = "bYbkQJcDFZt3y3UQEMbEeg==".data(using: .utf8)!
let key256 = "59C12FFF74992ED40F4DF80A56AB55AE7C513B17CB4B8CF8342E9444C7F7AF3B" // 32 bytes for AES256
let iv = "0BEE68AD25123B7076B91A5AFB549E33" // 16 bytes for AES128

let aes256 = AES(key: key256, iv: iv)

let decryptedMessage256 = aes256?.decrypt(data: encryptedMessage)
print("Decrypted: \(String(bytes: decryptedMessage256, encoding: .utf8))")

AES

import CommonCrypto

struct AES {

// MARK: - Value
// MARK: Private
private let key: Data
private let iv: Data

// MARK: - Initialzier
init?(key: String, iv: String) {
    guard key.count == kCCKeySizeAES128 || key.count == kCCKeySizeAES256, let keyData = key.data(using: .utf8) else {
        debugPrint("Error: Failed to set a key.")
        return nil
    }

    guard iv.count == kCCBlockSizeAES128, let ivData = iv.data(using: .utf8) else {
        debugPrint("Error: Failed to set an initial vector.")
        return nil
    }

    self.key = keyData
    self.iv  = ivData
}

// MARK: - Function
// MARK: Public
func encrypt(string: String) -> Data? {
    return crypt(data: string.data(using: .utf8), option: CCOperation(kCCEncrypt))
}

func decrypt(data: Data?) -> String? {
    guard let decryptedData = crypt(data: data, option: CCOperation(kCCDecrypt)) else { return nil }
    return String(bytes: decryptedData, encoding: .utf8)
}

func crypt(data: Data?, option: CCOperation) -> Data? {
    guard let data = data else { return nil }

    let cryptLength = [UInt8](repeating: 0, count: data.count + kCCBlockSizeAES128).count
    var cryptData   = Data(count: cryptLength)

    let keyLength = [UInt8](repeating: 0, count: kCCBlockSizeAES128).count
    let options   = CCOptions(kCCOptionPKCS7Padding)

    var bytesLength = Int(0)

    let status = cryptData.withUnsafeMutableBytes { cryptBytes in
        data.withUnsafeBytes { dataBytes in
            iv.withUnsafeBytes { ivBytes in
                key.withUnsafeBytes { keyBytes in
                    CCCrypt(option, CCAlgorithm(kCCAlgorithmAES), options, keyBytes, keyLength, ivBytes, dataBytes, data.count, cryptBytes, cryptLength, &bytesLength)
                }
            }
        }
    }

    guard UInt32(status) == UInt32(kCCSuccess) else {
        debugPrint("Error: Failed to crypt data. Status \(status)")
        return nil
    }

    cryptData.removeSubrange(bytesLength..<cryptData.count)
    return cryptData
}
}

1 Ответ

0 голосов
/ 17 мая 2019

Боюсь, что настольные cypher-фреймворки не совпадают с мобильными cypher-фреймворками, это распространенная проблема на iOS, вам нужно было бы создать свой собственный cypher, чтобы иметь возможность соответствовать ему.

Но с другой стороны вы можете использовать CryptoSwift , он очень надежный, лично я им пользуюсь, он соответствует серверным шифрам, поэтому я думаю, что он может решить вашу проблему.

...