This project is developed during the course of "Cryptography" in University of Macedonia.
I developed some python scripts, using Sage math cloud version.
There are two files. One for each Task that I had to complete.
In the Task 1 I had to work with classic Cryptosystems.
In the Task 2 I had to face more recent Cryptosystems.
#***************************************************
##TASK 1:
###Κρυπταλγόριθμος Μετατόπισης (Shift Cipher)
Υλοποιούνται οι παρακάτω συναρτήσεις.
shiftCipherEnc(pl, k): Η συνάρτηση υλοποιεί την κρυπτογράφηση με τον κρυπταλγόριθμο μετατόπισης
shiftCipherDec(ct,k): Η συνάρτηση υλοποιεί την αποκρυπτογράφηση με τον κρυπταλγόριθμο μετατόπισης
####Βοηθητικές συναρτήσεις
str2lst(s): παίρνει ένα αλφαριθμητικό και επιστρέφει σε λίστα τις αριθμητικές τιμές των χαρακτήρων του αλφαριθμητικού.
lst2str(lst): αντίθετη λειτουργία της str2lst(s).
###---------------------------------------------------
###Κρυπταλγόριθμος Αντικατάστασης (Transposition Cipher)
Υλοποιούνται οι παρακάτω συναρτήσεις.
subCipherDec(c, key): Η subCipherDec αποκρυπτογραφεί το κείμενο c με βάση το κλειδί key.
####Βοηθητικές συναρτήσεις
CreateKey(sorted_freq, engFreq): Η CreateKey, δοσμένης της λίστας με τις συχνότητες (ταξινομημένες) καθώς και με τα πιο συχνά γράμματα της αγγλικής, κάνει την αντιστοίχηση ώστε να παραχθεί το κλειδί.
replaceChar(li, old, new):Η replaceChar αντικαθιστά έναν χαρακτήρα (old) σε μια λίστα (li) με έναν άλλο χαρακτήρα (new)
findFreqs(freq): Η findFreqs, παίρνει ως είσοδο τις συχνότητες εμφάνισης τωνς γραμμάτων σε ένα κείμενο αλφαβητικά και τις ταξινομεί με φθίσουσα σειρά.
###---------------------------------------------------
###Ομοπαραλληλικός κρυπταλγόριθμος (Affine Cipher)
Υλοποιούνται οι παρακάτω συναρτήσεις.
affine_enc(m, key1, key2): Κρυπτογράφηση Ομοποραλληλικού κρυπταλγορίθμου.
affine_dec(c, key1, key2): Αποκρυπτογράφηση Ομοπαραλληλικού κρυπταλγορίθμου.
affine_number_enc(m, k1, k2, mod): Ορίζω ξανά την κρυπτογράφηση για αριθμούς.
affine_number_dec(c, k1, k2, mod): Ορίζω ξανά την αποκρυπτογράφηση για αριθμούς.
####Βοηθητικές συναρτήσεις
affine_analysis(plaintext, ciphertext): Λύση συστήματος εξισώσεων για εύρεση κλειδιών.
affine_analysis_num(p1, p2, c1, c2): Ορίζω ξανά την ανάλυση για αριθμούς.
###---------------------------------------------------
###Βάση εκφώνησης Ομοπαραλληλικός Κρυπταλγόριθμος (Custom Affine Cipher)
Υλοποιούνται οι παρακάτω συναρτήσεις.
custom_affine_enc(m, k1, k2, k3): Κρυπτογράφηση
custom_affine_dec(ct, k1, k2, k3): Αποκρυπτογράφηση
####Βοηθητικές συναρτήσεις
check_b(b): Ελέγχει αν το b είναι σχετικά πρώτος με το 26. Στην ουσία αν κάνει για κλειδί.
custom_affine_analysis(plaintext, ciphertext): Ανάλυση κρυπτοσυστήματος για εύρεση πιθανών κλειδιών.
###---------------------------------------------------
###Κρυπταλγόριθμος Hill (Hill Cipher)
Υλοποιούνται οι παρακάτω συναρτήσεις.
Hill_enc(m, K): Η συνάρτηση υλοποιεί την κρυπτογράφηση με τον κρυπταλγόριθμο Hill.
Hill_dec(c, K): Η συνάρτηση υλοποιεί την αποκρυπτογράφηση με τον κρυπταλγόριθμο Hill.
####Βοηθητικές συναρτήσεις
check_valid(K): Ελέγχει αν ο πίνακας K είναι αντιστρέψιμος, στην ουσία αν είναι δυνατό (πιθανό) κλειδί.
###---------------------------------------------------
###Κρυπταλγόριθμος γινομένου (Product Cipher)
Υλοποιούνται οι παρακάτω συναρτήσεις.
Ek1 (p, k): Δέχεται ως είσοδο plaintext (p) και key (k) και κάνει πράξη XOR μεταξύ τους.Επιστρέφει το αποτέλεσμα στο δεκαδικό.
Ek2(P): Κάνει permutation τα bit του P με βάση το (p4 p2 p6 p5 p3 p1) και επιστρέφει το αποτέλεσμα στο δεκαδικό.
###Η κρυπτογράφηση πρακτικά είναι το γινόμενο των δύο συναρτήσεων.
###---------------------------------------------------
###Κρυπτοσύστημα Pohlig - Hellman
Υλοποιείται η παρακάτω συνάρτηση.
PH(m, p, e): Η συνάρτηση προσομοιώνει το κρυπτοσύστημα Pohlig - Hellman. Κάνει αρχικά κωδικοποίηση, έπειτα κάνει κρυπτογράφηση, μετά βρίσκει τον αντίστροφο του κλειδιού, κάνει αποκρυπτογράφηση και τέλος αποκωδικοποίηση.
###---------------------------------------------------
###Συναρτήσεις για την Άσκηση 10
Euler(n):: Η συνάρτηση βρίσκει τους αριθμούς στο διάστημα (0,n) οι οποίοι είναι σχετικά πρώτοι με το n. Προσοχή δεν είναι ίδια με την έτοιμη συνάρτηση euler_phi(n) καθώς η έτοιμη επιστρέφει το πλήθος των αριθμών ενώ η δική μου επιστρέφει τους ίδιους τους αριθμούς.
checkEuler(n): Αυτή είναι ακριβώς ίδια με την έτοιμη euler_phi(n).
find4Sols(n): Η συνάρτηση ψάχνει τέσσερις αριθμούς για τους οποίους το φ(n) τους να ισούται με 16. Τυπώνει τους αριθμούς αυτούς.
Omada(n, g): Η συνάρτηση υπολογίζει την ομάδα με γεννήτορα το g, στο Zn. Επιστρέφει την ομάδα.
#***************************************************
##TASK 2:
###Κρυπτοσύστημα RSA
Υλοποιούνται οι παρακάτω συναρτήσεις.
rsa_enc(m, e, n): Η συνάρτηση υλοποιεί την κρυπτογράφηση με τον κρυπταλγόριθμο RSA. Δέχεται ως είσοδο το μήνυμα m και το δημόσιο κλειδί e,n και επιστρέφει το κρυπτοκείμενο.
rsa_dec(c, d, n): Η συνάρτηση υλοποιεί την αποκρυπτογράφηση με τον κρυπταλγόριθμο RSA. Δέχεται ως είσοδο το κρυπτοκείμενο c, το ιδιωτικό κλειδί d και το modulus n και επιστρέφει το απλό κείμενο.
####Βοηθητικές συναρτήσεις
keygen(bits): Δημιουργεί κλειδιά RSA, δέχεται ως είσοδο το πλήθος των bits των κλειδιών (με τιμές στο διάστημα [512,1024]) και επιστρέφει τα κλειδιά: δημόσιο και ιδιωτικό.
str2num(s): Υλοποιεί την λειτουργία της κωδικοποίησης βάση του εκτεταμένου ASCII. Δέχεται ως είσοδο ένα κείμενο s και επιστρέφει έναν μεγάλο ακέραιο.
num2str(n): Υλοποιεί την λειτουργία αποκωδικοποίησης βάση του εκτεταμένου ASCII. Δέχεται ως είσοδο έναν μεγάλο ακέραιο n και επιστρέφει το κείμενο στο οποίο αντιστοιχεί.
###---------------------------------------------------
###Κινέζικο Θεώρημα Υπολοίπων (CRT)
Υλοποιείται η παρακάτω συνάρτηση.
rsa_decrt(c, d, p, q):: Επιταχύνεται η αποκρυπτογράφηση με τον κρυπταλγόριθμο RSA. δέχεται ως είσοδο το κρυπτοκείμενο c, το ιδιωτικό κλειδί d και τους πρώτους p,q και επιστρέφει το απλό κείμενο.
###---------------------------------------------------
###Επίθεση κοινού modulus
Υλοποιείται η παρακάτω συνάρτηση.
crack_rsa_comoda(p,q,e1,e2,c1,c2): Προσομοιώνει μια επίθεση κοινού modulus.
###---------------------------------------------------
###Ανταλλαγή κλειδιών Diffie-Hellman
Υλοποιούνται οι παρακάτω συναρτήσεις.
public_private_pair(p, q, g, F): Παίρνει ως είσοδο την έξοδο της generate_parameters και επιστρέφει το ζευγάρι τιμών (X,x), όπου X = g^x mod p και x∈{2,…,p−2}.
generate_secret(X,y): Παίρνει ως είσοδο τη δημόσια πληροφορία του άλλου μέλους της επικοινωνίας κατά την ανταλλαγή DH και την ιδιωτικό εκθέτη και επιστρέφει το κοινό μυστικό κλειδί.
####Βοηθητικές συναρτήσεις
generate_parameters(bits): Δέχεται ως είσοδο το πλήθος των bits ενός μεγάλου πρώτου p και επιστρέφει 4 τιμές: p, q, g και F. Θα πρέπει τα p και q να είναι πρώτοι αριθμοί τέτοιοι ώστε p=2∗q+1, g θα είναι ένας ακέραιος γεννήτορας του ℤp∗ και F ένα πεπερασμένο σώμα με p στοιχεία.
###---------------------------------------------------
###Πρωτόκολλο κρυπτογράφησης El Gamal
Χρησιμοποιούνται συναρτήσεις που φτιάχτηκαν πιο πριν και υλοποιείται η κρυπτογράφηση και η αποκρυπτογράφηση.
###---------------------------------------------------
###Το Πρόβλημα του Διακριτού Λογαρίθμου (DLP)
Δεν χρειάζονται κάποιες συναρτήσεις για την υλοποίηση.
###---------------------------------------------------
###Ανταλλαγή κλειδιών – ECDH
Υλοποιούνται οι παρακάτω συναρτήσεις.
ECDHKeyExchange(E, G): Η συνάρτηση προσομοιώνει την ανταλλαγή κλειδιών ECDH.
####Βοηθητικές συναρτήσεις
computeXx(E, P): Υπολογίζει τον ιδιωτικό πολλαπλασιαστή και το δημόσιο κλειδί.
computeCommonSecretKey(Y, x): Υπολογίζει το κοινό μυστικό κλειδί.
###---------------------------------------------------
###Κρυπτοσύστημα ελλειπτικού El Gamal
Δεν χρειάζονται κάποιες συναρτήσεις για την υλοποίηση.
###---------------------------------------------------
###Κωδικοποίηση Koblitz και κρυπτοσύστημα ελλειπτικού El Gamal
Δεν χρειάζονται κάποιες συναρτήσεις για την υλοποίηση.
###---------------------------------------------------
###Ψηφιακές υπογραφές
Υλοποιείται η παρακάτω συνάρτηση.
checkDigSig(n, e, x, s): Η συνάρτηση ελέγχει αν η ψηφιακή υπογραφή είναι έγκυρη.
###---------------------------------------------------
#END