콘텐츠로 이동

다자간 연산

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이 공용 공개 키를 이용하여 암호화합니다.

data = [1, 2, 3]
encrypted = engine1.encrypt(data, public_key)

Step 6: 사용자 1이 비밀 키를 이용하여 복호화 조각을 생성합니다.

decrypted_share1 = engine1.individual_decrypt(encrypted, secret_key1)

Step 7: 사용자 2가 비밀 키를 이용하여 복호화 조각을 생성합니다.

decrypted_share2 = engine2.individual_decrypt(encrypted, secret_key2)

Step 8: 중개자가 복호화 조각들을 이용하여 복호화합니다.

decrypted = common_engine.multiparty_decrypt(encrypted, [decrypted_share1, decrypted_share2])

C. 다자간 연산 시 재선형화 키 생성

공용 공개 키를 이용하여 각자 개인 재선형화 키를 생성해서 서로 공유하게 됩니다. 그러면 최종적으로 공유받은 모든 개인 재선형화 키를 이용하여 공용 재선형화 키를 생성할 수 있습니다.

Step 1 ~ Step 4: B의 공개 키 생성 과정과 동일합니다.

Step 5: 사용자 1이 개인 재선형화 키를 생성합니다.

relinearization_key1 = engine1.create_individual_relinearization_key(secret_key1, public_key)

Step 6: 사용자 2가 개인 재선형화 키를 생성합니다.

relinearization_key2 = engine2.create_individual_relinearization_key(secret_key2, public_key)

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이 공용 공개 키를 이용하여 암호화합니다.

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

Step 9: 사용자 2이 공용 공개 키를 이용하여 암호화합니다.

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

Step 10: 두 암호문을 곱하고, 공용 재선형화 키를 이용하여 재선형화 합니다.

중개자나 모든 사용자를 포함해서 누구든지 이 연산을 수행할 수 있습니다. 이 예시에서는 사용자 1이 곱셈을 수행합니다.

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

Step 11: 사용자 1이 비밀 키를 이용하여 복호화 조각을 생성합니다.

decrypted_share1 = engine1.individual_decrypt(multiplied, secret_key1)

Step 12: 사용자 2가 비밀 키를 이용하여 복호화 조각을 생성합니다.

decrypted_share2 = engine2.individual_decrypt(multiplied, secret_key2)

Step 13: 중개자가 복호화 조각들을 이용하여 복호화합니다.

decrypted = common_engine.multiparty_decrypt(multiplied, [decrypted_share1, decrypted_share2])

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이 개인 회전 키를 생성합니다.

rotation_key1 = engine1.create_individual_rotation_key(secret_key1, public_key)

Step 6: 사용자 2가 개인 회전 키 키를 생성합니다.

rotation_key2 = engine2.create_individual_rotation_key(secret_key2, public_key)

Step 7: 중개자가 공용 회전 키 키를 생성합니다.

rotation_key = common_engine.create_multiparty_rotation_key([rotation_key1, rotation_key2])

F. 다자간 연산 시 켤레화 키 생성

공용 공개 키를 이용하여 각자 개인 켤레화 키를 생성해서 서로 공유하게 됩니다. 그러면 최종적으로 공유받은 모든 개인 켤레화 키를 이용하여 공용 켤레화 키를 생성할 수 있습니다.

Step 1 ~ Step 4: B의 공개 키 생성 과정과 동일합니다.

Step 5: 사용자 1이 개인 켤레화 키를 생성합니다.

conjugation_key1 = engine1.create_individual_conjugation_key(secret_key1, public_key)

Step 6: 사용자 2가 개인 켤레화 키 키를 생성합니다.

conjugation_key2 = engine2.create_individual_conjugation_key(secret_key2, public_key)

Step 7: 중개자가 공용 켤레화 키 키를 생성합니다.

conjugation_key = common_engine.create_multiparty_conjugation_key([conjugation_key1, conjugation_key2])