Swift中的Atbash密码

Atbash密码是许多经典密码之一,并且可能是最简单的密码之一。 它是一个单字母替代密码,最初用于加密希伯来字母,但可以与任何已知的书写系统一起使用(维基百科)

Atbash密码的工作原理是采用字母(或代表书写系统的任何字母)并将其映射为相反的字母。 以拉丁字母为例:

 字母:ABCDEFGHIJKLMNOPQRSTU VWXYZ 
反向:ZYXWVUTSRQPONMLKJIHGF EDCBA

使用此密码,纯文本“ Hello World”将被加密为“ Svool Dliow”。 如您所见,这不是一种非常安全的加密,因为它缺少密钥。

在Xcode Playgrounds上使用此密码,我设法为其提供了两种不同的实现。 为了简单起见,我将纯文本转换为所有小写字母,并删除了空白。

第一种实现利用字典将每个字母映射到其反向值。 当遍历纯文本的字符以获取相反的值时,它用作查找表。

  func atbashCipher(_ plainText:String)->字符串{ 
让字母= Array(“ abcdefghijklmnopqrstuvwxyz”)
let cipher = zip(alphabet,alphabet.reversed())。reduce([String:String]()){(dict,arg1)-> [String:String]在
let(键,值)= arg1
var dict = dict
dict [String(key)] =字符串(值)
返回字典
}
 让formattedPlainText = plainText.lowercased() 
.replacingOccurrences(of:“”,with:“”)
让cipherText = Array(formattedPlainText).compactMap {String($ 0)}
.map {(str)->字符串输入
返回密码[str] ”
}
返回cipherText.joined()
}

第二种实现更简单,并且不使用其他反向数组。 而是使用索引算法来确定单个字母的映射值

  func atbashCipher(_ plainText:String)->字符串{ 
让字母=数组(“ abcdefghijklmnopqrstuvwxyz”)
让formattedPlainText = plainText.lowercased()
.replacingOccurrences(of:“”,with:“”)
让cipherText = Array(formattedPlainText).compactMap {(char)->字符串吗? 在
如果让index = Alphabet.index(of:char){
返回字符串(alphabet [alphabet.count-1-索引])
}
返回零
}
返回cipherText.joined()
}