반응형
린겐 서명은 격자 기반 암호화의 한 형태로
양자 암호화의 한 종류다.
- 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
'디지털포렌식(Digital forensic) > 키(key)' 카테고리의 다른 글
[파일] pycryptodome를 이용한 암호화, 복호화 (0) | 2023.12.01 |
---|---|
[파일] ZIP 파일 만들기 코드 (0) | 2023.11.30 |
윈도우즈 11의 기본값, SSD 암호화 ON (0) | 2023.10.24 |
[파일]QR 코드 생성 프로그램 (1) | 2023.10.17 |
아핀(affine) 암호, QAPASAA가 가르키는 나라는? (0) | 2023.09.10 |