인코딩 방식
CKKS 스킴과 GL 스킴에서의 암호문은 일정량 이상의 값들을 포함하고 있어야 안전합니다. 포함해야 하는 값의 갯수는 곱셈 횟수가 늘수록 증가하고 보통 상당히 큽니다. 하나의 암호문이 담을 수 있는 값이 많기 때문에 많은 원본 값들을 벡터 혹은 행렬 형태로 동시에 암호화하는 방식을 취하고 있습니다. 이런 형태로 표현했기 때문에 원소간의 덧셈, 뺄셈, 곱셈을 지원합니다.
벡터 (CKKS)
암호화 대상 벡터의 최대 크기를 슬롯 갯수라고 부르고 있습니다.
엔진의 슬롯 갯수는 다음과 같이 확인이 가능합니다.
상기 코드를 보면 기본 엔진은 8192개의 원소를 동시에 암호화하는 것을 확인할 수 있습니다. 이 크기에 딱 맞게 활용하는게 최적의 성능을 내기는 하지만, DESILO FHE 라이브러리는 이외의 다른 크기의 벡터에 대한 연산도 지원하고 있습니다.
더 작은 크기의 벡터에 대한 처리
암호화 대상의 크기가 슬롯 갯수 보다 작은 경우에는 자동으로 뒤에 0이 추가됩니다.
슬롯 갯수가 4이고 암호화 대상의 크기가 2인 경우, 다음과 같이 처리됩니다.
더 큰 크기의 벡터에 대한 처리
암호화 대상의 크기가 슬롯 갯수보다 큰 경우에는 슬롯 갯수 단위로 끊어서 암호화를 합니다. 내부적으로 슬롯 갯수 단위로 암호화를 한 뒤, 이것들을 이어붙여서 리스트로 만든 후에 하나의 암호문으로 표현하고 있습니다.
슬롯 갯수가 4이고 암호화 대상의 크기가 10인 경우, 다음과 같이 처리됩니다.
마지막엔 원본값이 부족해서 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 라이브러리에서는 현재 단위 암호문 단위의 순환 및 회전만 지원하고 있습니다.
행렬 (GL)
GL 스킴에서는 암호화 대상 행렬의 형상을 shape이라고 부르고 있습니다.
엔진의 형상은 다음과 같이 확인이 가능합니다.
상기 코드를 보면 기본 행렬 엔진은 256 * 16 * 16 개의 값을 동시에 암호화하는 것을 확인할 수 있습니다.
제일 겉 차원을 배치라고 부릅니다. 기본 행렬 엔진에서는 배치 크기가 256입니다.
행렬 곱셈은 내부 행렬들을 각각 곱합니다. 기본 행렬 엔진에서는 내부 행렬의 크기가 16 * 16 입니다.
배치 크기가 더 작은 경우에 대한 처리
입력값의 배치 크기가 엔진의 배치 크기보다 작은 경우에는 자동으로 뒤에 0이 추가됩니다.
엔진의 형상이 (2, 2, 2)이고 입력값의 형상이 (1, 2, 2)인 경우, 다음과 같이 처리됩니다.
마지막엔 원본값이 부족해서 0이 추가된 것을 확인할 수 있습니다.
배치 크기가 더 큰 경우에 대한 처리
현재 지원하지 않고 있습니다.