2016-08-24 12 views
5

Muszę zrobić podpis RSA (na komputerze stanu) w C na pokładzie 32-bitowym. Mam ograniczoną pamięć, więc nie mogę przechowywać dziesiętnych w wektorze lub coś podobnego.Jak przechowywać duże liczby?

Najlepiej byłoby, gdybym mógł przechowywać kawałki i mieć łatwy dostęp do nich; jaka metoda przechowywania byłaby najlepsza?

Zrobiłem to jedno:

#if (CPU_TYPE == CPU_TYPE_32) 

typedef uint32_t word; 
#define word_length 32 
typedef struct BigNumber { 
    word words[64]; 
} BigNumber; 

#elif (CPU_TYPE == CPU_TYPE_16) 

typedef uint16_t word; 
#define word_length 16 
typedef struct BigNumber { 
    word words[128]; 
} BigNumber; 

#else 
#error Unsupported CPU_TYPE 
#endif 

Wydaje się trudne do wykorzystania. Jak mogę to uprościć?

+3

Jeśli nie możesz użyć istniejących bibliotek (GMP, MPFI, ...), możesz sprawdzić, w jaki sposób reprezentują one długie liczby całkowite. Zwykle jest to tablica unsigneds wyrównana z platformą. – dhke

+0

Nie mogę użyć żadnej biblioteki, myślę, że mam zamiar spróbować coś z uint32, dziękuję! –

+0

* "Nie mogę przechowywać cyfr po przecinku w wektorze lub coś podobnego" * - Dlaczego? Jakie jest ograniczenie? Jakiś konkretny rozmiar? –

Odpowiedz

4

Możesz po prostu użyć BigNumber API z OpenSSL. Możesz znaleźć pełny API here.

I, można użyć tej próbki kodu jako początek:

#include <stdio.h> 

#include <openssl/crypto.h> 
#include <openssl/bn.h> 

int main(int argc, char *argv[]) 
{ 
    static const char num1[] = "18446744073709551616"; 
    static const char num2[] = "36893488147419103232"; 

    BIGNUM *bn1 = NULL; 
    BIGNUM *bn2 = NULL; 
    BN_CTX *ctx = BN_CTX_new(); 

    BN_dec2bn(&bn1, num1); // convert the string to BIGNUM 
    BN_dec2bn(&bn2, num2); 

    BN_add(bn1, bn1, bn2); // bn1 = bn1 + bn2 

    char *result_str = BN_bn2dec(bn1); // convert the BIGNUM back to string 
    printf("%s + %s = %s\n", num1, num2, result_str); 
    OPENSSL_free(result_str); 

    BN_free(bn1); 
    BN_free(bn2); 
    BN_CTX_free(ctx); 

    return 0; 
} 

skompilować z:

#> gcc -Wall -Wextra -g -o sample sample.c -lcrypto 

Powinieneś otrzymać coś takiego podczas wykonywania go:

18446744073709551616 + 36893488147419103232 = 55340232221128654848 
+1

Dziękuję, ale nie mogłem nie korzystać z żadnej biblioteki z powodu ograniczeń pamięci, użyłem tej metody, o której pisałem, ale wciąż żyję tym pytaniem bez odpowiedzi, w przypadku lepszego rozwiązania, które pomoże komuś innemu. –

+0

Możesz również spojrzeć na [mbed TLS] (https://tls.mbed.org/) jest bardzo podobną biblioteką do OpenSSL, specjalnie używaną w systemach wbudowanych. Problem z twoim "ograniczeniem pamięci" polega na tym, że nigdy nie powiedziałeś dokładnie, jak rygorystyczne były. – perror

Powiązane problemy