문제

OpenSSL에서 BN_* 함수를 사용하려고합니다. 특히 다음 코드가 있습니다.

#import <openssl/bn.h>
BIGNUM * num = BN_new();
BN_set_word(num, 42);
char * buffer = malloc((BN_num_bytes(num)+1) * sizeof(char));
buffer[BN_num_bytes(num)] = '\0';
int len = BN_bn2bin(num, buffer);
printf("42 in binary is %s\n", buffer);

그러나, 내가 이것을 할 때, 나는 일련의 끈과 0을 얻지 못합니다. 대신 인쇄합니다 "42 in binary is *". 내가 알 수있는 한 매우 웹에서 사용할 수있는 제한된 수의 예제와 비교했을 때이를 올바르게 구현했습니다.

그것이 작동하지 않는 이유는 무엇입니까?

도움이 되었습니까?

해결책

BN_bn2bin 인쇄 가능한 문자열을 만들지 않습니다. 대신, 진정으로 이진 인 표현을 만듭니다 (즉, 비트 시퀀스). 보다 구체적으로, 그것은 그 숫자의 큰 목록 표현을 생성합니다. 42는 하나의 바이트에 맞기 때문에 ASCII에서 "*"인 1 바이트 0x2A를 얻을 수 있습니다.

0/1 표현을 원한다면 모든 바이트를 반복하고 인쇄를 직접 수행해야합니다 (예 : 이동 또는 조회 테이블로).

다른 팁

다음은 실제로 다음을 바꾸는 코드입니다 BN_bn2bin 출력과 마찬가지로 인쇄 가능한 문자열로 출력 BN_bn2dec 그리고 BN_bn2hex. Nodejs 라이브러리에 있지만 속도를 위해 C ++로 작성되었습니다. 하루 종일 나를 데려 갔고 아마도 최적이 아니었을 것입니다 (UNI의 첫해 이후 C ++ 코드를 작성하지 않았기 때문에). 그러나 그것은 많은 단위 테스트를 통과하여 그것이 작동한다는 것을 알고 있습니다!

https://github.com/malcolmocean/node-bignum

if (BN_is_zero(&bignum->bignum_)) {
  to = (char*) OPENSSL_malloc(2*sizeof(char));
  to[0] = '0';
  to[1] = '\0';
} else {
  unsigned char *binary = (unsigned char*) OPENSSL_malloc(BN_num_bytes(&bignum->bignum_)*sizeof(unsigned char));
  int len = BN_bn2bin(&bignum->bignum_, binary);
  to = (char*) OPENSSL_malloc((len*8+2)*sizeof(char));
  int offset = 0;
  if (BN_is_negative(&bignum->bignum_)) {
    to[0] = '-';
    offset--;
  }
  unsigned char x = binary[0];
  while (!(x & 128) && x) {
    x = x << 1;
    offset++;
  }
  for (int i = 0; i < len; i++) {
    unsigned char bits = binary[i];

    int j=7;
    while(bits) {
      if (bits & 1) {
        to[8*i+j-offset] = '1';
      } else {
        to[8*i+j-offset] = '0';
      }
      bits = bits >> 1;
      j--;
    }
    if (i > 0) {
      while (j >= 0) {
        to[8*i+j-offset] = '0';
        j--;
      }
    }
  }
  to[8*len-offset] = '\0';
  OPENSSL_free(binary);
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top