From 9b040323b96b4b635682fc6b105c6724bbc464ba Mon Sep 17 00:00:00 2001 From: Chen Tom Date: Tue, 17 Oct 2017 15:08:35 +0800 Subject: [PATCH] AES decrypt error because the data from Hex had problem. --- SecrecySwift/SecrecyExtension.swift | 30 +++++++---------------------- 1 file changed, 7 insertions(+), 23 deletions(-) diff --git a/SecrecySwift/SecrecyExtension.swift b/SecrecySwift/SecrecyExtension.swift index 9429ac7..4f7392b 100755 --- a/SecrecySwift/SecrecyExtension.swift +++ b/SecrecySwift/SecrecyExtension.swift @@ -76,33 +76,17 @@ extension String { } /// Get data from hexadecimal string func dataFromHexadecimalString() -> Data? { - let trimmedString = self.trimmingCharacters(in: CharacterSet(charactersIn: "<> ")).replacingOccurrences(of: " ", with: "") + var data = Data(capacity: characters.count / 2) - // make sure the cleaned up string consists solely of hex digits, and that we have even number of them - guard let regex = try? NSRegularExpression(pattern: "^[0-9a-f]*$", options: NSRegularExpression.Options.caseInsensitive) else{ - return nil + let regex = try! NSRegularExpression(pattern: "[0-9a-f]{1,2}", options: .caseInsensitive) + regex.enumerateMatches(in: self, range: NSMakeRange(0, utf16.count)) { match, flags, stop in + let byteString = (self as NSString).substring(with: match!.range) + var num = UInt8(byteString, radix: 16)! + data.append(&num, count: 1) } - let trimmedStringLength = trimmedString.lengthOfBytes(using: String.Encoding.utf8) - let found = regex.firstMatch(in: trimmedString, options: NSRegularExpression.MatchingOptions.reportProgress, range: NSMakeRange(0, trimmedStringLength)) - if found == nil || found?.range.location == NSNotFound || trimmedStringLength % 2 != 0 { - return nil - } - - // everything ok, so now let's build NSData - -// let data = NSMutableData(capacity: trimmedStringLength / 2) - var data = Data(capacity: trimmedStringLength / 2) - - for index in trimmedString.characters.indices { - let next_index = trimmedString.index(after: index) - let byteString = trimmedString.substring(with: index ..< next_index) - let num = UInt8(byteString.withCString { strtoul($0, nil, 16) }) -// data.append([num] as [UInt8], length: 1) - data.append(num) - } + guard data.count > 0 else { return nil } -// return data as Data? return data } }