Υποστήριξη ελλειπτικών καμπυλών (ECC)#

Το RSA-2048 γίνεται όλο και πιο ανασφαλές#

Για λόγους ασφαλείας, το γερμανικό Ομοσπονδιακό Γραφείο για την Ασφάλεια των Πληροφοριών (Bundesamt für Sicherheit in der Informationstechnik, BSI) δεν συνιστά πλέον τη χρήση κλειδιών RSA μήκους 2048 bit μετά το 2022. Αυτό σημαίνει ότι θα πρέπει να αρχίσουν να χρησιμοποιούνται μεγαλύτερα κλειδιά στο ορατό μέλλον. Υποθέτοντας μια περίοδο χρήσης πέντε ετών, είναι ήδη απαραίτητο να δημιουργηθούν μεγαλύτερα κλειδιά. Ωστόσο, τα μεγαλύτερα κλειδιά RSA με 3072 bit ή 4096 bit είναι σημαντικά πιο αργά. Για το λόγο αυτό, τα νέα Nitrokey Storage 2 και Pro 2 (αντίστοιχα, η ενσωματωμένη κάρτα OpenPGP έκδοση 3.3) υποστηρίζει κρυπτογράφηση μέσω κρυπτογραφίας ελλειπτικής καμπύλης (ECC). Η μέθοδος αυτή θεωρείται εξίσου ασφαλής με μικρότερα κλειδιά ECC όσο και με μεγαλύτερα κλειδιά RSA και είναι επίσης σημαντικά ταχύτερη.

Βασικά στοιχεία της κρυπτογραφίας ελλειπτικών καμπυλών#

Σε αντίθεση με τον RSA, υπάρχουν πολλές διαφορετικές μορφές (οι λεγόμενες καμπύλες) της κρυπτογραφίας ελλειπτικών καμπυλών. Ειδικότερα, η NSA συμμετείχε στην ανάπτυξη των καμπυλών NIST. Ακόμη και αν δεν υπάρχουν ενδείξεις για κερκόπορτες στις καμπύλες, η χρήση μιας συγκεκριμένης καμπύλης μπορεί να θέσει ζήτημα εμπιστοσύνης. Ευτυχώς τα νέα Nitrokey Storage 2 και Pro 2 υποστηρίζουν δύο είδη καμπυλών, δηλαδή τις καμπύλες NIST και Brainpool. Στη συνέχεια θα χρησιμοποιήσουμε τις καμπύλες Brainpool. Αυτό το άρθρο παρέχει ένα καλό σημείο εισόδου για την απόκτηση μιας γενικής κατανόησης της κρυπτογραφίας ελλειπτικών καμπυλών.

Απαιτήσεις συστήματος#

Για να δημιουργήσετε κλειδιά που βασίζονται σε ελλειπτικές καμπύλες απαιτείται ένα Nitrokey Storage 2 / Pro 2 και η έκδοση 2.1.17 ή νεότερη του GnuPG.

Μπορείτε να διαβάσετε την έκδοση της κάρτας OpenPGP του Nitrokey μέσω gpg2 --card-status:

> gpg2 --card-status
Reader ...........: 20A0:...
Application ID ...: D276...
Version ..........: 3.3
...

Το πεδίο “Έκδοση” αντιπροσωπεύει την έκδοση της κάρτας OpenPGP που είναι ενσωματωμένη στο Nitrokey - σε αυτή την περίπτωση είναι η έκδοση 3.3, όπως απαιτείται για την κρυπτογραφία ελλειπτικής καμπύλης. Η έκδοση 2.2 της κάρτας OpenPGP δεν υποστηρίζει ECC.

Μπορείτε να ενημερωθείτε για την εγκατεστημένη έκδοση του GnuPG μέσω του gpg2  --version. Απαιτείται τουλάχιστον η έκδοση 2.1.16. Η νεότερη έκδοση του GnuPG για Windows μπορεί να βρεθεί εδώ και η νεότερη έκδοση για MacOS μπορεί να βρεθεί εδώ. Μια κατάλληλη έκδοση του GnuPG περιλαμβάνεται στις διανομές GNU/Linux Ubuntu (από την έκδοση 18.04), Debian (από την έκδοση Stretch και μετά), Arch Linux, Fedora (από την έκδοση 26 και μετά) και openSUSE Tumbleweed. Στο τέλος αυτού του άρθρου υπάρχουν οδηγίες για το πώς να ενημερώσετε χειροκίνητα το GnuPG σε παλαιότερες εκδόσεις του Ubuntu.

Σημαντικό

Το GnuPG 2.0 εξακολουθεί να χρησιμοποιείται, αλλά η υποστήριξή του έχει διακοπεί το 2017. Όλοι οι συνεργάτες επικοινωνίας πρέπει να χρησιμοποιούν το GnuPG 2.1 ή νεότερο για την κρυπτογράφηση ηλεκτρονικού ταχυδρομείου μέσω ECC, διαφορετικά ενδέχεται να προκύψουν προβλήματα ασυμβατότητας. Επομένως, θα πρέπει να χρησιμοποιείτε το ECC μόνο εάν είστε σίγουροι ότι θα μπορέσετε να παρακάμψετε αυτό το πρόβλημα.

Δημιουργία κλειδιών στο Nitrokey Storage 2 / Pro 2#

Μόλις πληρούνται αυτές οι προϋποθέσεις, μπορείτε να ξεκινήσετε. (Προειδοποίηση: τα υπάρχοντα κλειδιά θα αντικατασταθούν κατά τη διαδικασία!) Έχετε τώρα δύο επιλογές. Η πρώτη επιλογή είναι να δημιουργήσετε το κλειδί απευθείας στο Nitrokey Storage 2 / Pro 2. Το πλεονέκτημα εδώ είναι ότι το κλειδί δεν θα βρίσκεται ποτέ εκτός της συσκευής και ως εκ τούτου δεν θα μπορεί ποτέ να διαβαστεί. Η δεύτερη επιλογή είναι η εισαγωγή ενός κλειδιού που έχει δημιουργηθεί προηγουμένως τοπικά. Το πλεονέκτημα σε αυτή την περίπτωση είναι ότι μπορείτε να αποθηκεύσετε με ασφάλεια ένα αντίγραφο ασφαλείας του κλειδιού, το οποίο μπορεί στη συνέχεια να αποκατασταθεί σε περίπτωση απώλειας του Nitrokey. Παρακάτω περιγράφεται μόνο η πρώτη επιλογή. Για να δημιουργήσετε ένα κλειδί με αντίγραφο ασφαλείας, μπορείτε να αποκτήσετε πρόσβαση στις ακόλουθες οδηγίες και να χρησιμοποιήσετε αυτές τις γενικές πληροφορίες για να μεταφέρετε το κλειδί στο Nitrokey.

Μέσα στο GnuPG υπάρχει ήδη η εντολή «generate», η οποία μπορεί να χρησιμοποιηθεί για την εύκολη δημιουργία κλειδιών στη συσκευή. Ωστόσο, δεν είναι ακόμη δυνατή η άμεση επιλογή του τύπου του κλειδιού, οπότε το κλειδί πρέπει πρώτα να προετοιμαστεί. Για το σκοπό αυτό χρησιμοποιούμε τις ακόλουθες εντολές:

> gpg-connect-agent "SCD SETATTR KEY-ATTR --force 1 19 brainpoolP256r1" /bye
> gpg-connect-agent "SCD SETATTR KEY-ATTR --force 2 18 brainpoolP256r1" /bye
> gpg-connect-agent "SCD SETATTR KEY-ATTR --force 3 19 brainpoolP256r1" /bye

Εναλλακτικά, θα μπορούσαν να επιλεγούν άλλες καμπύλες, όπως περιγράφεται στην επόμενη ενότητα.

Τώρα πληκτρολογούμε gpg2 --card-edit και βλέπουμε ότι το brainpoolP256r1 βρίσκεται στο πεδίο «key attributes» αντί για το rsa2048.

> gpg2 --card-edit
Reader ...........: 20A0:4109:0000000000000:0
Application ID ...: D276000124010303000500005F100000
Version ..........: 3.3
Manufacturer .....: ZeitControl
Serial number ....: 00005F10
Name of cardholder: [not set]
Language prefs ...: [not set]
Sex ..............: unspecified
URL of public key : [not set]
Login data .......: [not set]
Signature PIN ....: forced
Key attributes ...: brainpoolP256r1 brainpoolP256r1 brainpoolP256r1
Max. PIN lengths .: 64 64 64
PIN retry counter : 3 0 3
Signature counter : 0
Signature key ....: [none]
Encryption key....: [none]
Authentication key: [none]
General key info..: [none]

Στη συνέχεια δημιουργούμε το κλειδί.

gpg/card> admin
Admin commands are allowed

gpg/card> generate
Make off-card backup of encryption key? (Y/n) n
Please note that the factory settings of the PINs are
PIN = '123456' Admin PIN = '12345678'
You should change them using the command --change-pin
Please specify how long the key should be valid.
0 = key does not expire
<n> = key expires in n days
<n>w = key expires in n weeks
<n>m = key expires in n months
<n>y = key expires in n years
Key is valid for? (0)
Key does not expire at all
Is this correct? (y/N) y
GnuPG needs to construct a user ID to identify your key.
Real name: Jane Doe
Email address: jane.doe@example.org
Comment:
You selected this USER-ID:
"Jane Doe <jane.doe@example.org>"
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
gpg: key 7F8C68E1B084E169 marked as ultimately trusted
gpg: revocation certificate stored as '/home/jane/.gnupg/openpgp-revocs.d/F8C00BC1636A7D7604A31A877F8C68E1B084E169.rev'
public and secret key created and signed.

Το κλειδί Nitrokey ενσωματώνει τώρα κρυπτογραφία ελλειπτικής καμπύλης αντί για κλειδιά RSA και μπορεί να χρησιμοποιηθεί κανονικά.

Διαθέσιμες καμπύλες#

Στην παραπάνω διαδικασία επιλέξαμε τις καμπύλες Brainpool. Εναλλακτικά, μπορούν να χρησιμοποιηθούν οι καμπύλες NIST. Η διαμόρφωση πραγματοποιείται ως εξής:

> gpg-connect-agent "SCD SETATTR KEY-ATTR --force 1 19 nistp256" /bye
> gpg-connect-agent "SCD SETATTR KEY-ATTR --force 2 18 nistp256" /bye
> gpg-connect-agent "SCD SETATTR KEY-ATTR --force 3 19 nistp256" /bye

Ενημέρωση του GnuPG στο Ubuntu#

Τα παρακάτω βήματα είναι απαραίτητα μόνο αν χρησιμοποιείτε έκδοση Ubuntu παλαιότερη από 18.04. Μπορείτε να εγκαταστήσετε το GnuPG 2.1.18 σε ένα τέτοιο σύστημα με τις παρακάτω εντολές. Αυτό περιλαμβάνει νεότερα πακέτα Debian, τα οποία είναι η ευκολότερη επιλογή. Αυτή η προσέγγιση έχει δοκιμαστεί με επιτυχία στο Ubuntu 17.10 και πιθανώς λειτουργεί και στην 16.04. Ωστόσο, δεν μπορεί να αποκλειστεί η εμφάνιση προβλημάτων κατά τη χρήση.

$ mkdir gnupg_tmp
$ cd gnupg_tmp
$ wget http://ftp.debian.org/debian/pool/main/g/gnupg2/gnupg_2.1.18-8~deb9u1_amd64.deb
$ wget http://ftp.debian.org/debian/pool/main/g/gnupg2/dirmngr_2.1.18-8~deb9u1_amd64.deb
$ wget http://ftp.debian.org/debian/pool/main/g/gnupg2/gnupg-agent_2.1.18-8~deb9u1_amd64.deb
$ wget http://ftp.debian.org/debian/pool/main/g/gnupg2/scdaemon_2.1.18-8~deb9u1_amd64.deb
$ sudo dpkg -i *
$ cd ..
$ rm -rf gnupg_tmp

Σε περίπτωση που θέλετε να αναιρέσετε την εγκατάσταση, πρέπει να εκτελέσετε τις ακόλουθες εντολές:

$ sudo dpkg --remove --force-depends gnupg dirmngr gnupg-agent scdaemon
  # (removes manually installed packages)
$ sudo apt-get install gnupg dirmngr gnupg-agent scdaemon
  # (installs the appropriate packages from regular package repositories)