在ECB模式下解密AES

时间:2019-12-03 11:07:48

标签: swift encryption aes cryptoswift

我正在尝试解密一个简单的帧:

uint8_t chipertext[] = {0x72, 0x82, 0xC9, 0xAA, 0x1F, 0xE1, 0x84, 0x97, 0x06, 0x65, 0x58, 0x5D, 0x06, 0x7B, 0xD4, 0xB4};

已通过以下密钥加密:

uint8_t aes_key[]    = {0x0A, 0x1A, 0x2A, 0x3A, 0x0B, 0x1B, 0x2B, 0x3B, 0x0C, 0x1C, 0x2C, 0x3C, 0x0D, 0x1D, 0x2D, 0x3D};

我知道结果将是(纯文本):

uint8_t plaintext[]  = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F};

在我的快速代码下面:

转换为字符串的加密密码:

let hexString = "0x72,0x82,0xC9,0xAA,0x1F,0xE1,0x84,0x97,0x06,0x65,0x58,0x5D,0x06,0x7B,0xD4,0xB4"
// Remove all of the "0x"
let cleanString = hexString.replacingOccurrences(of: "0x", with: "")
// Create an array of hex strings
let hexStrings = cleanString.components(separatedBy: ",")
// Convert the array of hex strings into bytes (UInt8)
let bytes = hexStrings.compactMap { UInt8($0, radix: 16) }

let datar = String(decoding: bytes, as: UTF8.self)
let datas = Data(datar.utf8)
let datarToString = String(data: datas, encoding: String.Encoding.utf8)!

转换为字符串的秘密密钥:

 let hexStringKey = "0x0A,0x1A,0x2A,0x3A,0x0B,0x1B,0x2B,0x3B,0x0C,0x1C,0x2C,0x3C,0x0D,0x1D,0x2D,0x3D"
 // Remove all of the "0x"
 let cleanStringKey = hexStringKey.replacingOccurrences(of: "0x", with: "")
 // Create an array of hex strings
 let hexStringsKey = cleanStringKey.components(separatedBy: ",")
 // Convert the array of hex strings into bytes (UInt8)
 let bytesKey = hexStringsKey.compactMap { UInt8($0, radix: 16) }

 let datarKey = String(decoding: bytesKey, as: UTF8.self)
 let datasKey = Data(datarKey.utf8)
 let datarToStringKey = String(data: datasKey, encoding: String.Encoding.utf8)!

然后我使用CryptoSwift执行AES解密功能:

func decrypt(cryptedMessage: String , key:String) -> String? {
        var clearMessage:String? = nil;

        let cryptedData = Data(cryptedMessage.data(using: .utf8)!)

        do {
            let aes = try AES(key: Array<UInt8>(key.utf8), blockMode: ECB(), padding: .noPadding) // aes128
            let cipher = try aes.decrypt(Array<UInt8>(cryptedData))
            clearMessage = String(bytes: cipher, encoding: .utf8)
        } catch {
            let error = error as NSError
            print(error)
        }

        return clearMessage
    }

我的问题是,当我尝试获取这样的解密消息时:

let cryptedMessage = datarToString.decryptAES(key: datarToStringKey)

我得到:Error: invalidData

如果有人有主意,我不知道我在哪里做错了。我确定有关ECB模式和noPadding选项。

谢谢!

1 个答案:

答案 0 :(得分:2)

您不能将任意数据转换为UTF-8字符串。这些行无效,并且您很幸运它们不会崩溃。

let datarToString = String(data: datas, encoding: String.Encoding.utf8)!
let datarToStringKey = String(data: datasKey, encoding: String.Encoding.utf8)!

类似地,您不应将字符串传递给decrypt。只需为密文和密钥传递数据。