2017-11-11 36 views
0

BN_exenerate_prime_ex()를 통해 생성 된 64 바이트 큰 정수에 BNUMexp() 및 BN_mod_exp()를 사용하는 작은 프로그램이 있습니다.OpenSSL BN_exp() 사용법

컴파일하고 실행할 때마다 프로그램이 BN_exp()에 대한 첫 번째 호출을 계산하는 동안 영원히 멈 춥니 다. 함수 호출 전후에 print 문이 있기 때문에 문제가 BN_exp()라는 것을 알고 있습니다. BN_exp()를 계산하는 동안 왜 프로그램이 멈추는 지 혼란스러워합니다. 64 바이트 큰 정수가 함수에 비해 너무 큽니까? 계산하는 데 정말로 오랜 시간이 걸리는 것입니까? 어떤 도움을 주셔서 감사합니다.

목표 : compute (bn_one^bn_two) * (bn_two^bn_one) mod bn_mod. 내 방식이 올바르지 않으므로 이것을 계산하는 방법에 대한 제안은 훌륭합니다.

#include <stdio.h> 

/* OpenSSL headers */ 
#include <openssl/bn.h> 

void main() 
{ 
    BIGNUM *bn_one, *bn_two, *bn_one2two, *bn_two2one, *bn_mod, *bn_result; 
    BN_CTX *ctx; /* used internally by the bignum lib */ 

    ctx = BN_CTX_new(); 
    bn_one = BN_new(); 
    bn_two = BN_new(); 
    bn_one2two = BN_new(); 
    bn_two2one = BN_new(); 
    bn_mod = BN_new(); 
    bn_result = BN_new(); 

    // Generate two 64 byte integers 
    BN_generate_prime_ex(bn_one,512,0,NULL,NULL,NULL); 
    BN_generate_prime_ex(bn_two,512,0,NULL,NULL,NULL); 
    BN_generate_prime_ex(bn_mod,512,0,NULL,NULL,NULL); 

    printf("BIGNUM One:\t"); 
    BN_print_fp(stdout, bn_one); 
    printf("\n"); 

    printf("BIGNUM Two:\t"); 
    BN_print_fp(stdout, bn_two); 
    printf("\n"); 

    // Compute bn_one to the power of bn_two and store in bn_one2two 
    if(BN_exp(bn_one2two , bn_one , bn_two, ctx) == 0) { 
     printf("Error in BN_exp\n"); 
    } 

    printf("BIGNUM One2Two:\t\n"); 
    BN_print_fp(stdout, bn_one2two); 
    printf("\n"); 

    // Compute bn_two to the power of bn_one and store in bn_two2one 
    if(BN_exp(bn_two2one , bn_two , bn_one, ctx) == 0) { 
     printf("Error in BN_exp\n"); 
    } 

    printf("BIGNUM Two2One:\t\n"); 
    BN_print_fp(stdout, bn_two2one); 
    printf("\n"); 

    // Compute bn_one2two * bn_two2one mod bn_mod and store the remainder in 
    //bn_result 
    if(BN_mod_mul(bn_result , bn_one2two , bn_two2one, bn_mod , ctx) == 0) { 
     printf("Error in BN_mod_exp\n"); 
    } 
    printf("BIGNUM Mod Result:\t\n"); 
    BN_print_fp(stdout, bn_result); 
    printf("\n"); 

    BN_CTX_free(ctx); 
    BN_clear_free(bn_one); 
    BN_clear_free(bn_two); 
    BN_clear_free(bn_one2two); 
    BN_clear_free(bn_two2one); 
    BN_clear_free(bn_mod); 
    BN_clear_free(bn_result); 
} 

프로그램 노점 전에 내 출력 (이 64 바이트 값은 각 실행으로 변경) :

의 bignum 하나 : CE06C8663AB65AA2BF7C6B30273C5E002552CFB8548A6B8EC7204A23F6A8892FEA9EF315777660C5B4FD97EABB7703FCFB5B1C2D495A1863B5F9D290F72CF8A5

의 bignum 2 : 여기

내 프로그램입니다 CB4A929D982670B77F2544E7D5A990DEE76958CBEC5BEB638B8DA9D44880C46817D1D7616C58AF79378215368C76962FA88D08A215331019599945CAF933E417

+0

내가 잘못하지 않는 한 결과는 최대 512 * 2^512 2 진수입니다. 그것은 어떤 컴퓨터 메모리보다 적합합니다. –

+0

내 목표는 (bn_one^bn_two) * (bn_two^bn_one) mod bn_one을 계산하는 것이므로, 현재의 방법 이외의 방법으로 이것을 계산할 수있는 방법에 대한 제안은 무엇입니까? 감사. –

+0

bn_one^bn_two는 bn_one의 배수이기 때문에 결과는 0이어야합니다. –

답변

0

이 소스 덕분에 (bn_one^bn_two) * (bn_two^bn_one) mod bn_mod를 올바르게 계산하는 방법을 알아 냈습니다 : https://github.com/maK-/Digital-Signature-ElGamal/blob/master/Crypto2.java.

예전에 나는 bn_one^bn_two의 BN_exp, bn_two^bn_one의 BN_exp, bn_mod의 결과에 대한 BN_mod 등을 계산했습니다.

숫자가 너무 커서이 방식으로 작업 할 수 없었습니다.

다음과 같이 흐른다의 bignum에 사용하는 연산 : BN_mod_exp()를 bn_one^bn_two에 bn_mod으로 bn_mod 함께 bn_two에 BN_mod_exp는()^bn_one을 모두 이전 BN_mod_exp 결과에 BN_mul() 계산 및 마지막으로 BN_mod()의 결과에 대한 BN_mod()를 bn_mod와 함께 사용합니다.

1

(bn_one2two * bn_two2one) mod bn_one을 계산하려고하지만 BN_mod_exp 함수를 사용한다고 가정하면 (bn_one2two^bn_two2one) mod bn_one 일 것입니다. 즉 두 숫자를 곱하는 대신 처음으로 지수를 취하려고 시도합니다. 대신 BN_mod_mul을 시도하십시오.

+0

내 또 다른 실수. 그에 따라 코드를 업데이트했습니다. 고맙습니다. 내 프로그램은 BN_exp()를 계산하는 동안 계속 멈추게됩니다. 나는 마틴이 지적한 것처럼이 문제는 64 바이트 정수를 다루고 있기 때문에 메모리에 너무 많은 수의 메모리를 저장하고 있다고 생각한다. –