파이썬에서 비쥬넬 암호화

10163 단어 파이썬암호

소개



비쥬넬 암호에 대한 Python 스크립트를 찾았지만 비효율적 인 것만 찾을 수 있었기 때문에 자신이 효율적이라고 생각하는 코드를 작성했습니다.

기본 방침



비쥬넬 암호는 비쥬넬 방진을 참조하여 암호화 및 복호를 수행한다.
다만, 비쥬넬 방진은 key마다 참조처를 어긋나고 있을 뿐이므로, 방진을 작성할 필요는 없다. 이 방진을 작성하고 있는 것 밖에 발견되지 않았기 때문에, 이번 투고에 이른다.

코드 발췌


def vigenere_encrypt(plaintext, key):
    """Vigenere Cipher Encrypt
    key are only UPPERCASE ALPHABET[A-Z]."""
    count = 0
    ciphertext = ''
    key = key.upper()
    for s in plaintext:
        if s.isupper():
            ciphertext += chr(((ord(s) + ord(key[count % len(key)])) % 26) + ord('A'))
        elif s.islower():
            ciphertext += chr(((ord(s) + ord(key[count % len(key)]) - (ord('a') - ord('A'))) % 26) + ord('a'))
        else:
            ciphertext += s
        count += 1
    return ciphertext

def vigenere_decrypt(ciphertext, key):
    """Vigenere Cipher Decrypt
    key are only UPPERCASE ALPHABET[A-Z]."""
    count = 0
    plaintext = ''
    key = key.upper()
    for s in ciphertext:
        if s.isupper():
            plaintext += chr(((ord(s) - ord(key[count % len(key)])) % 26) + ord('A'))
        elif s.islower():
            plaintext += chr(((ord(s) - ord(key[count % len(key)]) - (ord('a') - ord('A'))) % 26) + ord('a'))
        else:
            plaintext += s
        count += 1
    return plaintext

코드 해설



비쥬넬 방진에 대해서



이하에 비쥬넬 방진을 나타낸다.
출처: Vigenère cipher - Wikipedia

비쥬넬 방진은 세로축을 Key, A를 0, Z를 25로 하면,
Key의 값을 평문자(가로축)에 자신을 더해, 26의 법을 취한 것이 암호화 후의 문자가 되도록 되어 있다.
A...ZA...ZA...Z와 이어지는 문자열 중에서 Key의 값을 더한 것이라고 생각하는 편이 알기 쉬운 분도 있을지도 모른다.

수동으로 비주얼 암호화를 암호화하는 방법



예를 들면, 암호키를 「QIITA」, 평문을 「VIGENERE」로 했을 경우,
비쥬넬 방진의 세로축 Q, 가로축 V의 교차점을 확인하여 L을 얻는다.
다음으로, 종축의 I, 가로축의 I의 교차점을 확인하고, Q
마찬가지로 반복해 간다. (암호화 키의 마지막 문자에 도달하면 암호화 키의 첫 번째 문자로 돌아갑니다.)
그 결과, 암호문 LQOXNUZM이 얻어진다.

코드에서 암호화하는 방법



예로서, 이하의 1행의 코드를 해설해 간다.
ord() 문자를 유니코드 값으로 변환합니다. chr()은 그 반대.
암호 키의 끝까지 도달하면 암호 키의 첫 번째 문자로 돌아가는 부분은 key [count % len (key)]입니다.
ord('A') 는 26 법의 수치를 유니코드 값으로 변환하기 위한 것이다.
ciphertext += chr(((ord(s) + ord(key[count % len(key)])) % 26) + ord('A'))

단, 이하의 성질을 이용하고 있다.
>>> ord('A')
65
>>> (65*2)%26
0

상기 특성을 이용하지 않는 경우, 이하의 설명이 된다.
ciphertext += chr((((ord(s) - ord('A')) + (ord(key[count % len(key)]) - ord('A'))) % 26) + ord('A'))

참고문헌



Vigenère cipher - Wikipedia

소스 코드



GitHub: vigenere.py

좋은 웹페이지 즐겨찾기