다자간 연산
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. 다자간 연산 시 켤레화 키 생성
공용 공개 키를 이용하여 각자 개인 켤레화 키를 생성해서 서로 공유하게 됩니다. 그러면 최종적으로 공유받은 모든 개인 켤레화 키를 이용하여 공용 켤레화 키를 생성할 수 있습니다.