uni

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

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}