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() }