46 lines
1.2 KiB
Text
46 lines
1.2 KiB
Text
function encrypt(msg::AbstractString, key::AbstractString)
|
|
msg = uppercase(join(filter(isalpha, collect(msg))))
|
|
key = uppercase(join(filter(isalpha, collect(key))))
|
|
msglen = length(msg)
|
|
keylen = length(key)
|
|
|
|
if keylen < msglen
|
|
key = repeat(key, div(msglen - keylen, keylen) + 2)[1:msglen]
|
|
end
|
|
|
|
enc = Vector{Char}(msglen)
|
|
|
|
@inbounds for i in 1:length(msg)
|
|
enc[i] = Char((Int(msg[i]) + Int(key[i]) - 130) % 26 + 65)
|
|
end
|
|
|
|
return join(enc)
|
|
end
|
|
|
|
function decrypt(enc::AbstractString, key::AbstractString)
|
|
enc = uppercase(join(filter(isalpha, collect(enc))))
|
|
key = uppercase(join(filter(isalpha, collect(key))))
|
|
msglen = length(enc)
|
|
keylen = length(key)
|
|
|
|
if keylen < msglen
|
|
key = repeat(key, div(msglen - keylen, keylen) + 2)[1:msglen]
|
|
end
|
|
|
|
msg = Vector{Char}(msglen)
|
|
|
|
@inbounds for i in 1:length(enc)
|
|
msg[i] = Char((Int(enc[i]) - Int(key[i]) + 26) % 26 + 65)
|
|
end
|
|
|
|
return join(msg)
|
|
end
|
|
|
|
const messages = ("Attack at dawn.", "Don't attack.", "The war is over.")
|
|
const key = "LEMON"
|
|
|
|
for msg in messages
|
|
enc = encrypt(msg, key)
|
|
dec = decrypt(enc, key)
|
|
println("Original: $msg\n -> encrypted: $enc\n -> decrypted: $dec")
|
|
end
|