objective-c - Swift IOS 中的异或加密

标签 objective-c swift encryption xor

尝试将 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/

相关文章:

objective-c - 表格重新加载后设置 UITableView FooterView

iphone - 在不丢失索引的情况下对数组进行升序排序 Objective-C

iphone - MPMoviePlayerController "Loading Movie..."

ios - Swift - 交付应用程序上的本地通知图标角标(Badge)编号更新在后台

java - 基于共享 key 使用 JavaScript 加密并使用 Java 解密

c# - 使用命令 aspnet_regiis.exe 加密 web.config

objective-c - UITableView 委托(delegate)方法被调用了两次

ios - 如何从浮点值 Swift 3 中删除前导零

ios - 如何在几天前在 UNNotificationCenter 中设置警报?

ios - iOS 中的客户端证书和身份