Взлом Vigenere cipher

Материал из InformationSecurity WIKI
Перейти к: навигация, поиск

Является производным шифром от шифра Цезаря.

Где часто используется

Скрипты

python

encrypt

  1. def encryption(plaintext, keyword):
  2.     txt_len = len(plaintext)
  3.     keyword *= txt_len // len(keyword) + 1
  4.     keyword = keyword[:txt_len]
  5.     encoded = ""
  6.     for c in range(txt_len):
  7.         newchar = ord(plaintext[c]) + ord(keyword[c]) - 194
  8.         newchar %= 25
  9.         encoded += chr(newchar + 97)
  10.     return encoded

decrypt

  1. def decrypt(key, ciphertext):
  2.     from itertools import cycle
  3.     ALPHA = 'abcdefghijklmnopqrstuvwxyz'
  4.     pairs = zip(ciphertext, cycle(key))
  5.     result = ''
  6.     for pair in pairs:
  7.         total = reduce(lambda x, y: ALPHA.index(x) - ALPHA.index(y), pair)
  8.         result += ALPHA[total % 26]
  9.     return result

perl

ruby

  1. module VigenereCipher
  2.  
  3.   BASE = 'A'.ord
  4.   SIZE = 'Z'.ord - BASE + 1
  5.  
  6.   def encrypt(text, key)
  7.     crypt(text, key, :+)
  8.   end
  9.  
  10.   def decrypt(text, key)
  11.     crypt(text, key, :-)
  12.   end
  13.  
  14.   def crypt(text, key, dir)
  15.     text = text.upcase.gsub(/[^A-Z]/, '')
  16.     key_iterator = key.upcase.gsub(/[^A-Z]/, '').chars.map{|c| c.ord - BASE}.cycle
  17.     text.each_char.inject('') do |ciphertext, char|
  18.       offset = key_iterator.next
  19.       ciphertext << ((char.ord - BASE).send(dir, offset) % SIZE + BASE).chr
  20.     end
  21.   end
  22.  
  23. end


Java

encrypt

  1.     static String encrypt(String text, final String key) {
  2.         String res = "";
  3.         text = text.toUpperCase();
  4.         for (int i = 0, j = 0; i < text.length(); i++) {
  5.             char c = text.charAt(i);
  6.             if (c < 'A' || c > 'Z') continue;
  7.             res += (char)((c + key.charAt(j) - 2 * 'A') % 26 + 'A');
  8.             j = ++j % key.length();
  9.         }
  10.         return res;
  11.     }

decrypt

  1.     static String decrypt(String text, final String key) {
  2.         String res = "";
  3.         text = text.toUpperCase();
  4.         for (int i = 0, j = 0; i < text.length(); i++) {
  5.             char c = text.charAt(i);
  6.             if (c < 'A' || c > 'Z') continue;
  7.             res += (char)((c - key.charAt(j) + 26) % 26 + 'A');
  8.             j = ++j % key.length();
  9.         }
  10.         return res;
  11.     }

C/C++

Утилиты

https://www.cryptool.org/ - одна из лучших утилит для криптографии

Райтапы

https://github.com/ctfs/write-ups-2014/tree/master/defkthon-ctf/crypto-100 - DEFKTHON CTF: Crypto 100


http://0xa.li/th3jackers-2015-ctf-crypto200-writeup/ - Codegate CTF 2011 Crypto 200


http://www.nobbd.de/blog/artikel.php?titel=write-up-Ekoparty-CTF---Crypto-50-100-200 - Crypto 100

Ссылки

https://en.wikipedia.org/wiki/Vigen%C3%A8re_cipher - официальная вики статья


http://www.counton.org/explorer/codebreaking/vigenere-cipher.php - один из калькуляторов


http://planetcalc.ru/2468/ - русский вариант шифра виженера


http://planetcalc.com/2468/ - еще один калькулятор