みそしりんぐ

現在進行形みそしる

ヴィジュネル暗号

ヴィジュネル暗号の暗号化,復号化のプログラムつくりました.

ヴィジュネル暗号

ヴィジュネル暗号とは、フランスの外交官ブレーズ・ド・ヴィジュネルによる多表式の換字式暗号のことである。多表式の暗号は、単一換字式暗号が安全でなくなってきた15世紀後半から16世紀後半にかけて考え出された暗号で、ヴィジュネル暗号はその中で恐らく最も有名なものである。
wikipedia:ヴィジュネル暗号

いしたーくんのコードを参考に,関数化してまとめたのが以下です.
関数化をすると,なんだかプログラミングしてるって気になります.

# -*- coding: utf-8 -*- #

def mkkey(string, key):
	keya = ""
	l1 = len(string)
	l2 = len(key)
	for i in range(0,int(l1 / l2)):
		keya += key
	keya += key[:l1%l2]
	return keya
 
def encrypt(string, key):
	result = ""
	for s, k in zip(string, mkkey(string, key)):
		n = (ord(k) - 65) + (ord(s) - 65)
		if n > 25:
			b = 65 + n - 26
		else:
			b = 65 + n
		result += chr(b)
	return result
 
def decrypt(string, key):
	result = ""
	for s, k in zip(string, mkkey(string, key)):
		n = ord(k) - ord(s)
		if n > 0:
			b = 91 - n
		else:
			b = 65 - n
		result += chr(b)
	return result
 
i = 0
string = "JLAPIIJGLAAMTPGLAUMNKRVKJCMGVGOUMLCOIDCPDKUMOWIAI"
key  = "NEWYEAR"
result = decrypt(string, key)
print result
result = encrypt(result, key)
print result

# 実行結果
# WHEREISTHECITYTHEWINTEROLYMPICSWILLBEHELDTHISYEAR
# JLAPIIJGLAAMTPGLAUMNKRVKJCMGVGOUMLCOIDCPDKUMOWIAI

そして,三項演算子を使って,短く,よみにくくしてみたのが以下!
(参考:Pythonの三項演算子 | 山本隆の開発日誌

def decrypt(string, key):
	result = ""
	for s, k in zip(string, mkkey(string, key)):
		n = ord(k) - ord(s)
		result += chr(91 - n if n > 0 else 65 - n)
	return result

このくらいの式なら三項演算子のほうが読みやすいかなぁと思ったのですが,Javascriptなんかと記述が若干違うので,違和感ありあり.
まともに書いたほうが読みやすそうですね.