Swift简单的异或加密

6
我正在尝试在Swift中编写一个简单的异或加密程序。我知道这不是特别安全或出色的方法,但我只需要它简单。我知道JavaScript中的代码实现方式,但我在将其翻译为Swift时遇到了麻烦。
Javascript:
function xor_str()
{
  var to_enc = "string to encrypt";

  var xor_key=28
  var the_res="";//the result will be here
  for(i=0;i<to_enc.length;++i)
  {
    the_res+=String.fromCharCode(xor_key^to_enc.charCodeAt(i));
  }
  document.forms['the_form'].elements.res.value=the_res;
}

任何您能提供的帮助都将是极好的,谢谢!
2个回答

15

我建议对String进行如下扩展。

extension String {
    func encodeWithXorByte(key: UInt8) -> String {
        return String(bytes: map(self.utf8){$0 ^ key}, encoding: NSUTF8StringEncoding)!
}

从内至外,

  1. 调用self.utf8创建一个从字符串生成的字节数组[UInt8]
  2. 对每个元素调用map()方法,并进行XOR运算与密钥值相结合
  3. 从XOR后的字节数组创建新的String对象

这是我的Playground截图。 enter image description here

更新:适用于Swift 2.0

extension String {
  func encodeWithXorByte(key: UInt8) -> String {
    return String(bytes: self.utf8.map{$0 ^ key}, encoding: NSUTF8StringEncoding) ?? ""
  }
}

请注意,对UTF-8字符串的所有字节进行异或操作通常不会产生有效的UTF-8字符串。例如,"Hello World".encodeWithXorByte(200)将导致崩溃。 - Martin R
你是正确的。然而,仅使用可打印键将始终生成可打印编码; UInt8(0x1C)...UInt8(0x7F)。另一个严重的问题是我使用了self.utf8。Javascript的charCodeAt()返回至少16位或可能21位的Unicode值。字符串迭代器和编码需要在上面的代码中适当更改。 - Price Ringo
谢谢@PriceRingo!这段代码对我来说完美无缺。我意识到这可能不是一个技术上正确的事情,但它在这里很好地完成了工作。 - Kevin Sullivan

4
我目前还不能通过评论回答,但是Price Ringo,我注意到你的沙盒有几个问题。

最后一行有两个错误,你实际上应该将其与原始加密的UInt8异或,而你并没有“解码”加密字符串。

你有...

println(str.encodeWithXorByte(0))

你应该拥有...

println(encrypted.encodeWithXorByte(28))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接