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