Πανεπιστήμιο Κύπρου Τμήμα Πληροφορικής (Χειμερινό Εξάμηνο 2014) ΕΠΛ 475: Ασφάλεια Δικτύων Η/Υ & Πληροφοριών Εργαστήριο 5 ΕΝΤΟΛΗ: openssl (Linux) Το OpenSSL είναι μια βιβλιοθήκη κρυπτογράφησης για την υλοποίηση των πρωτοκόλλων SSL (Secure Sockets Layer) και TLS (Transport Layer Security). Το πρόγραμμα openssl χρησιμοποιεί συναρτήσεις της βιβλιοθήκης OpenSSL για τη δημιουργία κλειδιών τόσο συμμετρικής όσο και ασύμμετρης κρυπτογράφησης, για την υλοποίηση διαδικασιών κρυπτογράφησης και αποκρυπτογράφησης καθώς και για τις διαδικασίες υπογραφής και επαλήθευσης. Γενική μορφή σύνταξης: openssl command <command_options> <command_args> Για να δείτε το σύνολο των εντολών (commands) που υποστηρίζονται, δώστε μια λάθος εντολή (που δεν υποστηρίζεται π.χ. openssl help) 1) Αφού συνδεθείτε μέσω στο εργαστήριο των Linux (μέσω nxclient), δημιουργείστε μέσα στον προσωπικό σας φάκελο (folder) το φάκελο openssl. Εν συνεχεία ανοίξτε ένα παράθυρο στο οποίο να βλέπετε τα περιεχόμενα του φακέλου openssl. a. Στον παραπάνω φάκελο δημιουργείστε το αρχείο lab5.txt στο οποίο θα γράψετε μέσα το όνομα, το επίθετο και το ID σας (π.χ. Pavlos Antoniou 817651). Αποθηκεύστε και κλείστε το αρχείο. b. Στο terminal πληκτρολογείστε την εντολή: openssl des3 e in lab5.txt out testdes3.txt Θα σας ζητηθεί συνθηματικό και επιβεβαίωσή του (επιλέγετε κατά βούληση). Η παραπάνω εντολή χρησιμοποιεί το συμμετρικό αλγόριθμο κρυπτογράφησης TripleDES (des3) προκειμένου να κρυπτογραφήσει (-e) το αρχείο που δηλώνετε ως είσοδος (-in lab5.txt) και να παράγει έξοδο το αρχείο testdes3.txt ( out testdes3.txt). c. Ανοίξτε το αρχείο testdes3.txt με ένα editor (emacs ή gedit). d. Για την αποκρυπτογράφηση (-d) του testdes3.txt στο testdes3dec.txt πληκτρολογείστε την εντολή: openssl des3 d in testdes3.txt out testdes3dec.txt Το αρχείο testdes3dec.txt θα πρέπει να περιέχει ότι και το αρχείο lab5.txt. e. οκιμάστε τις εντολές: openssl des3 e a in lab5.txt out testdes3b.txt και openssl des3 d a in testdes3b.txt out testdes3bdec.txt και συγκρίνετε τα αρχεία testdes3.txt και testdes3b.txt. Το αρχείο testdes3bdec.txt θα πρέπει να περιέχει ότι και το αρχείο lab5.txt. Η επιλογή της παραμέτρου a μαζί με το e επιτρέπει την κωδικοποίηση του περιεχομένου του lab5.txt σε base64 encoding (χρησιμοποιείται για κωδικοποίηση δυαδικών αρχείων binary files που πρέπει να σταλούν πάνω από μέσα τα οποία είναι σχεδιασμένα να επεξεργάζονται αρχεία κειμένου textual data βλέπε μεταφορά εικόνων σαν attachments μέσω μηνυμάτων ηλεκτρονικού ταχυδρομείου). 2) Μεταφερθείτε στο terminal: a. πληκτρολογείστε την εντολή: openssl enc help και θα δείτε τις επιλογές που έχετε για χρήση κρυπτογραφικών αλγορίθμων. - 1 -
b. Κρυπτογραφείστε και αποκρυπτογραφείστε το αρχείο lab5.txt με τον συμμετρικό αλγόριθμο Blowfish. Ονομάστε το κρυπτογραφημένο αρχείο testbf.txt και το αποκρυπτογραφημένο testbfdec.txt. 3) Ο RSA είναι αλγόριθμος ασύμμετρης κρυπτογράφησης. Κατά την κρυπτογράφηση απαιτεί τη χρήση δημοσίου κλειδιού, ενώ κατά την αποκρυπτογράφηση τη χρήση ιδιωτικού κλειδιού. a. Με την εντολή: openssl genrsa out private.key 1024 θα δημιουργηθεί το ιδιωτικό κλειδί private.key του RSA μήκους 1024 bits. b. Για τη δημιουργία του δημόσιου κλειδιού public.pem από το ιδιωτικό κλειδί private.key που φτιάξαμε στο προηγούμενο βήμα θα πρέπει να δώσετε την εντολή: openssl rsa in private.key pubout out public.pem c. Κατασκευάστε και ένα 2 ο δημόσιο κλειδί public2.pem από το ίδιο ιδιωτικό private.key. d. Ανοίξτε με το WordPad τα αρχεία private.key, public.pem και public2.pem. Τί παρατηρείτε για τα public.pem και public2.pem, είναι αναμενόμενο; e. Για να κρυπτογραφήσουμε το lab5.txt θα χρησιμοποιήσουμε το public.pem. Η εντολή είναι: openssl rsautl encrypt inkey public.pem pubin in lab5.txt out testrsa.txt f. Για να αποκρυπτογραφήσουμε το testrsa.txt θα χρησιμοποιήσουμε το private.key. Η εντολή είναι: openssl rsautl decrypt inkey private.key in testrsa.txt out testrsadec.txt 4) Ανταλλάξτε σε ζεύγη μέσω mail με τον διπλανό σας τα δημόσια κλειδιά σας. Για να γίνει αυτό αντιγράψτε, επικολλείστε και μετονομάστε το public.pem σε publicid.pem, όπου ID ο αριθμός ταυτότητάς σας, για παράδειγμα public811765.pem. Στη συνέχεια στείλτε στο διπλανό σας, του οποίου το δημόσιου κλειδί έχετε, ένα επισυναπτόμενο κρυπτογραφημένο αρχείο με το δικό του δημόσιο κλειδί. Αντίστοιχα θα παραλάβει ο καθένας σας ένα κρυπτογραφημένο αρχείο με το δικό σας δημόσιο κλειδί. Αποκρυπτογραφείστε το με το private.key σας. 5) Χρησιμοποιώντας το private.key μπορείτε να υπογράψετε ψηφιακά ένα αρχείο. a. Με την εντολή: openssl rsautl sign inkey private.key in lab5.txt out testsigned.txt θα παραχθεί από το αρχείο lab4.txt το υπογεγραμμένο testsigned.txt. b. Με την εντολή: openssl rsautl verify inkey public.pem pubin in testsigned.txt out testverified.txt κάνετε επαλήθευση της ψηφιακής υπογραφής. 6) Υπογράψτε ένα αρχείο και στείλτε το μέσω mail στον διπλανό σας ο οποίος έχει το δικό σας δημόσιο κλειδί. Αντίστοιχα θα παραλάβει ο καθένας σας ένα υπογεγραμμένο αρχείο με το ιδιωτικό κλειδί του διπλανού του. Επαληθεύστε την υπογραφή με το δημόσιο κλειδί του διπλανού σας. - 2 -
OpenSSL 1024 bit RSA Private Key Breakdown (http://etherhack.co.uk/asymmetric/docs/rsa_key_breakdown.html) On Linux, using the following command generated this key: openssl genrsa -out rsa_1024_priv.pem 1024 To understand how the key is broken down into its respective components, execute the following additional command: openssl rsa -text -in rsa_1024_priv.pem Alternatively, you can do what I did and breakdown the individual components by hand - in order to learn how the data structure actually works. Firstly, the data block has to be decoded from it's standard Base64 format, so remove the "-----BEGIN..." lines at the start and end of the file and convert the data into Hexadecimal. The data block is now in a format we can read (sort of). Using Abstract Syntax Notation 1 (or ASN.1), we can read and identify the Distinguished Encoding Rules (DER) encoded components contained within this data. Although the only data stored in this instance of the ASN format is of type Integer, other standard variable types are listed here for clarity. When the Integer type is used in this context, it is followed by the length in bytes for the following data object, and then the data itself, as can be seen below. 0x02 == Integer 0x03 == Bit String 0x04 == Octet String 0x05 == NULL 0x06 == Object Identifier 0x10 == "Sequence" and "Sequence of" 0x11 == "Set" and "Set of" 0x13 == Printable String 0x14 == T61 String 0x16 == IA5 String 0x17 == UTC Time 0x30 82 == ASN1 Sequence 1024 bit RSA Private Key in Base64 Format -----BEGIN RSA PRIVATE KEY----- MIICXgIBAAKBgQDHikastc8+I81zCg/qWW8dMr8mqvXQ3qbPAmu0RjxoZVI47tvs kylfaxof0sprho2nuuoojngnhv0639itteyg1vcknaw2r6u5qtdq5rq5u+uv3pmk 7w7Vs4n3urQ6jnqt2rTXbC1DNa/PFeAZatbf7ffBBy0IGO0zc128IshYcwIDAQAB AoGBALTNl2JxTvq4SDW/3VH0fZkQXWH1MM10oeMbB2qO5beWb11FGaOO77nGKfWc bygfp5ogrql4yhbvlaxnxh8bcqqwortfhlyv68u1y4r+8wxdnh0aevxh8hrs/1x5 031DJm1JlU0E+vStiktN0tC3ebH5hE+1OxbIHSZ+WOWLYX7JAkEA5uigRgKp8ScG auuijvdolzihhwq7y5wz+nohuudw8p7wotku34qjaowee771p9pf/gta/kr0bqnp QvWUDxGzJwJBAN05C6krwPeryFKrKtjOGJIniIoY72wRnoNcdEEs3HDRhf48YWFo rirbzylzzznfy/gmzt6xjqtfktgqq+fzd9ucqgijagrxhjgfmpduahmzgsusyttr irox0d1iqa7dhe693t5abg010of6mlqdza1cxrn5srtuvvacslzel/2j5uccqqda d3mxucnnn4npus/l9hmyjwd7lpoosaorcgyk77bssngk+u9wsjbh1uyiaipsffuz bti+jc1dug5wb+aezlgjakeaurrpmpqj5vg087zngkffgr5rozditsk5dcetv97k a3y+nzl+xwtxdbwk4yph2zlkv402hzefwbyxudn5zkh/bw== -----END RSA PRIVATE KEY----- - 3 -
Private Key in Hexadecimal Format In this example, the Hexadecimal values have been paired for clarity, but in the other examples (see links at the top of this page) the values have not been separated. Parts highlighted below, in order: ASN.1 Header Algorithm Version Modulus Public Exponent Private Exponent prime1 prime2 exponent 1 exponent 2 coefficient -----BEGIN RSA PRIVATE KEY----- 30 82 02 5e 02 01 00 02 81 81 00 c7 8a 46 ac b5 cf 3e 23 cd 73 0a 0f ea 59 6f 1d 32 bf 26 aa f5 d0 de a6 cf 02 6b b4 46 3c 68 65 52 38 ee db ec 91 89 45 01 73 9f d2 c3 eb 84 ed a7 52 ea 28 26 78 27 1d 5d 3a df d8 93 4c 46 06 d6 f7 24 35 a5 b6 47 a5 39 41 37 50 e5 1a b9 bb eb 95 de 93 24 ef 0e d5 b3 89 f7 ba b4 3a 8e 7a ad da b4 d7 6c 2d 43 35 af cf 15 e0 19 6a d6 df ed f7 c1 07 2d 08 18 ed 33 73 5d bc 22 c8 58 73 02 03 01 00 01 02 81 81 00 b4 cd 97 62 71 4e fa b8 48 35 bf dd 51 f4 7d 99 10 5d 61 f5 30 cd 74 a1 e3 1b 07 6a 8e e5 b7 96 6f 5d 45 19 a3 8e ef b9 c6 29 f5 9c 6d 88 1f a7 93 a0 ae a9 78 ca 10 6f 2c 05 e7 c4 7f 1b 72 aa b0 39 1b 45 86 5c 95 eb c5 35 cb 84 7e f1 6c 43 36 1d 1a 7a fc 47 f2 14 52 ff 55 f9 d3 7d 43 26 6d 49 95 4d 04 fa f4 ad 8a 4b 4d d2 d0 b7 79 b1 f9 84 4f b5 3b 16 c8 1d 26 7e 58 e5 8b 61 7e c9 02 41 00 e6 e8 a0 46 02 a9 f1 27 06 6a e5 22 8e f7 4e 2d 92 21 1d 6a bb cb 95 b3 fa 73 87 52 e0 f0 f0 fe f0 39 32 94 df 84 09 02 85 84 7b be f5 a7 d3 df fc 64 c0 fe 4a f4 05 09 cf 42 f5 94 0f 11 b3 27 02 41 00 dd 39 0b a9 2b c0 f7 ab c8 52 ab 2a d8 ce 18 92 27 88 8a 18 ef 6c 11 9e 83 5c 74 41 2c dc 70 d1 85 fe 3c 61 61 68 ae 24 5b 67 29 73 cf 33 45 cb f8 26 cd 3e 97 25 04 df 92 d1 aa ab e1 59 0f d5 02 40 62 09 68 6a f1 1c 98 1f 9a 90 ee 02 13 33 1a c5 2c 62 d4 eb 89 1a 31 d0 3d 48 a9 ae dd 84 4e bd de de 5a 04 6d 35 d0 e1 7a 30 ba 9d 64 0d 42 5e b9 f9 49 1b 6e 55 56 82 48 b6 44 2f fd 89 e5 47 02 41 00 c0 77 73 17 b9 c3 67 37 83 4f b9 2f cb f4 73 18 25 60 fb 94 fa 28 b1 a3 91 72 0c 8a ef b6 d2 48 d8 24 fa ef 56 4a 36 c7 d6 e6 08 00 83 d2 7d f5 19 6e d8 be 8d cd 5d 52 0e 70 6f e6 9e 66 58 09 02 41 00 ba ba e9 9a 9a a3 e6 f8 34 f3 b6 67 80 a7 c5 19 1e 6b a3 30 e2 4e c2 b9 0d c7 93 57 de ca 6b 76 3e 37 39 7e 5d 64 f1 0c 15 a4 e1 83 e1 d9 99 4a bf 8d 36 85 91 1f 58 16 31 50 39 f9 66 41 ff 6f -----END RSA PRIVATE KEY----- Extracted Key Components, in order of appearance Private-Key: header: 30 82 02 5e (0x3082 == ASN.1 Sequence) 02 01 (0x02 == Integer and 0x01 == 1 byte long) algorithm version: 00 (0x00 == version zero) 02 81 81 (0x02 == Integer and 0x81 == 129 bytes long) - 4 -
modulus: (129 bytes - starts with a null (0x00), remove this.) 00 c7 8a 46 ac b5 cf 3e 23 cd 73 0a 0f ea 59 6f 1d 32 bf 26 aa f5 d0 de a6 cf 02 6b b4 46 3c 68 65 52 38 ee db ec 91 89 45 01 73 9f d2 c3 eb 84 ed a7 52 ea 28 26 78 27 1d 5d 3a df d8 93 4c 46 06 d6 f7 24 35 a5 b6 47 a5 39 41 37 50 e5 1a b9 bb eb 95 de 93 24 ef 0e d5 b3 89 f7 ba b4 3a 8e 7a ad da b4 d7 6c 2d 43 35 af cf 15 e0 19 6a d6 df ed f7 c1 07 2d 08 18 ed 33 73 5d bc 22 c8 58 73 02 03 (0x02 == Integer and 0x03 == 3 bytes long) public exponent: (3 bytes) 01 00 01 (Integer value 65537, Fermat Number F4) 02 81 81 (0x02 == Integer and 0x81 == 129 bytes long) private exponent: (129 bytes - starts with a null, remove this) 00 b4 cd 97 62 71 4e fa b8 48 35 bf dd 51 f4 7d 99 10 5d 61 f5 30 cd 74 a1 e3 1b 07 6a 8e e5 b7 96 6f 5d 45 19 a3 8e ef b9 c6 29 f5 9c 6d 88 1f a7 93 a0 ae a9 78 ca 10 6f 2c 05 e7 c4 7f 1b 72 aa b0 39 1b 45 86 5c 95 eb c5 35 cb 84 7e f1 6c 43 36 1d 1a 7a fc 47 f2 14 52 ff 55 f9 d3 7d 43 26 6d 49 95 4d 04 fa f4 ad 8a 4b 4d d2 d0 b7 79 b1 f9 84 4f b5 3b 16 c8 1d 26 7e 58 e5 8b 61 7e c9 prime1: (65 bytes - starts with a null, remove this) 00 e6 e8 a0 46 02 a9 f1 27 06 6a e5 22 8e f7 4e 2d 92 21 1d 6a bb cb 95 b3 fa 73 87 52 e0 f0 f0 fe f0 39 32 94 df 84 09 02 85 84 7b be f5 a7 d3 df fc 64 c0 fe 4a f4 05 09 cf 42 f5 94 0f 11 b3 27 prime2: (65 bytes - starts with a null, remove this) 00 dd 39 0b a9 2b c0 f7 ab c8 52 ab 2a d8 ce 18 92 27 88 8a 18 ef 6c 11 9e 83 5c 74 41 2c dc 70 d1 85 fe 3c 61 61 68 ae 24 5b 67 29 73 cf 33 45 cb f8 26 cd 3e 97 25 04 df 92 d1 aa ab e1 59 0f d5 02 40 (0x02 == Integer and 0x40 == 64 bytes long) exponent1: (64 bytes) 62 09 68 6a f1 1c 98 1f 9a 90 ee 02 13 33 1a c5 2c 62 d4 eb 89 1a 31 d0 3d 48 a9 ae dd 84 4e bd de de 5a 04 6d 35 d0 e1 7a 30 ba 9d 64 0d 42 5e b9 f9 49 1b 6e 55 56 82 48 b6 44 2f fd 89 e5 47 exponent2: (65 bytes - starts with a null, remove this) 00 c0 77 73 17 b9 c3 67 37 83 4f b9 2f cb f4 73 18 25 60 fb 94 fa 28 b1 a3 91 72 0c 8a ef b6 d2 48 d8 24 fa ef 56 4a 36 c7 d6 e6 08 00-5 -
83 d2 7d f5 19 6e d8 be 8d cd 5d 52 0e 70 6f e6 9e 66 58 09 coefficient: (65 bytes - always starts with a null) 00 ba ba e9 9a 9a a3 e6 f8 34 f3 b6 67 80 a7 c5 19 1e 6b a3 30 e2 4e c2 b9 0d c7 93 57 de ca 6b 76 3e 37 39 7e 5d 64 f1 0c 15 a4 e1 83 e1 d9 99 4a bf 8d 36 85 91 1f 58 16 31 50 39 f9 66 41 ff 6f OpenSSL 1024 bit RSA Public Key Breakdown Using Linux, the following command generated this public key: openssl rsa -pubout -in rsa_1024_priv.pem -out rsa_1024_pub.pem -----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDHikastc8+I81zCg/qWW8dMr8m qvxq3qbpamu0rjxozvi47tvskylfaxof0sprho2nuuoojngnhv0639itteyg1vck NaW2R6U5QTdQ5Rq5u+uV3pMk7w7Vs4n3urQ6jnqt2rTXbC1DNa/PFeAZatbf7ffB By0IGO0zc128IshYcwIDAQAB -----END PUBLIC KEY----- Public Key in Hexadecimal Format Parts in bold, in order: Modulus Public Exponent -----BEGIN PUBLIC KEY----- 30 81 9f 30 0d 06 09 2a 86 48 86 f7 0d 01 01 01 05 00 03 81 8d 00 30 81 89 02 81 81 00 c7 8a 46 ac b5 cf 3e 23 cd 73 0a 0f ea 59 6f 1d 32 bf 26 aa f5 d0 de a6 cf 02 6b b4 46 3c 68 65 52 38 ee db ec 91 89 45 01 73 9f d2 c3 eb 84 ed a7 52 ea 28 26 78 27 1d 5d 3a df d8 93 4c 46 06 d6 f7 24 35 a5 b6 47 a5 39 41 37 50 e5 1a b9 bb eb 95 de 93 24 ef 0e d5 b3 89 f7 ba b4 3a 8e 7a ad da b4 d7 6c 2d 43 35 af cf 15 e0 19 6a d6 df ed f7 c1 07 2d 08 18 ed 33 73 5d bc 22 c8 58 73 02 03 01 00 01 -----END PUBLIC KEY----- Extracted Public Key Components header: 30 81 9f 30 0d 06 09 2a 86 48 86 f7 0d 01 01 01 05 00 03 81 8d 00 30 81 89 02 81 81 modulus: 00 c7 8a 46 ac b5 cf 3e 23 cd 73 0a 0f ea 59 6f 1d 32 bf 26 aa f5 d0 de a6 cf 02 6b b4 46 3c 68 65 52 38 ee db ec 91 89 45 01 73 9f d2 c3 eb 84 ed a7 52 ea 28 26 78 27 1d 5d 3a df d8 93 4c 46 06 d6 f7 24 35 a5 b6 47 a5 39 41 37 50 e5 1a b9 bb eb 95 de 93 24 ef 0e d5 b3 89 f7 ba b4 3a 8e 7a ad da b4 d7 6c 2d 43 35 af cf 15 e0 19 6a d6 df ed f7 c1 07 2d 08 18-6 -
ed 33 73 5d bc 22 c8 58 73 02 03 public exponent: 01 00 01-7 -