다자간 연산
다자간 계산은 여러 사용자가 각자의 비밀 키를 가지고 계산에 참여할 수 있도록 해줍니다. 각 당사자는 자신만의 비밀 키를 보유하고 있으며, 암호화된 데이터를 복호화하기 위해서는 모든 비밀 키가 필요합니다. 이는 데이터가 노출될 위험 없이 협업 기반의 데이터 처리를 가능하게 합니다. 이 문서는 다자간 계산을 수행하는 방법을 단계별로 설명합니다. 구글 Colab에서 코드를 직접 수행해볼 수 있습니다.
A. 다자간 연산 시 비밀 키 생성
다자간 연산을 할 때에도, 비밀 키는 기존 방식과 동일하게 생성됩니다. 사용자가 2명일 때 비밀 키 생성은 다음과 같습니다. 이 비밀 키는 아무에게도 공유되어선 안됩니다.
Step 1: 사용자 1이 비밀 키를 생성합니다.
from desilofhe import Engine
engine1 = Engine(use_multiparty=True)
secret_key1 = engine1.create_secret_key()
Step 2: 사용자 2가 비밀 키를 생성합니다.
from desilofhe import Engine
engine2 = Engine(use_multiparty=True)
secret_key2 = engine2.create_secret_key()
B. 다자간 연산 시 공개 키 생성
다자간 연산에서 공개 키는 기존 방식과 다르게 생성됩니다. 모든 사용자가 공용으로 쓰는 공개 키 A를 생성하고, 각 파티는 공용 공개 키 A와 개인 비밀 키를 이용하여 각자 공개 키 B를 생성해서 서로 공유하게 됩니다. 그러면 최종적으로 공개 키 A와 공유받은 모든 공개 키 B를 이용하여 공용 공개 키를 생성할 수 있습니다.
Step 1: 중개자가 공개 키 A를 생성합니다.
from desilofhe import Engine
common_engine = Engine(use_multiparty=True)
public_key_a = common_engine.create_public_key_a()
Step 2: 사용자 1이 비밀 키와 공개 키 B를 생성합니다.
from desilofhe import Engine
engine1 = Engine(use_multiparty=True)
secret_key1 = engine1.create_secret_key()
public_key_b1 = engine1.create_public_key_b(secret_key1, public_key_a)
Step 3: 사용자 2가 비밀 키와 공개 키 B를 생성합니다.
from desilofhe import Engine
engine2 = Engine(use_multiparty=True)
secret_key2 = engine2.create_secret_key()
public_key_b2 = engine2.create_public_key_b(secret_key2, public_key_a)
Step 4: 중개자가 공용 공개 키를 생성합니다.
public_key = common_engine.create_multiparty_public_key(
[public_key_b1, public_key_b2], public_key_a
)
다자간 연산 시 암호화 / 복호화
다자간 연산에서는 공용 공개 키를 이용하여 암호화를 합니다. 복호화를 할 때는 사용자들의 비밀 키가 노출되지 않아야 하기 때문에, 각자 비밀 키를 이용하여 복호화 조각을 생성해서 서로 공유하게 됩니다. 공유받은 모든 복호화 조각을 이용하여 복호화를 할 수 있습니다.
Step 1 ~ Step 4: B의 공개 키 생성 과정과 동일합니다.
Step 5: 사용자 1이 공용 공개 키를 이용하여 암호화합니다.
Step 6: 사용자 1이 비밀 키를 이용하여 복호화 조각을 생성합니다.
Step 7: 사용자 2가 비밀 키를 이용하여 복호화 조각을 생성합니다.
Step 8: 중개자가 복호화 조각들을 이용하여 복호화합니다.
C. 다자간 연산 시 재선형화 키 생성
공용 공개 키를 이용하여 각자 개인 재선형화 키를 생성해서 서로 공유하게 됩니다. 그러면 최종적으로 공유받은 모든 개인 재선형화 키를 이용하여 공용 재선형화 키를 생성할 수 있습니다.
Step 1 ~ Step 4: B의 공개 키 생성 과정과 동일합니다.
Step 5: 사용자 1이 개인 재선형화 키를 생성합니다.
Step 6: 사용자 2가 개인 재선형화 키를 생성합니다.
Step 7: 중개자가 공용 재선형화 키를 생성합니다.
relinearization_key = common_engine.create_multiparty_relinearization_key(
[relinearization_key1, relinearization_key2]
)
다자간 연산 시 곱셈
다자간 연산에서 암호문 간 곱셈을 할 때는 공용 재선형화 키를 사용해서 재선형화를 해야합니다. 이는 재선형화 뿐만 아니라 회전, 켤레화에도 모두 적용됩니다.
Step 1 ~ Step 4: B의 공개 키 생성 과정과 동일합니다.
Step 5 ~ Step 7: C의 재선형화 키 생성 과정과 동일합니다.
Step 8: 사용자 1이 공용 공개 키를 이용하여 암호화합니다.
Step 9: 사용자 2이 공용 공개 키를 이용하여 암호화합니다.
Step 10: 두 암호문을 곱하고, 공용 재선형화 키를 이용하여 재선형화 합니다.
중개자나 모든 사용자를 포함해서 누구든지 이 연산을 수행할 수 있습니다. 이 예시에서는 사용자 1이 곱셈을 수행합니다.
Step 11: 사용자 1이 비밀 키를 이용하여 복호화 조각을 생성합니다.
Step 12: 사용자 2가 비밀 키를 이용하여 복호화 조각을 생성합니다.
Step 13: 중개자가 복호화 조각들을 이용하여 복호화합니다.
D. 다자간 연산 시 고정 회전 키 생성
공용 공개 키를 이용하여 각자 개인 고정 회전 키를 생성해서 서로 공유하게 됩니다. 그러면 최종적으로 공유받은 모든 개인 고정 회전 키를 이용하여 공용 고정 회전 키를 생성할 수 있습니다.
Step 1 ~ Step 4: B의 공개 키 생성 과정과 동일합니다.
Step 5: 사용자 1이 개인 고정 회전 키를 생성합니다.
fixed_rotation_key1 = engine1.create_individual_fixed_rotation_key(
secret_key1, public_key, delta=2
)
Step 6: 사용자 2가 개인 고정 회전 키 키를 생성합니다.
fixed_rotation_key2 = engine2.create_individual_fixed_rotation_key(
secret_key2, public_key, delta=2
)
Step 7: 중개자가 공용 고정 회전 키 키를 생성합니다.
fixed_rotation_key = common_engine.create_multiparty_fixed_rotation_key(
[fixed_rotation_key1, fixed_rotation_key2]
)
E. 다자간 연산 시 회전 키 생성
공용 공개 키를 이용하여 각자 개인 회전 키를 생성해서 서로 공유하게 됩니다. 그러면 최종적으로 공유받은 모든 개인 회전 키를 이용하여 공용 회전 키를 생성할 수 있습니다.
Step 1 ~ Step 4: B의 공개 키 생성 과정과 동일합니다.
Step 5: 사용자 1이 개인 회전 키를 생성합니다.
Step 6: 사용자 2가 개인 회전 키 키를 생성합니다.
Step 7: 중개자가 공용 회전 키 키를 생성합니다.
F. 다자간 연산 시 켤레화 키 생성
공용 공개 키를 이용하여 각자 개인 켤레화 키를 생성해서 서로 공유하게 됩니다. 그러면 최종적으로 공유받은 모든 개인 켤레화 키를 이용하여 공용 켤레화 키를 생성할 수 있습니다.