콘텐츠로 이동

인코딩 방식

CKKS 스킴에서의 암호문은 일정량 이상의 값들을 포함하고 있어야 안전합니다. 포함해야 하는 값의 갯수는 곱셈 횟수가 늘수록 증가하고 보통 상당히 큽니다. 하나의 암호문이 담을 수 있는 값이 많기 때문에 많은 원본 값들을 벡터 형태로 동시에 암호화하는 방식을 취하고 있습니다. 벡터 형태로 표현했기 때문에 원소간의 덧셈, 뺄셈, 곱셈을 지원합니다. 암호화 대상 벡터의 최대 크기를 슬롯 갯수라고 부르고 있습니다.

엔진의 슬롯 갯수는 다음과 같이 확인이 가능합니다.

from desilofhe import Engine

engine = Engine()
engine.slot_count  # 8192

상기 코드를 보면 아무설정도 하지 않은 가장 기본 엔진은 8192개의 원소를 동시에 암호화하는 것을 확인할 수 있습니다. 이 크기에 딱 맞게 활용하는게 최적의 성능을 내기는 하지만, DESILO FHE 라이브러리는 이외의 다른 크기의 벡터에 대한 연산도 지원하고 있습니다.

더 작은 크기의 벡터에 대한 처리

암호화 대상의 크기가 슬롯 갯수 보다 작은 경우에는 자동으로 뒤에 0이 추가됩니다.

슬롯 갯수가 4이고 암호화 대상의 크기가 2인 경우, 다음과 같이 처리됩니다.

 원본: [1, 2]

인코딩: [1, 2, 0, 0]

더 큰 크기의 벡터에 대한 처리

암호화 대상의 크기가 슬롯 갯수보다 큰 경우에는 슬롯 갯수 단위로 끊어서 암호화를 합니다. 내부적으로 슬롯 갯수 단위로 암호화를 한 뒤, 이것들을 이어붙여서 리스트로 만든 후에 하나의 암호문으로 표현하고 있습니다.

슬롯 갯수가 4이고 암호화 대상의 크기가 10인 경우, 다음과 같이 처리됩니다.

 원본: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

암호문: [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 0, 0]]

마지막엔 원본값이 부족해서 0이 추가된 것을 확인할 수 있습니다.

슬롯 단위로 끊어서 암호화된 암호문의 부분을 내부적으로는 단위 암호문이라고 부르고 있습니다. 예시 처럼 단위 암호문 여럿으로 구성된 암호문의 경우, 모든 연산이 동일하게 동작하지만 회전이 좀 다릅니다. 회전은 단위 암호문 단위로 처리되고, 전체 암호문 단위로 처리되지 않습니다.

암호문: [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 0, 0]]

한 칸 회전 (단위 암호문 단위)

결과물: [[4, 1, 2, 3], [8, 5, 6, 7], [0, 9, 10, 0]]

한 칸 회전 (전체 암호문 단위)

결과물: [[10, 1, 2, 3], [4, 5, 6, 7], [8, 9, 0, 0]]

전체 암호문 단위의 회전도 불가능한 것은 아니지만 일반적으로 슬롯 갯수가 몹시 크고 그렇게까지 큰 단위의 회전은 드물기 때문에 DESILO FHE 라이브러리에서는 현재 단위 암호문 단위의 회전만 지원하고 있습니다.

희소 벡터 처리

단위 암호문 단위 회전과 0 패딩이 같이 있는 경우 뒷부분에 추가해둔 0이 회전에 의해 앞쪽으로 이동하면서 회전이 예상과 다르게 동작하게 됩니다. 따라서 1.5 버전 부터는 희소 인코딩 기능이 추가되었습니다.

엔진의 슬롯 갯수를 지정할 수 있도록 변경되었습니다.

from desilofhe import Engine

engine = Engine(slot_count=32)
engine.slot_count  # 32

엔진의 슬롯 갯수는 2의 거듭제곱이어야 하기 때문에 지정값이 2의 거듭제곱이 아닌 경우 해당 값 이상의 가장 작은 2의 거듭제곱으로 자동적으로 조정되어서 설정됩니다.

from desilofhe import Engine

engine = Engine(slot_count=30)
engine.slot_count  # 32

슬롯 갯수가 4이고 암호화 대상의 크기가 4인 경우, 다음과 같이 처리됩니다.

 원본: [1, 2, 3, 4]

인코딩: [1, 2, 3, 4]

한 칸 회전 (단위 암호문 단위)

결과물: [4, 1, 2, 3]

희소 인코딩의 경우, 서로 다른 크기로 인코딩한 암호문간의 연산은 지원하기 어렵습니다. 서로 다른 크기로 인코딩된 암호문간의 연산은 대략적으로 다음과 같이 처리됩니다.

슬롯 갯수 2의 암호문: [1 2 1 2]
슬롯 갯수 4의 암호문: [1 2 3 4]
   덧셈 결과 암호문: [2 4 4 6]
   곱셈 결과 암호문: [1 4 3 8]

이 둘을 더하려고 하면 크기가 다른 부분의 결과값이 예상치 못한 값이 나오게 됩니다. 따라서 DESILO FHE 라이브러리는 희소 인코딩의 경우 슬롯 카운트가 다르게 지정된 암호문끼리는 연산이 불가능하도록 되어있습니다.