CommonCrypto в iOS, выдающий разные результаты в командной строке openssl - PullRequest
1 голос
/ 27 июня 2019

Я использую CommonCrypto в своем приложении для расшифровки некоторых данных, зашифрованных с помощью openssl.Чтобы проверить шифрование, я попытался зашифровать некоторые примеры данных, и довольно удивительно, что выходные данные моего шифрования (то есть aes ecb) отличаются от того, что генерируется с помощью команды openssl.

IЯ также провел несколько попыток с другими фреймворками, такими как CryptoSwift, но результаты те же.

Вот код, который я использую для шифрования:

class AESEncryptor {

    static func encrypt(text: String, key: String) -> String? {

        guard let encryptingData = text.data(using: .utf8), let keyData = key.data(using: .utf8) else {
            return nil
        }

        var outLength = Int(0)
        var outBytes = [UInt8](repeating: 0, count: encryptingData.count + kCCBlockSizeAES128)
        var status: CCCryptorStatus = CCCryptorStatus(kCCSuccess)
        encryptingData.withUnsafeBytes { (encryptingBytes: UnsafePointer<UInt8>!) -> () in
            keyData.withUnsafeBytes { (keyBytes: UnsafePointer<UInt8>!) -> () in
                status = CCCrypt(CCOperation(kCCEncrypt),
                                 CCAlgorithm(kCCAlgorithmAES),            // algorithm
                    CCOptions(kCCOptionECBMode | kCCOptionPKCS7Padding),           // options
                    keyBytes,                                   // key
                    keyData.count,                                  // keylength
                    nil, //ivBytes,                                    // iv
                    encryptingBytes,                             // dataIn
                    encryptingData.count,                                // dataInLength
                    &outBytes,                                  // dataOut
                    outBytes.count,                             // dataOutAvailable
                    &outLength)                                 // dataOutMoved
            }
        }
        guard status == kCCSuccess else {
            return nil
        }

        let encryptedData =  Data(bytes: UnsafePointer<UInt8>(outBytes), count: outLength)
        return encryptedData.base64EncodedString()

    }
}

Вызов вышеуказанной функции:

let key = "4f0fbad47141ef9616ce4d71b459eea9"
let plain = "ThisIsASuperSecurePassword"
let digest = AESEncryptor.encrypt(text: plain, key: key)

дайджеста является "4ebhUO + Rma34MR4iBTT04AS6rXX + Jy2U97rwC2HGmz0 ="

Между тем, в командной строке OpenSSL, с таким же ввода:

echo -n "ThisIsASuperSecurePassword" | openssl enc -e -aes-128-ecb -K "3466306662616434373134316566393631366365346437316234353965656139" -a

( "3466306662616434373134316566393631366365346437316234353965656139" является шестнадцатеричная строкаиз "4f0fbad47141ef9616ce4d71b459eea9")

дает мне "zPO4jNrMbbZp4WXNPgkX1RuBIpNXZqe0XNqNMFPTt / Q ="

Итак, это не один и тот же вопрос: почему?Как я могу получить те же выходы?

AD

1 Ответ

2 голосов
/ 29 июня 2019

Первая проблема заключается в том, что вы кодировали не AES-128-EBC, а фактически кодировали AES-256-EBC. Это потому, что длина ключа равна 256 битам, а не 128 битам.

Итак, если мы закодируем с использованием openssl с правильной длиной ключа, я получу:

(Обратите внимание, что я использую PowerShell, и по какой-то причине передача текста в команду добавит CRLF, поэтому я к нему через файл)

"ThisIsASuperSecurePassword" | Set-Content -NoNewLine plaintext.txt
openssl enc -e -aes-256-ecb -K 3466306662616434373134316566393631366365346437316234353965656139 -a -in plaintext.txt

Я получаю:

4ebhUO + Rma34MR4iBTT04AS6rXX + Jy2U97rwC2HGmz0 =

Что совпадает с тем, что вы получаете.

И дешифрование вывода снова приводит к открытому тексту:

"4ebhUO+Rma34MR4iBTT04AS6rXX+Jy2U97rwC2HGmz0=" | openssl enc -d -aes-256-ecb -K 3466306662616434373134316566393631366365346437316234353965656139 -a -p

производит вывод:

ThisIsASuperSecurePassword

Если вы действительно хотели AES-128, вам нужно уменьшить размер ключа до 128 битов.

...