Chào các bạn, từ bây giờ chúng ta sẽ đến với một chủ thể về mã hóa: Vigenère Cipher.

Bạn đang xem: Vigenère Cipher: Encrypt And Decrypt Online

Phương pháp vào mã hóa Vigenère được tuyên bố lần đầu vì chưng Giovan Battista Bellaso trong cuốn La cifra del. Sig. Giovan Battista Bellaso từ nỗ lực kỷ 16. Sau này Blaise de Vigenère vào chũm kỷ 19 công bố một phương pháp tương tự, nhưng to gan hơn, người ta đã đưa tên Vigenère đặt cho tên mã hóa này. đa số người cho rằng điều ấy là không công bằng cho người đã phát minh ra nó trước.

Nhưng thôi, tạm bỏ qua mất những sự việc lịch sử, ta đang đến luôn với nội dung mã hóa.

1. Vigenère Cipher

Encrypt

Mã hóa Vigenère là sự phối hợp xem kẽ những phép mã hóa Caesar với công việc dịch khác nhau.

Nhắc lại một chút về mã hóa Caesar, đây là phương pháp mã hóa nhưng mà ta lựa chọn ra một quý hiếm khóa key K, với dịch những chữ chiếc theo vòng tròn K bước. Ví dụ thông thường nhất là K=13 thì:


Trong mã hóa Vigenère té ra sẽ sử dụng một bảng để làm phép dịch, với một chuỗi khóa call là key, cầm vì một trong những như vào mã hóa Caesar.
*

Ví dụ ta gồm một chuỗi bắt buộc mã hóa như sau:

ATTACKATDAWN

Và key dùng làm mã hóa là “LEMON”. Trước hết ta đã nhân chuỗi LEMON này lên để nó gồm cùng độ nhiều năm với chuỗi bắt buộc mã hóa:

LEMONLEMONLE

Khi này ta sẽ áp dụng bảng mã hóa như sau: ban đầu từ trái qua phải, lấy cam kết tự của key làm cho dòng, ký tự của chuỗi yêu cầu mã hóa là cột và dóng vào trong bảng mã ta được một cam kết tự, cam kết tự đó đó là ký tự đã có mã hóa.

Áp dụng cùng với key LEMONLEMONLE và chuỗi ATTACKATDAWN bên trên:


-> L -> X -> F -> O -> P -> V -> E -> F -> R -> N -> H -> R
ta được chuỗi LXFOPVEFRNHR. Đơn giản đúng ko ?

Decrypt

Để giải mã, ta sẽ lần ngược lại bảng mã thôi. Ban đầu từ trái qua phải, với mỗi cam kết tự của key làm dòng, ta kiếm tìm cột nhưng mà khi dóng xuống ta gồm gía trị là cam kết tự vào chuỗi đã mã hóa. Ký kết tự vào cột đó chính là ký từ của chuỗi ban đầu.

Xem thêm: Top 20 Địa Điểm Du Lịch 2022 Dành Cho Những Bạn 'Cuồng Chân'

Note

Trên thực tế, bảng mã không buộc phải là 26 ký tự alphabet mà có thể tùy ý tùy vào fan mã hóa, ví dụ như sử dụng ký kết tự tiếng Việt, tiếng Nhật hay bất kỳ ký trường đoản cú gì. Mặc dù nhiên cách thức mã hóa thì không thay đổi.

Code


rom itertools import cycleclass VigenereCipher (object): def __init__(self, key, alphabet): self.key = key.decode("utf-8") self.alphabet = alphabet.decode("utf-8") def cipher(self, mode, str): return "".join(self.alphabet<(self.alphabet.index(m) + mode * self.alphabet.index(k)) % len(self.alphabet)> if m in self.alphabet else m for m, k in zip(str.decode("utf-8"), cycle(self.key))).encode("utf-8") def encode(self, str): return self.cipher(1, str) def decode(self, str): return self.cipher(-1, str)

2. Vigenère Cipher auto key

Đối cùng với Vigenère Cipher thường thì như trên, thì ta sẽ tái diễn key để sở hữu độ dài bởi với độ nhiều năm chuỗi đề xuất mã hoá, theo đó thì ta chỉ việc tra bảng mã là ra chuỗi encode cũng giống như decode. Mặc dù nhiên, để tăng cường độ khó đến chuỗi mã hoá, fan ta sử dụng một cách thức khác mang tên gọi là Vigenère Cipher tự động hóa key, trong số đó ta sẽ thực hiện key một lần duy nhất, ghép với chuỗi yêu cầu mã hoá để tạo thành key new như sau:


Ta sẽ triển khai encode và decode như sau:

Encode

cách 1: tách hoặc thêm những dấu giải pháp (space) vào origin key để cùng form với chuỗi gốc. Ví dụ như trên với “my secret” thì ta phải bóc “password” thành “pa ssword” cách 2: sau đó ghép cùng với chuỗi nơi bắt đầu và cắt cho độ dài bởi độ nhiều năm chuỗi gốc. Ta được chuỗi key là “pa ssword myse c retc od eiwant” cách 3: so sánh với bảng mã và chỉ dẫn chuỗi mã hoá “by kwqihf aghg z atph ws aachkx”

Decode: việc decode khó khăn hơn trước hơi là nhiều khi ta chỉ biết được mỗi key, khi này ta buộc phải cắt ghép từng bước một để từ từ ra được chuỗi gốc:

cách 1: nhận ra rằng các dấu giải pháp (space) ngơi nghỉ chuỗi nơi bắt đầu và chuỗi sẽ mã hoá là kiểu như nhau, chính vì như thế giống như phần encode, ta bóc tách hoặc thêm những dấu biện pháp (space) vào origin key để thuộc form cùng với chuỗi đã mã hoá, ta được “pa ssword” bước 2: đối chiếu với bảng mã và chỉ dẫn được phần đầu của chuỗi gốc là “my secret” bước 3: Ghép tiếp phần chuỗi gốc tìm kiếm được với key, thêm dấu bí quyết (space) đề cân xứng với khung của chuỗi sẽ mã hoá, ta được “pa ssword myse c ret” cách 4+: Lặp lại các bước 2-3 cho đến hết chuỗi vẫn mã hoá, ta được chuỗi gốc là “my secret code i want khổng lồ secure”

Code:


class VigenereAutokeyCipher: def __init__(self, key, abc): self.key = key self.abc = abc self.alle = len(abc) def cipher(self, s, m): output, keyarr = "", list(self.key) for char in s: try: output += self.abc<(self.abc.index(char) + self.abc.index(keyarr.pop(0)) * (-1, 1)) % self.alle> keyarr.append((output<-1>, char)) except ValueError: đầu ra += char return output def encode(self, s): return self.cipher(s, 1) def decode(self, s): return self.cipher(s, 0)