Frage

Ich versuche, die BN_ * Funktionen in OpenSSL zu verwenden. Genauer gesagt, ich habe den folgenden Code:

#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);

Allerdings, wenn ich dies tun, ich habe nicht eine Reihe von Einsen und Nullen bekommen. Stattdessen druckt es "42 in binary is *". Soweit ich das beurteilen kann, und aus dem sehr begrenzte Anzahl von Beispielen im Internet verfügbar, die ich dies verglichen habe, habe ich umgesetzt habe dies richtig.

Irgendwelche Ideen, warum es nicht funktioniert?

War es hilfreich?

Lösung

BN_bn2bin keine druckbaren Zeichenfolge erstellen - stattdessen es schafft eine Darstellung, die wirklich binär ist (das heißt eine Folge von Bits). Genauer gesagt createas es eine Big-Endian-Darstellung der Zahl. Seit 42 in ein Byte passt, können Sie ein Byte 0x2a erhalten, die "*" in ASCII ist.

Wenn Sie eine 0/1 Darstellung wollen, müssen Sie alle Bytes iterieren, und tun Sie sich den Druck (zum Beispiel mit Verschiebung oder eine Lookup-Tabelle).

Andere Tipps

Hier ist ein Code, der die BN_bn2bin Ausgabe in eine druckbare Zeichenfolge tatsächlich dreht sich ebenso wie die Ausgabe von BN_bn2dec und BN_bn2hex. Es ist in einer NodeJS Bibliothek aber ist in C ++ für Geschwindigkeit geschrieben. Nahm mich den ganzen Tag und wahrscheinlich nicht optimal ist (weil ich habe keine C ++ Code seit der ersten Klasse von uni geschrieben). Aber es geht eine Reihe von Unit-Tests, damit ich weiß, es funktioniert!

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);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top