Κάποια στιγμή, σύντομα ωστόσο, θα χρειαστεί να καταφύγουμε σε δύο σημαντικές ενέργειες:
- Να αφήσουμε στην άκρη τις μεθόδους κρυπτογράφησης δημοσίου κλειδιού, όπως τον RSA (παραγοντοποίηση πρώτων αριθμών), τις υπογραφές ElGamal (διακριτοί λογάριθμοι) και την κρυπτογραφία ελλειπτικών καμπύλων (elliptic curve cryptography – ECC), μιας και οι κβαντικοί υπολογιστές θα μπορούν να τις σπάσουν.
- Πρέπει να ξεκινήσουμε να δουλεύουμε πάνω στις κρυπτογραφημένες τιμές. Αυτό θα περιλαμβάνει τη χρήση της ομομορφικής κρυπτογράφησης (homomorphic encryption – HE). Με τον τρόπο αυτό, μπορούμε να έχουμε δύο τιμές, έστω a και b και, κρυπτογραφώντας τες με ένα δημόσιο κλειδί, να πάρουμε τις τιμές Epk(a) και Epk(b). Στη συνέχεια, μπορούμε να τις προσθέσουμε, ώστε να πάρουμε το Epk(a+b), και εν τέλει να χρησιμοποιήσουμε ένα ιδιωτικό κλειδί (secret key – sk) για να βρούμε το a+b.
Η Ομομορφική Κρυπτογράφηση στην Κατά Προσέγγιση Αριθμητική (Homomorphic Encryption for Arithmetic of Approximate Numbers – HEAAN) ορίζει μία βιβλιοθήκη ομομορφικής κρυπτογράφησης, που προτάθηκε το 2016 από τους Cheon, Kim, Kim και Song (CKKS) [δείτε εδώ]:

Η μέθοδος CKKS χρησιμοποεί την αριθμητική κατά προσέγγιση, στο πεδίο των μιγαδικών αριθμών. Ως πρώην ηλεκτρολόγος μηχανικός, σε έναν μιγαδικό αριθμό αναγνωρίζω το πραγματικό μέρος (x) και το φανταστικό μέρος (y). Έτσι, έχουμε τον αριθμό x+jy (προσέξτε ότι σε άλλους τομείς, πέραν της επιστήμης του ηλεκτρολόγου μηχανικού, ορίζεται x+iy). Η κρυπτογράφηση HEAAN μπορεί να χρησιμοποιηθεί για ομομορφική πρόσθεση και πολλαπλασιασμό, συμπεριλαμβανομένου του βαθμωτού πολλαπλασιασμού, και χρησιμοποιεί μία μέθοδο RLWE [δείτε εδώ].
Στον ακόλουθο κώδικα, θα μετατρέψουμε χαρακτήρες ASCII στην ισοδύναμη ακέραια τιμή τους (π.χ. 97 για τον χαρακτήρα ‘a’) και εν συνεχεία θα την μετατρέψουμε σε μιγαδικό αριθμό (97+i97). Έπειτα, θα δημιουργήσουμε ένα ζεύγος κλειδιών, το ένα δημόσιο (public key – pk) και το άλλο ιδιωτικό (private key – sk). Ακολουθεί ο κώδικας που έχει γραφεί χρησιμοποιώντας τη βιβλιοθήκη Lattigo [δείτε εδώ]:
package main import ( "fmt" "github.com/ldsec/lattigo/ckks" "math" "os" ) func main() { var logN, logQ, levels, scale uint64 // Scheme params logN = 10 logQ = 30 levels = 8 scale = logQ sigma := 3.19 str:="abc" argCount := len(os.Args[1:]) if (argCount>0) {str= string(os.Args[1])} // Context var ckkscontext *ckks.CkksContext ckkscontext, _ = ckks.NewCkksContext(logN, logQ, scale, levels, sigma) kgen := ckkscontext.NewKeyGenerator() // Keys var sk *ckks.SecretKey var pk *ckks.PublicKey sk, pk, _ = kgen.NewKeyPair() // Encryptor var encryptor *ckks.Encryptor encryptor, _ = ckkscontext.NewEncryptor(pk) // Decryptor var decryptor *ckks.Decryptor decryptor, _ = ckkscontext.NewDecryptor(sk) // Values to encrypt values := make([]complex128, 1<<(logN-1)) for i := 0; i < len(str); i++ { val := float64(int(str[i])) values[i] = complex(val, val) } fmt.Printf("HEAAN parameters : logN = %d, logQ = %d, levels = %d (%d bits), logPrecision = %d, logScale = %d, sigma = %f \n", logN, logQ, levels, 60+(levels-1)*logQ, ckkscontext.Precision(), scale, sigma) // Plaintext creation and encoding process plaintext := ckkscontext.NewPlaintext(levels-1, scale) plaintext.EncodeComplex(values) // Encryption process var ciphertext *ckks.Ciphertext ciphertext, _ = encryptor.EncryptNew(plaintext) // Decryption process plaintext, _ = decryptor.DecryptNew(ciphertext) // Decoding process valuesTest := plaintext.DecodeComplex() fmt.Printf("\nInput: %s", str) fmt.Printf("\nCipher: %v\n\nDecrypted: ", ciphertext) for i := 0; i < len(str); i++ { ch:=int(math.Round(real(valuesTest[i]))) fmt.Printf("%s", string(ch)) } }
Μία εκτέλεση του κώδικα επιστρέφει τα παρακάτω [δείτε εδώ]:
HEAAN parameters : logN = 10, logQ = 30, levels = 8 (270 bits), logPrecision = 13, logScale = 30, sigma = 3.190000 Input: qwerty Cipher: &{[0xc00012b4c0 0xc00012b4e0] 0xc0000962c0 30 0xc00012b500 true false} qwerty
Ας δούμε τώρα την ομομορφική πρόσθεση:
Και τον βαθμωτό πολλαπλασιασμό μίας κρυπτογραφημένης τιμής:
Εάν σας ενδιαφέρει, εδώ μπορείτε να δείτε το υπόβαθρο των πράξεων:
Γράφει ο: Prof Bill Buchanan OBE
Επιμέλεια: Christos Loizos, Christos Katsandris
Πηγή: medium.com