2015-09-02 3 views
0

Попытка конвертировать метод объектива COROR ниже Objective C XOR для Swift, но получение ошибки, например: «Не удалось найти перегрузку для« индекса », который принимает предоставленный аргумент». Любая помощь будет оценена по достоинству.XOR Шифрование в Swift IOS

Objective C

+(NSString *) encryptDecrypt:(NSString *)input staticKey:(NSString *) staticKey 
{ 
    const char *key = [staticKey UTF8String];; //Can be any chars, and any size array 
    NSMutableString *output = [[NSMutableString alloc] init]; 

    for(int i = 0; i < input.length; i++) { 
     char c = [input characterAtIndex:i]; 
     c ^= key[i % sizeof(key)/sizeof(char)]; 
     [output appendString:[NSString stringWithFormat:@"%c", c]]; 
    } 
    return output; 
} 

Swift

func encryptDecrypt(input: String, staticKey: String) -> String { 
    let cstr = staticKey.cStringUsingEncoding(NSUTF8StringEncoding) 
    var output: NSMutableString = NSMutableString() 
    for (index, element) in enumerate(input) { 
     // for var i = 0; i < input.length; i++ { 
     var c: Character = element 
     let char = c^cstr[index % sizeof(cstr)/sizeof(Character)] 
     output.appendString("\(c)") 
    } 
    return output as String 
} 
+1

Почему бы не использовать реальное шифрование, AES от общего Crypto? Вот одна ошибка с XOR: если есть часть данных, которые будут зашифрованы, которые имеют все одинаковое значение или известное значение, ключ будет отображаться только с помощью смещения. В случае, когда я увидел, была преамбула строки 0x00 байт, и она полностью раскрыла ключ. Вам все равно придется проверять «использование шифрования», но когда вы перейдете в BIS для авторизации экспорта, у вас появятся проблемы, потому что вы не используете известный метод шифрования. – zaph

+0

@zaph xor предназначен для шифрования на уровне ключа и передается другому приложению для шифрования данных с использованием AES – nik

+1

Создание собственного шифрования может быть забавным, но оно небезопасно. [Закон Шнайера] (https://www.schneier.com/blog/archives/2011/04/schneiers_law.html): «Любой, от самого невежественного любителя до лучшего криптографа, может создать алгоритм, который он сам может», т перерыв ". Для генерации ключ от пароля использует PBKDF2. Для шифрования ключей или паролей используется AES. Используйте наилучшие криптографические примитивы (например, стандарты NIST) и улучшенные протоколы безопасности. Если вы хотите играть нормально, но не используйте это для защиты других данных, выполнение этого будет бессовестным. – zaph

ответ

0

Отказ от ответственности:Как поясняется в комментариях, используя этот вид манипуляции с битами на UTF8 строки небезопасно и не будет работать, как и ожидалось для произвольного входы.

Я действительно не уверен, делает ли исходный код Objective-C то, что вы хотите. sizeof(key) - размер адреса памяти указателя char (8 на моей платформе), а не длина массива UTF8. Наверху sizeof(char) всегда должен быть 1. Возможно, вы захотите использовать вместо этого strlen.

В любом случае, эквивалент (скорректированного) кода Objective-C в Swift 2 может нравится

func encryptDecrypt(input: String, staticKey: String) -> String? { 
    let key = staticKey.utf8 
    let bytes = input.utf8.enumerate().map({ 
     $1^key[key.startIndex.advancedBy($0 % key.count)] 
    }) 
    return String(bytes: bytes, encoding: NSUTF8StringEncoding) 
} 

Тест фрагмент

let key = "12345" 
let string = "abcdefghijklmnopqrstuvwxyz" 

let encrypted = encryptDecrypt(string, staticKey: key)! 
let decrypted = encryptDecrypt(encrypted, staticKey: key)! 

print(string) 
print(encrypted) 
print(decrypted) 

напечатает

abcdefghijklmnopqrstuvwxyz 
PPPPPWU[]_Z^^ZZACAGADDDLLK 
abcdefghijklmnopqrstuvwxyz 

Для Swift 1.2 вам нужно будет сделать пару небольших адаптаций:

func encryptDecrypt(input: String, staticKey: String) -> String? { 
    let key = staticKey.utf8 
    let keyLength = distance(key.startIndex, key.endIndex) 
    let bytes = map(enumerate(input.utf8)) { 
     $1^key[advance(key.startIndex, $0 % keyLength)] 
    } 
    return String(bytes: bytes, encoding: NSUTF8StringEncoding) 
} 

Обновление: Следующий фрагмент кода ближе к исходному коду Objective-C и работает для произвольных строк:

func encryptDecrypt(input: NSString, staticKey: NSString) -> NSString? { 
    let chars = (0..<input.length).map({ 
     input.characterAtIndex($0)^staticKey.characterAtIndex($0 % staticKey.length) 
    }) 
    return NSString(characters: chars, length: chars.count) 
} 
+0

Существует большой птоблем с этим методом: если действительный символ UTF-8 имеет xor'ed с каким-либо произвольным значением, он уже не может быть действительным символом UTF-8. Попробуйте «àbcdefghijklmnopqrstuvwxyz» или «bcdefghijklmnopqrstuvwxy» в качестве входной строки. – zaph

+0

Иногда ваш вывод не должен быть допустимым символом UTF-8. Обычно вам не нужно читать зашифрованные данные.Просто напишите его в файл или отправьте через Интернет или что-то еще, и это будет хорошо, когда вы его расшифруете. – WolfLink

+0

@hennes Да выше Objective C работает как и ожидалось – nik

Смежные вопросы