Xor是uint16或uint32的字符串

时间:2017-06-22 11:34:13

标签: java ios arrays swift xor

我正在尝试将我在JAVA中创建的以下逻辑重新创建为swift:

public String xorMessage(String message, String key) {

    try {
        if (message == null || key == null) return null;

        char[] keys = key.toCharArray();
        char[] mesg = message.toCharArray();

        int ml = mesg.length;
        int kl = keys.length;
        char[] newmsg = new char[ml];

        for (int i = 0; i < ml; i++) {
            newmsg[i] = (char)(mesg[i] ^ keys[i % kl]);
        }//for i

        return new String(newmsg);
    } catch (Exception e) {
        return null;
    }

我在swift3编码时已到达此处:

import UIKit
import Foundation


let t = "22-Jun-2017 12:30 pm"
let m = "message"
print(UInt8(t))


let a :[UInt8] = Array(t.utf8)
let v  = m.characters.map{String ($0) }
print(v)
func encodeWithXorByte(key: UInt8 , Input : String) -> String {
    return String(bytes: Input.utf8.map{$0 ^ key}, encoding: String.Encoding.utf8) ?? ""

}

var ml :Int = Int( m.characters.count )


var kl :Int = Int (t.characters.count)



var f = [String]()
for i in 0..<ml{

    let key = a[i%kl]
    let input = v[i]


    f.append(String(bytes: input.utf8.map{$0 ^ key} , encoding : String.Encoding.utf8)!)


   // f.append(<#T##newElement: Character##Character#>)
    //m[i] = input.utf8.map{$0 ^ key}

}

我正在尝试获取一个字符串(消息),该字符串已被传递给上述函数的密钥进行了xor'ed。但是我在swift中的代码没有工作,因为它返回字符数组并且我想要一个字符串,如果我尝试将字符数组转换为字符串,它不会在字符串中显示unicode,如\ u {0001}等... < / p>

假设我得到以下输出:

["_", "W", "^", "9", "\u{14}", "\t", "H"]

然后我尝试转换为字符串,我明白了:

_W ^ 9 H

我想:

_W ^ 9 \∪{14} \ TH

请帮忙。

1 个答案:

答案 0 :(得分:1)

有不同的问题。首先,如果你打算打印 &#34;不可打印&#34;字符串\u{}中的字符转义然后您可以使用 .debugDescription方法。例如:

let s = "a\u{04}\u{08}b"
print(s) // ab
print(s.debugDescription) // "a\u{04}\u{08}b"

接下来,您的Swift代码将字符串转换为UTF-8,xor是字节 然后将结果转换回String。这很容易失败 如果xor的字节序列无效UTF-8。

Java代码在UTF-16代码单元上运行,因此等效的Swift 代码将是

func xorMessage(message: String, key: String) -> String {
    let keyChars = Array(key.utf16)
    let keyLen = keyChars.count

    let newMsg = message.utf16.enumerated().map { $1 ^ keyChars[$0 % keyLen] }
    return String(utf16CodeUnits: newMsg, count: newMsg.count)
}

示例:

let t = "22-Jun-2017 12:30 pm"
let m = "message"
let encrypted = xorMessage(message: m, key: t)
print(encrypted.debugDescription) // "_W^9\u{14}\tH"

最后,即使这样也会产生意想不到的结果,除非你限制 ASCII字符的输入(密钥和消息)。例如:

let m = "" 
print(Array(m.utf16).map { String($0, radix: 16)} ) // ["d83d", "de00"]

let t = "a€" 
print(Array(t.utf16).map { String($0, radix: 16)} ) // ["61", "20ac"]

let e = xorMessage(message: m, key: t)
print(Array(e.utf16).map { String($0, radix: 16)} ) // ["fffd", "feac"]

let d = xorMessage(message: e, key: t)
print(Array(d.utf16).map { String($0, radix: 16)} ) // ["ff9c", "fffd"]

print(d) // ワ�
print(d == m) // false

问题是xor&#39;产生无效的UTF-16序列 (一个不平衡的代理对),然后被替换 &#34;替换字符&#34; U + FFFD。

我不知道Java如何处理这个问题,但Swift字符串不能无效 Unicode标量值,因此唯一的解决方案是表示 结果为[UInt16]数组而不是String