콘텐츠로 이동

GL (Matrix) Quickstart

이 페이지에서는 GL 동형암호를 이용하여 데이터를 암호화하고 복호화하는 방법과, 암호화된 데이터에 대해 덧셈, 뺄셈, 행렬 곱셈, 아다마르 곱셈과 같은 간단한 연산을 수행하는 방법을 배울 수 있습니다. 구글 Colab에서 코드를 직접 수행해볼 수 있습니다.

암호화 / 복호화

암호화와 복호화는 비밀 키를 사용하여 수행됩니다. 다음과 같이 간단히 데이터를 암호화 후 복호화 할 수 있습니다.

import numpy as np
from desilofhe import GLEngine

engine = GLEngine()

secret_key = engine.create_secret_key()

data = np.ones(engine.shape)
encrypted = engine.encrypt(data, secret_key)
decrypted = engine.decrypt(encrypted, secret_key)

print(decrypted[0])  # ones

덧셈 / 뺄셈

암호문의 덧셈 및 뺄셈에는 비밀 키 이외의 키가 필요하지 않습니다. 다음과 같이 데이터를 각각 암호화한 후 덧셈과 뺄셈을 할 수 있습니다.

import numpy as np
from desilofhe import GLEngine

engine = GLEngine()

secret_key = engine.create_secret_key()

data1 = np.ones(engine.shape) * 2
encrypted1 = engine.encrypt(data1, secret_key)

data2 = np.ones(engine.shape)
encrypted2 = engine.encrypt(data2, secret_key)

added = engine.add(encrypted1, encrypted2)
subtracted = engine.subtract(encrypted1, encrypted2)

decrypted1 = engine.decrypt(added, secret_key)
decrypted2 = engine.decrypt(subtracted, secret_key)

print(decrypted1[0])  # [3. 3. 3.]
print(decrypted2[0])  # [1. 1. 1.]

행렬 곱셈

행렬 곱셈은 행렬 곱셈 키라는 특수한 키가 필요합니다. 다음과 같이 데이터를 각각 암호화한 후 곱셈을 할 수 있습니다. 동형암호의 암호문은 최대곱셈횟수가 존재하기 때문에, 곱셈의 결과 암호문은 레벨이 하나 떨어진 것을 확인할 수 있습니다.

import numpy as np
from desilofhe import GLEngine

engine = GLEngine()

secret_key = engine.create_secret_key()
matrix_multiplication_key = engine.create_matrix_multiplication_key(secret_key)

data1 = np.ones(engine.shape)
encrypted1 = engine.encrypt(data1, secret_key)

data2 = np.ones(engine.shape)
encrypted2 = engine.encrypt(data2, secret_key)

multiplied = engine.matrix_multiply(
    encrypted1, encrypted2, matrix_multiplication_key
)

decrypted = engine.decrypt(multiplied, secret_key)

print(decrypted[0])  # [32. 32. 32.]
print(encrypted1.level, encrypted2.level, multiplied.level)  # 6 6 5

아다마르 곱셈

아다마르 곱셈은 아다마르 곱셈 키라는 특수한 키가 필요합니다. 다음과 같이 데이터를 각각 암호화한 후 곱셈을 할 수 있습니다. 동형암호의 암호문은 최대곱셈횟수가 존재하기 때문에, 곱셈의 결과 암호문은 레벨이 하나 떨어진 것을 확인할 수 있습니다.

import numpy as np
from desilofhe import GLEngine

engine = GLEngine()

secret_key = engine.create_secret_key()
hadamard_multiplication_key = engine.create_hadamard_multiplication_key(
    secret_key
)

data1 = np.ones(engine.shape) * 2  # [2. 2. 2.]
encrypted1 = engine.encrypt(data1, secret_key)

data2 = np.ones(engine.shape) * 2  # [2. 2. 2.]
encrypted2 = engine.encrypt(data2, secret_key)

multiplied = engine.hadamard_multiply(
    encrypted1, encrypted2, hadamard_multiplication_key
)

decrypted = engine.decrypt(multiplied, secret_key)

print(decrypted[0])  # [4. 4. 4.]
print(encrypted1.level, encrypted2.level, multiplied.level)  # 6 6 5