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}