콘텐츠로 이동

Quickstart

암호화 / 복호화

암호화 및 복호화를 할 때에는 각각 공개 키와 비밀 키가 필요합니다. 공개 키는 비밀 키를 기반으로 만들 수 있습니다. 다음과 같이 간단히 데이터를 암호화 후 복호화 할 수 있습니다. 참고로 CKKS는 실수 기반이라, 암복호화를 하는 것 만으로도 아주 작은 에러가 추가됩니다.

from desilofhe import Engine

engine = Engine()

secret_key = engine.create_secret_key()
public_key = engine.create_public_key(secret_key)

data = [1, 2, 3]
encrypted = engine.encrypt(data, public_key)
decrypted = engine.decrypt(encrypted, secret_key)

print(decrypted[:3]) # [1. 2. 3.]

덧셈 / 뺄셈

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

from desilofhe import Engine

engine = Engine()

secret_key = engine.create_secret_key()
public_key = engine.create_public_key(secret_key)

data1 = [1, 2, 3]
encrypted1 = engine.encrypt(data1, public_key)

data2 = [4, 5, 6]
encrypted2 = engine.encrypt(data2, public_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[:3], decrypted2[:3]) # [5. 7. 9.] [-3. -3. -3.]

곱셈

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

from desilofhe import Engine

engine = Engine()

secret_key = engine.create_secret_key()
public_key = engine.create_public_key(secret_key)
relinearization_key = engine.create_relinearization_key(secret_key)

data1 = [1, 2, 3]
encrypted1 = engine.encrypt(data1, public_key)

data2 = [4, 5, 6]
encrypted2 = engine.encrypt(data2, public_key)

multiplied = engine.multiply(encrypted1, encrypted2, relinearization_key)

decrypted = engine.decrypt(multiplied, secret_key)

print(decrypted[:3])
print(encrypted1.level, encrypted2.level, multiplied.level) # [ 4.          9.99999999 17.99999998]

SEAL 방식

위의 예제들은 사용 편의성을 위해서 여러가지 연산들을 하나의 함수로 합쳐둔 형태의 예시들입니다. 종래의 동형암호 라이브러리들이 익숙한 경우에는 비슷한 형태의 API 호출도 가능합니다. 중간결과값들을 재사용하는 경우에는 이 형태가 좀 더 효율적일 수도 있습니다.

from desilofhe import Engine

engine = Engine()

secret_key = engine.create_secret_key()
public_key = engine.create_public_key(secret_key)
relinearization_key = engine.create_relinearization_key(secret_key)

data1 = [1, 2, 3]
encoded1 = engine.encode(data1)
encrypted1 = engine.encrypt(encoded1, public_key)

data2 = [4, 5, 6]
encoded2 = engine.encode(data2)
encrypted2 = engine.encrypt(encoded2, public_key)

rescaled1 = engine.rescale(encrypted1)
rescaled2 = engine.rescale(encrypted2)
multiplied = engine.multiply(rescaled1, rescaled2)
relinearized = engine.relinearize(multiplied, relinearization_key)

decrypted_plaintext = engine.decrypt_to_plaintext(relinearized, secret_key)
decrypted = engine.decode(decrypted_plaintext)

print(decrypted[:3])