Ομομορφική Κρυπτογράφηση στην αριθμητική των Κατά Προσέγγιση αριθμών!

Κάποια στιγμή, σύντομα ωστόσο, θα χρειαστεί να καταφύγουμε σε δύο σημαντικές ενέργειες:

  1. Να αφήσουμε στην άκρη τις μεθόδους κρυπτογράφησης δημοσίου κλειδιού, όπως τον RSA (παραγοντοποίηση πρώτων αριθμών), τις υπογραφές ElGamal (διακριτοί λογάριθμοι) και την κρυπτογραφία ελλειπτικών καμπύλων (elliptic curve cryptography – ECC), μιας και οι κβαντικοί υπολογιστές θα μπορούν να τις σπάσουν.
  2. Πρέπει να ξεκινήσουμε να δουλεύουμε πάνω στις κρυπτογραφημένες τιμές. Αυτό θα περιλαμβάνει τη χρήση της ομομορφικής κρυπτογράφησης (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) [δείτε εδώ]:

Image for post

Η μέθοδος 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

Leave a Reply