Skip to content

Instantly share code, notes, and snippets.

@arc279
Created October 7, 2023 01:08
Show Gist options
  • Save arc279/36bac835af95dece530cb8194bcd9536 to your computer and use it in GitHub Desktop.
Save arc279/36bac835af95dece530cb8194bcd9536 to your computer and use it in GitHub Desktop.
lattigo/ckks の鍵を base64 文字列と相互変換するやつ
package main
import (
"encoding/base64"
"fmt"
"github.com/tuneinsight/lattigo/v4/ckks"
"github.com/tuneinsight/lattigo/v4/rlwe"
)
func keyToString(key interface {
MarshalBinary() ([]byte, error)
}) (string, error) {
bs, err := key.MarshalBinary()
if err != nil {
return "", err
}
b64s := base64.StdEncoding.EncodeToString(bs)
return b64s, nil
}
type rlweKeys = interface {
rlwe.SecretKey | rlwe.PublicKey | rlwe.RotationKeySet | rlwe.RelinearizationKey
}
func keyFromString[T rlweKeys, PT interface {
UnmarshalBinary([]byte) error
*T
}](b64s string) (PT, error) {
bs, err := base64.StdEncoding.DecodeString(b64s)
if err != nil {
return nil, err
}
var key T
err = PT(&key).UnmarshalBinary(bs)
if err != nil {
return nil, err
}
return &key, nil
}
func main() {
params, err := ckks.NewParametersFromLiteral(ckks.PN14QP438)
if err != nil {
panic(err)
}
kgen := ckks.NewKeyGenerator(params)
sk, pk := kgen.GenKeyPair()
skEnc, err := keyToString(sk)
if err != nil {
panic(err)
}
fmt.Println(len(skEnc))
fmt.Println(keyFromString[rlwe.SecretKey](skEnc))
pkEnc, err := keyToString(pk)
if err != nil {
panic(err)
}
fmt.Println(len(pkEnc))
fmt.Println(keyFromString[rlwe.PublicKey](pkEnc))
rotations := []int{}
for i := 1; i < params.N(); i <<= 1 {
rotations = append(rotations, i)
}
rotKey := kgen.GenRotationKeysForRotations(rotations, true, sk)
rotEnc, err := keyToString(rotKey)
if err != nil {
panic(err)
}
fmt.Println(len(rotEnc))
fmt.Println(keyFromString[rlwe.RotationKeySet](rotEnc))
rlk := kgen.GenRelinearizationKey(sk, 1)
rlEnc, err := keyToString(rlk)
if err != nil {
panic(err)
}
fmt.Println(len(rlEnc))
fmt.Println(keyFromString[rlwe.RelinearizationKey](rlEnc))
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment