2016-08-24 18 views
5

Tôi phải tạo chữ ký RSA (trên máy trạng thái) trong C trên bảng 32 bit. Tôi bị hạn chế về bộ nhớ vì vậy tôi không thể lưu trữ số thập phân trong một vector hoặc một cái gì đó như thế.Làm thế nào để lưu trữ số lượng lớn?

Điều tốt nhất là nếu tôi có thể lưu trữ bit và có quyền truy cập dễ dàng vào chúng; phương pháp lưu trữ nào là tốt nhất?

Tôi làm điều này một:

#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 

Điều này có vẻ khó sử dụng. Làm thế nào tôi có thể đơn giản hóa nó?

+3

Nếu bạn không thể sử dụng các thư viện hiện có (GMP, MPFI, ...), bạn có thể muốn kiểm tra xem các thư viện đó đại diện cho các số nguyên dài như thế nào. Nó thường là một mảng của unsigneds phù hợp với nền tảng này. – dhke

+0

Tôi không thể sử dụng bất kỳ thư viện nào, tôi nghĩ mình sẽ thử một cái gì đó với uint32, Cảm ơn bạn! –

+0

* "Tôi không thể lưu trữ số thập phân trong một véc tơ hoặc một cái gì đó như thế" * - Tại sao? Giới hạn là gì? Bất kỳ kích thước cụ thể? –

Trả lời

4

Bạn có thể chỉ cần sử dụng API BigNumber từ OpenSSL. Bạn có thể tìm thấy API đầy đủ here.

Và, bạn có thể sử dụng mẫu mã này như một sự khởi đầu:

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

Biên dịch nó với:

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

Bạn sẽ nhận được một cái gì đó như thế này khi thực hiện nó:

18446744073709551616 + 36893488147419103232 = 55340232221128654848 
+1

Cảm ơn bạn, nhưng tôi không thể sử dụng bất kỳ thư viện nào vì giới hạn bộ nhớ, tôi đã sử dụng phương pháp mà tôi đã đăng câu hỏi, nhưng tôi vẫn chưa trả lời câu hỏi này của một giải pháp tốt hơn, điều đó sẽ giúp người khác. –

+0

Bạn cũng có thể xem [mbed TLS] (https://tls.mbed.org/) là một thư viện rất giống với OpenSSL được sử dụng cụ thể trong các hệ thống nhúng. Vấn đề với "giới hạn bộ nhớ" của bạn là bạn không bao giờ nói chính xác mức độ nghiêm ngặt của chúng. – perror

Các vấn đề liên quan