Swift - AES 128/256 Шифрование другой результат - PullRequest
1 голос
/ 03 мая 2020

Я пытаюсь зашифровать с помощью AES на основе этого кода:

https://github.com/eclair4151/SmartCrypto/blob/master/PySmartCrypto/crypto.py

Python код:

cipher = AES.new(aes_key, AES.MODE_CBC, iv)
    encrypted = cipher.encrypt(bytes.fromhex(keys.publicKey))
    print("AES encrypted: "+ encrypted.hex())

Я также использую этот вопрос, чтобы попытаться решить мою проблему: Шифрование AES в быстром

Это мой код, который я взял из вопроса выше:

import Foundation
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 = data.count + kCCBlockSizeAES128
        var cryptData   = Data(count: cryptLength)

        let keyLength = key.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.baseAddress, keyLength, ivBytes.baseAddress, dataBytes.baseAddress, data.count, cryptBytes.baseAddress, 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
    }
}

let password = "2cb12bb2cbf7cec713c0fff7b59ae68a96784ae517f41d259a45d20556177c0ffe951ca60ec03a990c9412619d1bee30adc7773088c5721664cffcedacf6d251cb4b76e2fd7aef09b3ae9f9496ac8d94ed2b262eee37291c8b237e880cc7c021fb1be0881f3d0bffa4234d3b8e6a61530c00473ce169c025f47fcc001d9b8051"
let key128   = "1234567890123456"                   // 16 bytes for AES128
let key256   = "7110eda4d09e062aa5e4a390b0a572ac"   // 32 bytes for AES256
let iv       = "0000000000000000"                   // 16 bytes for AES128

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

print(password.count)
let encryptedPassword128 = aes128?.encrypt(string: password)
aes128?.decrypt(data: encryptedPassword128)

let encryptedPassword256 = aes256?.encrypt(string: password)
aes256?.decrypt(data: encryptedPassword256)

Это Код GitHub предназначен для генерации кода и подключения к телевизору Samsung. Я запускаю код в python, и мой результат:

AES key: 7110eda4d09e062aa5e4a390b0a572ac
AES encrypted: ee866a1427e32c057ec3d5cbb0b227f61c9958f0b85685bfec8654ea964db04baea6af4e95b00b6cd22d0f15175ac48203ba4b1181a6b84204a44e4b81b57f4be024372402e59bbadedbdfed38d2e2231abc6a360d327e21d4dd0f6fa55c8a6004a30f0f44ca101966fc7d70585ff5bb77a34d3dc0528a5c476a916696183b80

Длина этого зашифрованного AES равна 256, а мой результат - 544.

a1d745160fa1742c05e3798d55499bbaf2d249c0c367688d37a479d6e7d903e90e45a9d495804cdccb1f69c2b97430484a023124659dc37cde6fb21caccae20d65f4f6412f3ee2b4ec487aa0ed5fa546c6a848fefc405f419188f8f332da437e06fd1a356d8b4586d9ba68dad2fede9912b89df4363158bdb0c0e32a19fb383df521949624b0c5512da2debbd81febb7b30f8a0e678c7a0f5a03cf2ef6c647cc485e31b36163ee5f6c9fa16ba54b19c6ebd2c24cbe260acf847d5285d145521ba5028a9437ea95c2b21e3cf25d474b36851ca9657425ec3e875459b0652d507d786cd66760265e9a66f57769db72022c988cf8aa4c0891361d9f32d6b487df7725c05c7966c68be4a4582da1d4e0b047

Я использую правильный ключ: 7110eda4d09e062aa5e4a390b0a572ac IV: 0000000000000000, и ключ publi c такой же, как и GitHub publicKey.

Почему мой результат отличается? как я могу получить строку длиной 256?

Спасибо!

...