다자간 연산
다자간 계산은 여러 사용자가 각자의 비밀 키를 가지고 계산에 참여할 수 있도록 해줍니다.
각 당사자는 자신만의 비밀 키를 보유하고 있으며, 암호화된 데이터를 복호화하기 위해서는 모든 비밀 키가 필요합니다.
이는 데이터가 노출될 위험 없이 협업 기반의 데이터 처리를 가능하게 합니다.
이 문서는 다자간 계산을 수행하는 방법을 단계별로 설명합니다.
이 문서의 모든 엔진은 Engine(multiparty=True)로 생성합니다.
구글 Colab에서 코드를 직접 수행해볼 수 있습니다.
A. 비밀 키와 공용 공개 키 생성
비밀 키는 다자간 연산을 하지 않을 때와 동일한 방식으로 각 사용자가 생성합니다. 이 비밀 키는 아무에게도 공유되어선 안됩니다.
반면 다자간 연산에서 공개 키는 기존 방식과 다르게 생성합니다.
- step 1: 중개자가 모든 사용자가 공용으로 쓰는 공개 키 a를 생성합니다.
- step 2: 사용자 1이 비밀 키를 생성하고, 공개 키 a와 비밀 키를 이용하여 공개 키 b를 생성합니다.
- step 3: 사용자 2도 똑같이 합니다.
- step 4: 두 사용자는 각자의 공개 키 b를 중개자에게 공유합니다. 중개자는 공개 키 a와 공유받은 모든 공개 키 b를 이용하여 공용 공개 키를 생성합니다.
다자간 연산용 공개 키에 대한 자세한 내용은 자료 구조 문서를 참고하세요.
Step 1: 중개자가 공개 키 a를 생성합니다.
from desilofhe import Engine
common_engine = Engine(multiparty=True)
public_key_a = common_engine.create_public_key_a()
Step 2: 사용자 1이 비밀 키와 공개 키 b를 생성합니다.
from desilofhe import Engine
engine1 = Engine(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(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
)
B. 다자간 연산 시 암호화
다자간 연산에서는 A에서 생성한 공용 공개 키를 이용하여 암호화합니다.
C. 다자간 연산 시 복호화
복호화를 할 때는 사용자들의 비밀 키가 노출되지 않아야 하기 때문에, 각자 비밀 키를 이용하여 복호화 조각을 생성합니다(step 1, 2). 공유받은 모든 복호화 조각을 이용하여 복호화를 할 수 있습니다(step 3).
Step 1: 사용자 1이 비밀 키를 이용하여 복호화 조각을 생성합니다.
Step 2: 사용자 2가 비밀 키를 이용하여 복호화 조각을 생성합니다.
Step 3: 중개자가 복호화 조각들을 이용하여 복호화합니다.
D. 다자간 연산 시 재선형화 키 생성
A에서 생성한 공용 공개 키를 이용하여 각자 개인 재선형화 키를 생성해서 중개자에게 공유합니다(step 1, 2). 그러면 최종적으로 공유받은 모든 개인 재선형화 키를 이용하여 공용 재선형화 키를 생성할 수 있습니다(step 3).
Step 1: 사용자 1이 개인 재선형화 키를 생성합니다.
Step 2: 사용자 2가 개인 재선형화 키를 생성합니다.
Step 3: 중개자가 공용 재선형화 키를 생성합니다.
relinearization_key = common_engine.create_multiparty_relinearization_key(
[relinearization_key1, relinearization_key2]
)
E. 다자간 연산 시 곱셈
다자간 연산에서 암호문 간 곱셈을 할 때는 D에서 생성한 공용 재선형화 키를 사용해서 재선형화를 해야 합니다. 중개자나 모든 사용자를 포함해서 누구든지 이 연산을 수행할 수 있습니다. 순환, 회전, 켤레화처럼 키가 필요한 다른 연산도 마찬가지로 이어지는 절에서 생성하는 공용 키를 사용합니다.
Step 1: 각 사용자가 공용 공개 키를 이용하여 암호화합니다.
data1 = [1, 2, 3]
encrypted1 = engine1.encrypt(data1, public_key)
data2 = [4, 5, 6]
encrypted2 = engine2.encrypt(data2, public_key)
Step 2: 공용 재선형화 키를 이용하여 두 암호문을 곱합니다.
이 예시에서는 사용자 1이 곱셈을 수행합니다.
Step 3: C와 같은 방법으로 결과를 복호화합니다.
decrypted_share1 = engine1.individual_decrypt(multiplied, secret_key1)
decrypted_share2 = engine2.individual_decrypt(multiplied, secret_key2)
decrypted = common_engine.multiparty_decrypt(
multiplied, [decrypted_share1, decrypted_share2]
)
F. 다자간 연산 시 고정 순환 키 생성
A에서 생성한 공용 공개 키를 이용하여 각자 개인 고정 순환 키를 생성해서 중개자에게 공유합니다(step 1, 2). 그러면 최종적으로 공유받은 모든 개인 고정 순환 키를 이용하여 공용 고정 순환 키를 생성할 수 있습니다(step 3). 공용 고정 순환 키로는 공용 공개 키로 암호화된 암호문을 고정된 이동량만큼 오른쪽으로 순환시킬 수 있습니다.
Step 1: 사용자 1이 개인 고정 순환 키를 생성합니다.
Step 2: 사용자 2가 개인 고정 순환 키를 생성합니다.
Step 3: 중개자가 공용 고정 순환 키를 생성합니다.
fixed_roll_key = common_engine.create_multiparty_fixed_roll_key(
[fixed_roll_key1, fixed_roll_key2]
)
G. 다자간 연산 시 순환 키 생성
A에서 생성한 공용 공개 키를 이용하여 각자 개인 순환 키를 생성해서 중개자에게 공유합니다(step 1, 2). 그러면 최종적으로 공유받은 모든 개인 순환 키를 이용하여 공용 순환 키를 생성할 수 있습니다(step 3). 공용 순환 키로는 공용 공개 키로 암호화된 암호문을 임의의 이동량만큼 오른쪽으로 순환시킬 수 있습니다.
Step 1: 사용자 1이 개인 순환 키를 생성합니다.
Step 2: 사용자 2가 개인 순환 키를 생성합니다.
Step 3: 중개자가 공용 순환 키를 생성합니다.
H. 다자간 연산 시 고정 회전 키 생성
A에서 생성한 공용 공개 키를 이용하여 각자 개인 고정 회전 키를 생성해서 중개자에게 공유합니다(step 1, 2). 그러면 최종적으로 공유받은 모든 개인 고정 회전 키를 이용하여 공용 고정 회전 키를 생성할 수 있습니다(step 3). 공용 고정 회전 키로는 공용 공개 키로 암호화된 암호문을 고정된 델타값만큼 왼쪽으로 회전시킬 수 있습니다.
Step 1: 사용자 1이 개인 고정 회전 키를 생성합니다.
fixed_rotation_key1 = engine1.create_individual_fixed_rotation_key(
secret_key1, public_key, delta=2
)
Step 2: 사용자 2가 개인 고정 회전 키를 생성합니다.
fixed_rotation_key2 = engine2.create_individual_fixed_rotation_key(
secret_key2, public_key, delta=2
)
Step 3: 중개자가 공용 고정 회전 키를 생성합니다.
fixed_rotation_key = common_engine.create_multiparty_fixed_rotation_key(
[fixed_rotation_key1, fixed_rotation_key2]
)
I. 다자간 연산 시 회전 키 생성
A에서 생성한 공용 공개 키를 이용하여 각자 개인 회전 키를 생성해서 중개자에게 공유합니다(step 1, 2). 그러면 최종적으로 공유받은 모든 개인 회전 키를 이용하여 공용 회전 키를 생성할 수 있습니다(step 3). 공용 회전 키로는 공용 공개 키로 암호화된 암호문을 임의의 델타값만큼 왼쪽으로 회전시킬 수 있습니다.
Step 1: 사용자 1이 개인 회전 키를 생성합니다.
Step 2: 사용자 2가 개인 회전 키를 생성합니다.
Step 3: 중개자가 공용 회전 키를 생성합니다.
J. 다자간 연산 시 켤레화 키 생성
A에서 생성한 공용 공개 키를 이용하여 각자 개인 켤레화 키를 생성해서 중개자에게 공유합니다(step 1, 2). 그러면 최종적으로 공유받은 모든 개인 켤레화 키를 이용하여 공용 켤레화 키를 생성할 수 있습니다(step 3). 공용 켤레화 키로는 공용 공개 키로 암호화된 암호문을 켤레화할 수 있습니다.