簡體   English   中英

如何存儲大數字?

[英]How to store large numbers?

我必須在32位電路板上用C進行RSA簽名(在狀態機上)。 我的內存有限,所以我不能將小數存儲在矢量或類似的東西中。

最好的辦法是,如果我可以存儲位並輕松訪問它們; 什么存儲方法最好?

我做了這個:

#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

這似乎很難使用。 我該如何簡化它?

您可以簡單地使用OpenSSL中的BigNumber API。 您可以在此處找到完整的API。

並且,您可以使用此代碼示例作為開頭:

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

編譯它:

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

執行時你應該得到這樣的東西:

18446744073709551616 + 36893488147419103232 = 55340232221128654848

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM