Skip to content

Instantly share code, notes, and snippets.

@darhonbek
Last active October 5, 2018 15:38
Show Gist options
  • Save darhonbek/577e53e235cdd05287c23aaed2ad2d1a to your computer and use it in GitHub Desktop.
Save darhonbek/577e53e235cdd05287c23aaed2ad2d1a to your computer and use it in GitHub Desktop.
Vigenere's Decipher Tool
import Foundation
// MARK: - Main
var cipherText = "vyc iafgrr xl o ozpghf qw qtvitzrn zorj. rwx qascg mvtvyi bg orgcem vyc gxtnvaibcp fd dnf yvyzgsujch. mvgicuhfg, jcrnfkkw xl bqk yqhiv dyzbbi kcrabqcmvr dgidtvh, dlr btykee rngvfktk inkgbthgcw hthkjdxxr ceb rhbhzbtgh. vyc bxhjfbh mvck uxez ofqi xthvaibjgcw bbbkdgox hjv yqbzkkw dy wpkpjwstj rd vcogpdfwuv gcyctdyibcp jcrnfkkw pks efkeksjvlhbjg lqtk htrgcbbi rls xrwtyibcp. rlnpoa, tmczfcksathkfl, nhi ularxsf km sxqkgftk mqlp ubfuk ktlgcxc xg hjzq rhitjc. xy mql udky jrpsxf vycc rcw ngae pg r edhr eiwemoprjnlh. ccqd, rcw ngae pg r edhr uvajkwvp qexqkrjxlh.".lowercased()
var key = "crypto"
let decipheredText = vigenereDecipher(cipher: cipherText, using: key)
print(decipheredText)
// MARK: - Actions
func vigenereDecipher(cipher: String, using key: String) -> String {
var alphabet = getEnglishAlphabet()
var plainText = ""
let cipherText = removePunctuationSymbols(from: (cipher as NSString)) as String
var shifts = getLetterShiftsArray(from: key)
var asciiCode: Int = 0
var j: Int = 0
for (_, c) in cipherText.enumerated() {
asciiCode = (Int(c.ascii!) - 97) - shifts[j]
if asciiCode < 0 {
asciiCode = asciiCode + 26
}
asciiCode = asciiCode % 26
j = j + 1
if j >= shifts.count {
j = 0
}
plainText.append(alphabet[asciiCode])
}
return plainText
}
func removePunctuationSymbols(from text: NSString) -> NSString {
var resultText = text
let punctuationSymbols = [" ", ".", ",", "!", "?", "-", "\n"]
for s in punctuationSymbols {
resultText = resultText.replacingOccurrences(of: s, with: "") as NSString
}
return resultText
}
func getLetterShiftsArray(from key: String) -> [Int] {
var shifts = [Int]()
for c in key {
if let n = c.ascii {
shifts.append(Int(n) - 97)
}
}
return shifts
}
func getEnglishAlphabet() -> [String] {
var alphabet: [String] = []
for i in 97 ... (97+25) {
alphabet.append(i.asciiCharacter!)
}
return alphabet
}
// MARK: - Extensions
extension String {
var ascii: [UInt32] {
return unicodeScalars.compactMap{
$0.isASCII ? $0.value : nil
}
}
}
extension Character {
var ascii: UInt32? {
return String(self).ascii.first
}
}
extension Int {
var asciiCharacter: String? {
guard let asciiCode = UnicodeScalar(self) else {
return nil
}
return String(asciiCode)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment