uni

University stuff
git clone git://git.margiolis.net/uni.git
Log | Files | Refs | README | LICENSE

doc.tex (11883B)


      1 \documentclass[12pt]{article}
      2 \usepackage[utf8]{inputenc}
      3 \usepackage[greek,english]{babel}
      4 \usepackage{alphabeta}
      5 \usepackage{fancyhdr}
      6 \usepackage{listings}
      7 \usepackage{mathtools}
      8 \usepackage{xcolor}
      9 \usepackage{float}
     10 \usepackage{siunitx}
     11 \usepackage[margin=0.5in]{geometry}
     12 \usepackage[backend=bibtex]{biblatex}
     13 
     14 \lstset {
     15         basicstyle=\ttfamily,
     16         columns=fullflexible,
     17         breaklines=true,
     18         keepspaces=true,
     19 	showstringspaces=false
     20 }
     21 
     22 \title{Εργαστήριο Ασφάλειας στην Τεχνολογία της Πληροφορίας -- Εργασία 2}
     23 \author{Χρήστος Μαργιώλης -- 19390133}
     24 \date{Απρίλιος 2024}
     25 
     26 \begin{document}
     27 
     28 \begin{titlepage}
     29         \maketitle
     30         \begin{figure}[t!]
     31         \begin{center}
     32         \includegraphics[scale=0.3]{./res/uniwalogo.png} \\
     33         \Large
     34         \textbf{Πανεπιστήμιο Δυτικής Αττικής} \\
     35         \large
     36         Τμήμα Μηχανικών Πληροφορικής και Ηλεκτρονικών Υπολογιστών
     37         \end{center}
     38         \end{figure}
     39 \end{titlepage}
     40 
     41 \renewcommand{\contentsname}{Περιεχόμενα}
     42 \tableofcontents
     43 \pagebreak
     44 
     45 \section{Δομή αρχείων}
     46 
     47 \subsection{Αρχεία C}
     48 
     49 Ο κώδικας C, για δική μου διευκόλυνση στην δοκιμή διαφόρων εισόδων, περιέχει και
     50 ρουτίνες διαβάσματος αρχείων, πέρα από την επίλυση των προβλημάτων. Τα περισσότερα
     51 προγράμματα χρησιμοποιούνται σε συνδυασμό με κάποιο από τα scripts που αναλύονται
     52 παρακάτω. Αυτό προσθέτει μεν πολυπλοκότητα, αλλά κάνει τα προγράμματα πιο ευέλικτα.
     53 Σε κάθε δραστηριότητα εξηγώ πως πρέπει να τρέξουμε το πρόγραμμα.
     54 
     55 \subsection{Scripts}
     56 
     57 Πέρα από τον κώδικα έγραψα και τα παρακάτω 2 scripts.
     58 
     59 \subsubsection{\lstinline{atoh}: Μετατροπή από ASCII σε Hex}
     60 
     61 \lstinputlisting[language=c]{../src/atoh}
     62 
     63 \subsubsection{\lstinline{htoa}: Μετατροπή από Hex σε ASCII}
     64 
     65 \lstinputlisting[language=c]{../src/htoa}
     66 
     67 \subsection{Makefile}
     68 
     69 Τα προγράμματα μεταγλωττίζονται όλα αυτόματα μέσω του παρακάτω
     70 \lstinline{Makefile}.
     71 
     72 Το \lstinline{Makefile} διαθέτει τις παρακάτω επιλογές:
     73 \begin{itemize}
     74 	\item \lstinline{make}: Κάνει compile όλα τα προγράμματα.
     75 	\item \lstinline{make clean}: Σβήνει τα εκτελέσιμα αρχεία που έχουν
     76 		παραχθεί.
     77 \end{itemize}
     78 
     79 Ο κώδικας του:
     80 
     81 \lstinputlisting[language=c]{../src/Makefile}
     82 
     83 \subsection{Αρχεία δεδομένων}
     84 
     85 Στο directory \lstinline{src/dat} βρίσκονται αρχεία δεδομένων που
     86 χρησιμοποιούνται από τα προγράμματα. 'Ολα τα αρχεία ακολουθούν την ονομασία
     87 \lstinline{<program>.in} όπου \lstinline{program} το όνομα του προγράμματος που
     88 το χρησιμοποιεί. Προκειμένου να αποφευχθεί τυχόν περιττή πολυπλοκότητα, τα
     89 προγράμματα δεν κάνουν ελέγχους εγκυρότητας των αρχείων εισόδου.
     90 
     91 \section{Δραστηριότητα 1: Δημιουργία ιδιωτικού κλειδιού}
     92 
     93 \subsection{Επεξήγηση υλοποίησης}
     94 
     95 Για να δημιουργήσουμε ένα ιδιωτικό κλειδί RSA, πρέπει αρχικά να υπολογίσουμε
     96 την συνάρτηση:
     97 \[\phi(n) = (p-1)(q-1)\]
     98 Στην συνέχεια, θα υπολογίσουμε την εξίσωση:
     99 \[e \cdot d \mod \phi(n) = 1\]
    100 Λύνοντας ως προς $d$. Ο υπολογισμός του ιδιωτικού κλειδιού μέσα στο πρόγραμμα
    101 γίνεται με τις εξής εντολές: \\
    102 
    103 \begin{lstlisting}[language=C]
    104 	...
    105 	BN_dec2bn(&one, "1");
    106 	BN_sub(foo, p, one);
    107 	BN_sub(bar, q, one);
    108 	BN_mul(phi, foo, bar, ctx);
    109 	BN_mod_inverse(d, e, phi, ctx);
    110 \end{lstlisting}
    111 
    112 \subsection{Εκτέλεση προγράμματος}
    113 
    114 Χρήση: \lstinline{priv [-v] input} \\
    115 
    116 Το πρόγραμμα, όταν το τρέξουμε απλώς με το αρχείο εισόδου, τυπώνει το
    117 ιδιωτικό κλειδί. Αν του δώσουμε και την επιλογή \lstinline{-v}, τυπώνει
    118 αναλυτικά τα $e$, $n$ και $d$. Η επιλογή αυτή είναι χρήσιμη για την
    119 παραγωγή του αρχείου εισόδου που χρησιμοποιείται για την κρυπτογράφηση
    120 μηνυμάτων: \\
    121 
    122 \includegraphics[width=\textwidth]{res/priv.png} \\
    123 
    124 \subsection{Πηγαίος κώδικας: \lstinline{priv.c}}
    125 
    126 \lstinputlisting[language=c]{../src/priv.c}
    127 
    128 \section{Δραστηριότητα 2: Κρυπτογράφηση μηνύματος}
    129 
    130 \subsection{Επεξήγηση υλοποίησης}
    131 
    132 Η κρυπτογράφηση ενός μηνύματος γίνεται με τον τύπο:
    133 \[C = P^e \mod n\]
    134 Και η αποκρυπτογράφηση του:
    135 \[P = C^d \mod n\]
    136 
    137 Η συνάρτηση OpenSSL για την πράξη αυτή είναι η \lstinline{BN_mod_exp()}. Οι
    138 παρακάτω εντολές στον κώδικα εκτελούν την (απο)κρυπτογράφηση: \\
    139 
    140 \begin{lstlisting}[language=C]
    141 	...
    142 	/* Encrypt message */
    143 	BN_mod_exp(encrstr, str, e, n, ctx);
    144 	/* Decrypt message */
    145 	BN_mod_exp(decrstr, encrstr, d, n, ctx);
    146 \end{lstlisting}
    147 
    148 \subsection{Εκτέλεση προγράμματος}
    149 
    150 Χρήση: \lstinline{./atoh 'msg' | encrypt input} \\
    151 
    152 Παρακάτω φαίνεται ένα ενδεικτικό τρέξιμο. Το μήνυμα μετατρέπεται σε Hex με την
    153 χρήση του \lstinline{atoh} script. Αξίζει να σημειωθεί ότι στην υλοποίησή μου,
    154 τα $e$, $n$ και $d$ υπολογίζονται από το \lstinline{priv.c} και
    155 χρησιμοποιούνται κατευθείαν από το \lstinline{encrypt.c} ώστε να αποφευχθεί η
    156 επανάληψη κώδικα, εξ'ου και η χρήση του \lstinline{priv} στην αρχή: \\
    157 
    158 \includegraphics[width=\textwidth]{res/encrypt.png} \\
    159 
    160 \subsection{Πηγαίος κώδικας: \lstinline{encrypt.c}}
    161 
    162 \lstinputlisting[language=c]{../src/encrypt.c}
    163 
    164 \section{Δραστηριότητα 3: Αποκρυπτογράφηση μηνύματος}
    165 
    166 \subsection{Επεξήγηση υλοποίησης}
    167 
    168 'Οπως και στην δραστηριότητα 3, χρησιμοποιείται ο ίδιος τύπος για την
    169 αποκρυπτογράφηση ενός μηνύματος.
    170 
    171 \subsection{Εκτέλεση προγράμματος}
    172 
    173 Χρήση: \lstinline{decrypt input | htoa} \\
    174 
    175 Στο αρχείο εισόδου θα χρησιμοποιήσουμε τα ίδια κλειδιά με αυτά της άσκησης 3,
    176 συν ότι θα προσθέσουμε και το επιπλέον κρυπτογράφημα που δίνεται στην εκφώνηση
    177 της άσκησης. Το πρόγραμμα τυπώνει το αποκρυπτογραφημένο μήνυμα σε Hex, οπότε
    178 διοχετεύουμε την έξοδό του στο \lstinline{htoa} script ώστε να μετατραπεί σε
    179 ASCII: \\
    180 
    181 \includegraphics[width=\textwidth]{res/decrypt.png} \\
    182 
    183 \subsection{Πηγαίος κώδικας: \lstinline{decrypt.c}}
    184 
    185 \lstinputlisting[language=c]{../src/decrypt.c}
    186 
    187 \section{Δραστηριότητα 4: Υπογραφή μηνύματος}
    188 
    189 \subsection{Επεξήγηση υλοποίησης}
    190 
    191 Η υπογραφή ενός μηνύματος γίνεται με τον τύπο:
    192 \[S = H(P)^d \mod n\]
    193 
    194 Στον κώδικα, η υλοποίηση γίνεται ως εξής: \\
    195 \begin{lstlisting}[language=C]
    196 	...
    197 	BN_mod_exp(sign, str, d, n, ctx);
    198 \end{lstlisting}
    199 
    200 \subsection{Εκτέλεση προγράμματος}
    201 
    202 Χρήση: \lstinline{atoh 'msg' | sign input} \\
    203 
    204 Στο παρακάτω ενδεικτικό τρέξιμο, παρατηρούμε ότι μία πολύ μικρή αλλαγή στο
    205 μήνυμα θα παράξει τελείως διαφορετική υπογραφή, οπότε είμαστε και σίγουροι ότι
    206 τα μηνύματα δεν ήτανε ίδια: \\
    207 
    208 \includegraphics[width=\textwidth]{res/sign.png} \\
    209 
    210 \subsection{Πηγαίος κώδικας: \lstinline{sign.c}}
    211 
    212 \lstinputlisting[language=c]{../src/sign.c}
    213 
    214 \section{Δραστηριότητα 5: Επαλήθευση υπογραφής}
    215 
    216 \subsection{Επεξήγηση υλοποίησης}
    217 
    218 Η επαλήθευση της υπογραφής γίνεται με τον τύπο:
    219 \[Digest = S^e \mod n\]
    220 
    221 Στον κώδικα, υλοποίηση είναι γίνεται ως εξής: \\
    222 \begin{lstlisting}[language=C]
    223 	...
    224 	BN_mod_exp(str, sign, e, n, ctx);
    225 \end{lstlisting}
    226 
    227 \subsection{Εκτέλεση προγράμματος}
    228 
    229 Χρήση: \lstinline{verify input} \\
    230 
    231 \subsection{Περίπτωση Α}
    232 
    233 Αρχικά θα δώσουμε ως είσοδο την έγκυρη υπογραφή: \\
    234 
    235 \includegraphics[width=\textwidth]{res/verify1.png} \\
    236 
    237 'Οταν αλλάξουμε το τελευταίο byte της υπογραφής, παρατηρούμε ότι η επαλήθευση
    238 δεν είναι έγκυρη: \\
    239 
    240 \includegraphics[width=\textwidth]{res/verify2.png} \\
    241 
    242 \subsection{Περίπτωση Β}
    243 
    244 Από το παρακάτω τρέξιμο, βλέπουμε ότι η υπόγραφη είναι πράγματι της Alice: \\
    245 
    246 \includegraphics[width=\textwidth]{res/verify3.png} \\
    247 
    248 \section{Δραστηριότητα 6: Μη-αυτόματη επαλήθευση πιστοποιητικού X.509}
    249 
    250 \textit{Για την συγκεκριμένη δραστηριότητα επέλεξα να παραθέσω τις εντολές σε μορφή
    251 text αντί για screenshots διότι τα output και οι ίδιες οι εντολές είναι πολύ
    252 μεγάλες για να φανούν καθαρά σε εικονα.} \\
    253 
    254 Κατεβάζουμε το πιστοποιητικό της ιστοσελίδας margiolis.net:
    255 \begin{lstlisting}
    256 	$ openssl s_client -connect margiolis.net:443 -showcerts \
    257 		</dev/null 2>/dev/null | openssl x509 -outform pem > dat/c0.pem
    258 \end{lstlisting}
    259 
    260 Εξάγουμε το $e$:
    261 \begin{lstlisting}
    262 	$ openssl x509 -in dat/c0.pem -text -noout | grep 'Exponent' |
    263 		awk '{print $3}' | sed 's/(//;s/)//;s/0x//' > dat/cert.in
    264 \end{lstlisting}
    265 
    266 Εξάγουμε το $n$:
    267 \begin{lstlisting}
    268 	$ openssl x509 -in dat/c0.pem -noout -modulus |
    269 		sed 's/Modulus=//' >> dat/cert.in
    270 \end{lstlisting}
    271 
    272 Εξάγουμε την υπογραφή:
    273 \begin{lstlisting}
    274 	$ openssl x509 -in dat/c0.pem -text -noout \
    275 		-certopt ca_default -certopt no_validity \
    276 		-certopt no_serial -certopt no_subject \
    277 		-certopt no_extensions -certopt no_signame |
    278 		sed 1d | tr -d '[:space:]:' | sha256 >> dat/cert.in
    279 \end{lstlisting}
    280 
    281 Τέλος, επαληθεύουμε το πιστοποιητικό (το output είναι πολύ μεγάλο για να
    282 συμπεριληφθεί ολόκληρο):
    283 \begin{lstlisting}
    284 	$ ./verify dat/cert.in
    285 	e: 010001
    286 	n: B8CF80904908D88..........1AE7F0DE351B
    287 	sign: EC3CF68F5F6...........D228F04C5E54BE1D
    288 	str: 6E7DBA8412AEB7CF.........5FE55D1059486304
    289 \end{lstlisting}
    290 
    291 \end{document}