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
내가 잘못하지 않는 한 결과는 최대 512 * 2^512 2 진수입니다. 그것은 어떤 컴퓨터 메모리보다 적합합니다. –
내 목표는 (bn_one^bn_two) * (bn_two^bn_one) mod bn_one을 계산하는 것이므로, 현재의 방법 이외의 방법으로 이것을 계산할 수있는 방법에 대한 제안은 무엇입니까? 감사. –
bn_one^bn_two는 bn_one의 배수이기 때문에 결과는 0이어야합니다. –