Κάποια στιγμή, σύντομα ωστόσο, θα χρειαστεί να καταφύγουμε σε δύο σημαντικές ενέργειες:
- Να αφήσουμε στην άκρη τις μεθόδους κρυπτογράφησης δημοσίου κλειδιού, όπως τον 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

