OpenSSL을 통한 소수 생성 (랜덤)
뻘짓

OpenSSL을 통한 소수 생성 (랜덤)

#include <stdio.h>
/*openssl의 bn에서 bio를 참조하고 bio에서는 윈속을 참조함. 이거 추가 안하면 링크에러남.*/
#pragma comment(lib, "ws2_32.lib")
#include "openssl/bn.h" /*openssl의 빅넘버 관련 헤더*/
/*openssl의 스태틱 빌드된거 찾아보면 라이브러리 받아서 사용 할 수 있다.*/
#pragma comment (lib, "libcrypto_static.lib"
 
 
/*여담 : 윈도우즈에서 openssl 소스 받아다가 빌드 하려면 온갖 생쇼를 해야한다.
        이미 누군가 빌드해둔 스태틱 버전 받아다 그냥 쓰는게 정신 건강에 이롭다.*/
 
 
/**
    @brief [콘솔 전용]16바이트 단위로 개행하며 16진 값을 프린트 한다.
    @param buffer 16진 출력을 시작할 버퍼
    @param nPrintLen 프린트 할 바이트 수
*/
void hex_print(unsigned char* buffer, int nPrintLen)
{
    const int nAlign = 16/*16 바이트 단위로 개행*/
    int i, k, nLen;
    unsigned char* p;
 
    if (!buffer) return;
    p = (unsigned char*)buffer;
    for (i = 0; i < nPrintLen; i += nAlign) {
        p = buffer + i;
        nLen = (nAlign < (nPrintLen - i) ? nAlign : nPrintLen - i);
        for (k = 0; k < nLen; k++
            printf("%02X ", p[k]);
        printf("\n");
    }
}
 
int main()
{
    BIGNUM* Xp = NULL;
    BN_CTX* ctx = NULL;
    unsigned char binP[128];
 
    ctx = BN_CTX_new(); /*빅넘버 컨텍스트 생성*/
    BN_CTX_start(ctx); /*컨텍스트 사용 시작을 알림*/
    Xp = BN_CTX_get(ctx);
    /*1024비트 소수 생성*/
    if (!BN_generate_prime_ex(Xp, 10240 , 0 , 0 , 0)) {
        printf("소수 생성 실패 \n");
        return 0;
    }
    BN_bn2bin(Xp, binP); /*빅넘버 -> byte* 형으로 변환 (bignum to binary 인듯)*/
    hex_print(binP, 128); /*16진 출력 (1024비트 = 128바이트 모르면 바보)*/
    BN_CTX_end(ctx); /*컨텍스트 사용 종료를 알림*/
    BN_CTX_free(ctx); /*컨텍스트 해제*/
    return 0;
}
 
cs

 

실행 결과 :

겁나짱큰 1024비트 소수가 생성되었다. 이런 소수 두개 만들어서 곱하면 2048비트 RSA에 사용될 모듈러스 N 이 탄생한다.

 

 

 

RSA의 간단한 개요 정도는 이 친구의 뻘짓을 참고 해보도록 하자. >> hwan001.tistory.com/75

 

[암호화] RSA C로 구현하기?

1. 이론 찾아보기 https://kevin0960.tistory.com/entry/RSA-%EC%95%94%ED%98%B8%EC%99%80-%EA%B7%B8-%ED%95%B4%EB%8F%85 이론과 원리에 대해서 설명 https://www.crocus.co.kr/1203  구글링 중 찾은 사이트. RSA..

hwan001.tistory.com