multiply
Engine.multiply(x, y, relinearization_key)
- 두 인자를 곱한 암호문을 반환합니다.
- 인풋:
- x: int, double, complex double, array_like, Plaintext, or Ciphertext
- y: int, double, complex double, array_like, Plaintext, or Ciphertext
- 인자가 scalar이면 나머지 인자의 모든 값에 같은 값이 곱해집니다.
- 인풋 둘 중 하나는 Ciphertext여야 합니다.
- RelinearizationKey, optional
- 재선형화키를 전달하면 재선형화 처리가 된 암호문을 반환합니다. 재선형화를 하지 않으면 추후에 연산에 제약이 발생하기 때문에 곱셈과 같이 하는 것을 권장합니다.
- 인자중 하나가 상수인 경우에는 재선형화키가 필요가 없습니다.
- 아웃풋:
- Ciphertext
예시
암호문 간 곱셈
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)
message1 = [1, 2, 3]
ciphertext1 = engine.encrypt(message1, public_key)
message2 = [4, 5, 6]
ciphertext2 = engine.encrypt(message2, public_key)
multiplied = engine.multiply(ciphertext1, ciphertext2, relinearization_key)
암호문과 리스트의 곱셈
from desilofhe import Engine
engine = Engine()
secret_key = engine.create_secret_key()
public_key = engine.create_public_key(secret_key)
message1 = [1, 2, 3]
ciphertext1 = engine.encrypt(message1, public_key)
message2 = [4, 5, 6]
ciphertext2 = engine.encrypt(message2, public_key)
multiplied1 = engine.multiply(ciphertext1, message2)
multiplied2 = engine.multiply(message1, ciphertext2)
암호문과 상수의 곱셈
from desilofhe import Engine
engine = Engine()
secret_key = engine.create_secret_key()
public_key = engine.create_public_key(secret_key)
message = [1, 2, 3]
ciphertext = engine.encrypt(plaintext, public_key)
multiplied1 = engine.multiply(ciphertext, 2)
multiplied2 = engine.multiply(2, ciphertext)
암호문과 평문간 곱셈
from desilofhe import Engine
engine = Engine()
secret_key = engine.create_secret_key()
public_key = engine.create_public_key(secret_key)
message1 = [1, 2, 3]
plaintext1 = engine.encode(message1)
ciphertext1 = engine.encrypt(plaintext1, public_key)
message2 = [4, 5, 6]
plaintext2 = engine.encode(message2)
ciphertext2 = engine.encrypt(plaintext2, public_key)
multiplied1 = engine.multiply(ciphertext1, plaintext2)
multiplied2 = engine.multiply(plaintext1, ciphertext2)
재선형화를 하지 않은 상태에서도 덧셈, 뺄셈 및 복호화는 가능합니다. 다만 암호문간의 덧셈과 뺄셈의 경우에는 둘의 차원이 같아야 합니다.