Created
October 7, 2023 01:08
-
-
Save arc279/36bac835af95dece530cb8194bcd9536 to your computer and use it in GitHub Desktop.
lattigo/ckks の鍵を base64 文字列と相互変換するやつ
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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