Krypto-zabawy czyli (całkiem) użyteczne skryptowe narzędzia do kryptografii symetrycznej

Na potrzeby edukacyjne opracowałem kolejne skryptowe narzędzie, tym razem do kryptografii symetrycznej. Zadaniem skryptu napisanego w języku (a jakże! :-)) Ruby, jest symetryczne szyfrowanie i deszyfrowanie tekstu przy pomocy kilku wybranych przeze mnie algorytmów kryptograficznych. Skrypt wyposażyłem w graficzny interfejs użytkownika oparty o bibliotekę Tk.

Całość w sensie GUI prezentuje się tak:

Interfejs skryptu Encryptor-Decryptor

Interfejs skryptu Encryptor-Decryptor

Zaprezentowane narzędzie szyfruje i deszyfruje łańcuchy znakowe przy pomocy funkcji biblioteki OpenSSL zaimplementowanych w środowisku Ruby jako gem. Zatem, proszę pamiętać o wcześniejszym zainstalowaniu tego gema przed uruchomieniem skryptu na swoim komputerze. Dotyczy to zresztą wszystkich innych gemów, na które wskazują klauzule ‘require’ w kodzie skryptu.

gem install openssl
gem install digest
...

Istnieje też kilka alternatywnych do OpenSSL bibliotek kryptograficznych, jak choćby ‘ezcrypto’, które z czystym sumieniem także w tym miejscu polecam.

Jak zwykle gorąco namawiam Was do eksperymentowania z kodem, bo metodą organoleptyczną można się najwięcej nauczyć i pogimnastykować umysł.

Oto kod skryptu:

# encoding 'UTF-8'
require 'tk'
require 'openssl'
require 'digest/sha1'
require "base64"

def alert(tekst)
   Tk::messageBox :message => "#{tekst}"
end

def encrypt(plaintext, kee, alg)
   case alg
      when '3DES'
        crypto = "des3" 
      when 'AES'
         crypto = "aes-256-cbc" 
      when 'CAMELIA'
         crypto = "camellia-256-ecb" 
      when 'BLOWFISH'
         crypto = "bf" 
   end
   begin
      cipher = OpenSSL::Cipher::Cipher.new(crypto)
      cipher.encrypt
      cipher.key = key = Digest::SHA1.hexdigest(kee)
      ciphertext = cipher.update(plaintext)
      ciphertext << cipher.final
      ciphertext = Base64.encode64(ciphertext)
   rescue => e 
      alert("Problem with encryption\n#{e.message}")
      return
   end 
   return ciphertext
end

def decrypt(ciphertext, kee, alg)
   case alg
      when '3DES'
         crypto = "des3" 
      when 'AES'
         crypto = "aes-256-cbc" 
      when 'CAMELIA'
         crypto = "camellia-256-ecb" 
      when 'BLOWFISH'
         crypto = "bf" 
   end
   begin
      ciphertext = Base64.decode64(ciphertext)
      cipher = OpenSSL::Cipher::Cipher.new(crypto)
      cipher.decrypt
      cipher.key = key = Digest::SHA1.hexdigest(kee)
      plaintext = cipher.update(ciphertext)
      plaintext << cipher.final
   rescue => e 
      alert("Problem with decryption\n#{e.message}")
      return
   end
   return plaintext
end

root = TkRoot.new { title "Encryptor/Decryptor - Janusz Nawrat (2014)" }

oper_frame = TkFrame.new(root) { 
   relief 'sunken'
   borderwidth 3
   padx 20; pady 20
   pack("fill" => "both", 'side' => 'left')
}

plaintext_frame = TkFrame.new(root) { 
   relief 'sunken'
   borderwidth 3
   padx 10; pady 10
   pack("fill" => "both")
}

ciphertext_frame = TkFrame.new(root) { 
   relief 'sunken'
   borderwidth 3
   padx 10; pady 10
   pack("fill" => "both")
}

$oper = TkVariable.new ('encryption')

oper_lbl = TkLabel.new(oper_frame) { text "Type of operation\n_______________________"; pack() }

oper_rdb1 = TkRadioButton.new(oper_frame) {
   text 'Encryption'
   variable $oper
   value 'encryption'
   anchor 'w'
   pack('side' => 'top', 'fill' => 'x')
}

oper_rdb2 = TkRadioButton.new(oper_frame) {
   text 'Decryption'
   variable $oper
   value 'decryption'
   anchor 'w'
   pack('side' => 'top', 'fill' => 'x')
}

key_lbl = TkLabel.new(oper_frame) { text "_______________________\nCrypto key"; pack() }

key_entr = TkEntry.new(oper_frame) { pack() }
key_entr.insert(0, "Change_This_Secret_Key")

alg_lbl = TkLabel.new(oper_frame) { text "\nType of cryptoalgorithm\n_______________________\n"; pack() }

$algorithms = %w{ 3DES AES CAMELIA BLOWFISH }

$alg_options = TkVariable.new($algorithms)

alg_list = TkListbox.new(oper_frame) {
   width 20; height 5
   setgrid 1
   selectmode 'single'
   listvariable $alg_options
   pack('fill' => 'x')
}

plaintext_lbl = TkLabel.new(plaintext_frame) { text "Plaintext"; pack() }

plain_text = TkText.new(plaintext_frame) {
   width 85; height 12
   wrap 'word'
   pack('side' => 'left')
}

vbar_plain = TkScrollbar.new(plaintext_frame) { 
   orient 'vert' 
   pack('side' => 'right', 'fill' => 'both') 
}

plain_text.yscrollbar(vbar_plain) 

ciphertext_lbl = TkLabel.new(ciphertext_frame) { text "Ciphertext"; pack() }

cipher_text = TkText.new(ciphertext_frame) {
   width 85; height 11
   pack('side' => 'left')
}

vbar_cipher = TkScrollbar.new(ciphertext_frame) { 
   orient 'vert' 
   pack('side' => 'right', 'fill' => 'both') 
}

cipher_text.yscrollbar(vbar_cipher)

lbl = TkLabel.new(oper_frame) { text "_______________________\n"; pack() }

encrypt_button = TkButton.new(oper_frame) { 
   text "Do it!"; padx 10; pady 5; 
   command {
      crypto_key = key_entr.get()
      plaintext = plain_text.get(1.0, 'end')
      ciphertext = cipher_text.get(1.0, 'end')
      nr_alg = alg_list.curselection
      case nr_alg
         when [0]
            alg = '3DES'
         when [1]
            alg = 'AES'
         when [2]
            alg = 'CAMELIA'
         when [3]
            alg = 'BLOWFISH'
         else
            alg = 'AES' 
      end
      if $oper == 'encryption'
         ciphertext = encrypt(plaintext, crypto_key, alg)
         cipher_text.delete(1.0, 'end')
         cipher_text.insert('end', ciphertext)
      elsif $oper == 'decryption'
         plaintext = decrypt(ciphertext, crypto_key, alg)
         plain_text.delete(1.0, 'end')
         plain_text.insert('end', plaintext)
      end 
   }
   pack('fill'=>'x') 
}

clear_button = TkButton.new(oper_frame) { 
   text "Clear"; padx 10; pady 5; 
   command { plain_text.delete(1.0, 'end'); cipher_text.delete(1.0, 'end') }
   pack('fill'=>'x')
}
 
exit_button = TkButton.new(oper_frame) { 
   text "Exit"; padx 10; pady 5; 
   command {exit}
   pack('fill'=>'x') 
}

Tk.mainloop()

Informacje Janusz Nawrat
Just ordinary man who likes thinking...

2 Responses to Krypto-zabawy czyli (całkiem) użyteczne skryptowe narzędzia do kryptografii symetrycznej

  1. ertertep3rwrew.pl pisze:

    1. czemu interface jest po angielskiemuj?
    Ludzie jak juz musicie to moze choc dajcie mozliwosc polskiego opisu.
    2. czy da sie to jakos zapakowac w paczke czy musialbym zainstalowac komus ruby by mogl tego uzyc?

    • Janusz Nawrat pisze:

      Nie ma problemu ze spolszczeniem skryptu. Zapakować można skrypt do postaci wykonywalnej przy pomocy narzędzia ocra.
      Procedura jest taka: (1) Instalacja narzędzia ocra: gem install ocra. (2) Potem wykonanie polecenia: ocra nazwa_skryptu.rb –windows C:\Ruby192\lib\tcltk\ –no-autoload –add-all-core. Oczywiście trzeba podać odpowiednią nazwę, pod którą zapisany jest plik skryptu i właściwą ścieżkę dostępu do bibliotek Tk.

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Log Out / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Log Out / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Log Out / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Log Out / Zmień )

Connecting to %s

TOMASZ WEŁNA

artysta grafik | wykładowca

PRACOWNIA OKO

Szkoła Rysunku Malarstwa i Grafiki DR TOMASZA WEŁNY | KRAKÓW | Plac Matejki 10 | tel 691 81 75 74

Piękno neurobiologii

Blog Jerzego Vetulaniego

Teoria muzyki, zasady muzyki, podstawy muzyki

Teoria muzyki, zasady muzyki, podstawy muzyki - czyli to co każdy amator muzyki wiedzieć powinien :)

Personal Development & Inspirations

Przemyślenia i refleksje, którymi warto się podzielić (blog by Janusz Nawrat)

Business IT Cooperation Platform

Biznes i IT - dwa światy, które muszą współdziałać

%d bloggers like this: