RosettaCodeData/Task/Vigen-re-cipher/Julia/vigen-re-cipher.julia

47 lines
1.2 KiB
Text
Raw Permalink Normal View History

2018-06-22 20:57:24 +00:00
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]
2015-11-18 06:14:39 +00:00
end
2018-06-22 20:57:24 +00:00
enc = Vector{Char}(msglen)
2015-11-18 06:14:39 +00:00
2018-06-22 20:57:24 +00:00
@inbounds for i in 1:length(msg)
2015-11-18 06:14:39 +00:00
enc[i] = Char((Int(msg[i]) + Int(key[i]) - 130) % 26 + 65)
end
2018-06-22 20:57:24 +00:00
return join(enc)
2015-11-18 06:14:39 +00:00
end
2018-06-22 20:57:24 +00:00
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)
2015-11-18 06:14:39 +00:00
2018-06-22 20:57:24 +00:00
if keylen < msglen
key = repeat(key, div(msglen - keylen, keylen) + 2)[1:msglen]
2015-11-18 06:14:39 +00:00
end
2018-06-22 20:57:24 +00:00
msg = Vector{Char}(msglen)
2015-11-18 06:14:39 +00:00
2018-06-22 20:57:24 +00:00
@inbounds for i in 1:length(enc)
2015-11-18 06:14:39 +00:00
msg[i] = Char((Int(enc[i]) - Int(key[i]) + 26) % 26 + 65)
end
2018-06-22 20:57:24 +00:00
return join(msg)
2015-11-18 06:14:39 +00:00
end
2018-06-22 20:57:24 +00:00
const messages = ("Attack at dawn.", "Don't attack.", "The war is over.")
2015-11-18 06:14:39 +00:00
const key = "LEMON"
2018-06-22 20:57:24 +00:00
for msg in messages
enc = encrypt(msg, key)
dec = decrypt(enc, key)
println("Original: $msg\n -> encrypted: $enc\n -> decrypted: $dec")
end