OpenSSL의 BN_BN2BIN 기능에 문제가 있습니다
-
19-09-2019 - |
문제
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);
}
제휴하지 않습니다 StackOverflow