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