尝试将 Objective C XOR 加密方法转换为 Swift,但出现错误,例如“无法找到接受提供参数的‘下标’的重载”。任何帮助将不胜感激。
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
}
最佳答案
免责声明: 正如评论中所解释的,在 UTF8 字符串上使用这种位操作是不安全的,并且对于任意输入不会按预期工作。
我实际上不确定原始的 Objective-C 代码是否符合您的要求。 sizeof(key)
是 char
指针的内存地址的大小(在我的平台上为 8),而不是 UTF8 数组的长度。最重要的是,sizeof(char)
应始终为 1。您可能想使用 strlen
来代替。
无论如何,Swift 2 中(更正后的)Objective-C 代码的等价物可能是这样的
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)
}
关于objective-c - Swift IOS 中的异或加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32358325/