본문 바로가기

디지털포렌식(Digital forensic)/키(key)

린겐 서명 암호, Lattice Signature

반응형

린겐 서명은 격자 기반 암호화의 한 형태로
양자 암호화의 한 종류다.

  • privateKey 생성:
    GeneratePrivateKey 함수는 주어진 크기와 모듈러 값에 따라 무작위 개인키를 생성한다.
    개인키의 각 요소는 0부터 q-1까지의 값을 가지게 된다.
  • publicKey 생성:
    GeneratePublicKey 함수는 개인키와 격자의 차원, 모듈러 값을 사용하여 공개키를 생성한다.
    각 공개키 요소는 개인키의 요소들과 함께 계산되는데(이 때 특정한 수식과 계산 방식을 사용한다.).
  • 공개키의 각 요소는 개인키의 요소를 활용하여 계산되며, 이때 격자의 차원에 따라 계산이 이루어진다.
    이 과정이 린겐 서명의 핵심적인 계산 과정 중 하나가 된다.
구글이 개발한 양자컴퓨터

 

아래 코드는 린겐 서명의 개념을 실험적으로 볼 수 있다.
개념적으로 모호한 개인키와 공개키의 생성 과정을 구현하고 출력한다.
주어진 파라미터 값과 계산 방식에 따라 키 값들이 생성된다.

 

using System;
using System.Numerics;

namespace LatticeEncryptionExample
{
    class Program
    {
        static void Main(string[] args)
        {
            // 린겐 서명 예제를 위한 파라미터 설정
            int n = 256; // 격자의 차원
            int q = 12289; // 모듈러 값
            int privateKeySize = 256; // 개인키 크기
            int publicKeySize = n * privateKeySize; // 공개키 크기

            // 키 생성
            int[] privateKey = GeneratePrivateKey(privateKeySize, q);
            int[] publicKey = GeneratePublicKey(privateKey, n, q);

            Console.WriteLine("Private Key:");
            PrintArray(privateKey);

            Console.WriteLine("Public Key:");
            PrintArray(publicKey);
        }

        // 개인키 생성
        static int[] GeneratePrivateKey(int size, int q)
        {
            Random random = new Random();
            int[] privateKey = new int[size];
            for (int i = 0; i < size; i++)
            {
                privateKey[i] = random.Next(0, q);
            }
            return privateKey;
        }

        // 공개키 생성
        static int[] GeneratePublicKey(int[] privateKey, int n, int q)
        {
            int[] publicKey = new int[n];
            for (int i = 0; i < n; i++)
            {
                publicKey[i] = 0;
                for (int j = 0; j < privateKey.Length; j++)
                {
                    publicKey[i] += privateKey[j] * privateKey[(i * j) % privateKey.Length];
                    publicKey[i] %= q;
                }
            }
            return publicKey;
        }

        // 배열 출력
        static void PrintArray(int[] array)
        {
            foreach (var value in array)
            {
                Console.Write(value + " ");
            }
            Console.WriteLine();
        }
    }
}

 

 

728x90