【问题标题】:adding elements to array of structs in C将元素添加到C中的结构数组
【发布时间】:2012-10-18 05:31:18
【问题描述】:

因此,对于加密类,我们正在使用 SRA 协议实现 Mental Poker。我们正在为 BIGNUM http://www.openssl.org/docs/crypto/bn.html 使用 openSSL 库,在将加密卡添加到 BIGNUM 结构数组时遇到问题。

#include <openssl/bn.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

BIGNUM* encryptedDeck[52];
BIGNUM* bobHand[5];
BIGNUM* aliceHand[5];

int main(int argc, char* argv[]){
    int lcv = 0;
    BIGNUM *P,*Q,*N,*alpha,*alphaPrime,*beta,*betaPrime,*temp,*Pminus;
    BN_CTX *ctx = BN_CTX_new();
    P = BN_new(); //same for all BIGNUM pointers

    BN_generate_prime(P,512,1,NULL,NULL,NULL,NULL);
    BN_generate_prime(Q,512,1,NULL,NULL,NULL,NULL);
    BN_generate_prime(alpha,128,1,NULL,NULL,NULL,NULL); //Alice's key [ gcd(alpha,P) = 1 ]
    BN_generate_prime(beta,128,1,NULL,NULL,NULL,NULL);  //Bob's key. Same rule as alice's

    BN_one(temp);  //set temp to be a BIGNUM equivalent to integer 1
    BN_sub(Pminus,P,temp);

    BN_mul(N,P,Q,ctx);

    temp = BN_new();
    BIGNUM *encryptedCard = BN_new();
    for(lcv; lcv < 52; lcv++){
        BN_bin2bn(deck[lcv],strlen(deck[lcv]),temp);
        BN_mod_exp(encryptedCard,temp,beta,P,ctx);    //encrypt temp, store in encryptedCard

        printf("ec: %s\n\n",BN_bn2dec(encryptedCard));  //prints *correct numbers

        encryptedDeck[lcv] = encryptedCard;  //store cards in the array of encrypted cards
    }

    printf("00: %s\n\n",BN_bn2dec(encryptedDeck[0]));
    printf("01: %s\n\n",BN_bn2dec(encryptedDeck[1]));
    //...
    printf("40: %s\n\n",BN_bn2dec(encryptedDeck[40]));
}

forloop 中的 print 语句打印 52 个不同的值(每张卡片 1 个。)

我打算将这些值中的每一个都简单地添加到数组 encryptedDeck,但是当我在退出循环后检查这些值时,它们都等同于第 52 张卡。 所以由于某种原因,数组中的每个索引都被每张新卡覆盖?或者类似的奇怪的东西。

在处理结构数组时,我是否缺少一些明显的东西?我马上想到的唯一一件事是数组没有被初始化为足够的空间或其他东西。

我认为可以将 BIGNUM 值转换为 char* 并以这种方式将它们存储在一个数组中,但我试图避免这种情况,因为我不知道指针需要多大,甚至有一个猜测他们的范围。像

char encryptedDeck[52][something ridiculous];

我省略了一些代码,但我相信这仍然应该编译(假设你有 openssl 库,并在编译时链接它)并为我没有初始化的所有其他 BIGNUM 指针填写 BN_new()。

【问题讨论】:

  • +1 以获得明确的问题和格式良好的代码。很高兴从 SO 的新手那里看到它。
  • +1 同样的原因。即使代码没有编译,我仍然可以遵循它,并且描述与他的目标和观察到的问题完全一致。新的 SO 海报完全罕见。

标签: c arrays struct


【解决方案1】:

就在你的 for 循环之上:

BIGNUM *encryptedCard = BN_new();

你永远不会改变 this 指向的东西。您只需不断将新数据放入同一张卡中,然后将该卡保存到 for 循环的当前插槽中。

我的猜测是将卡片移动到循环内

for(lcv; lcv < 52; lcv++){
    BIGNUM *encryptedCard = BN_new();
    BN_bin2bn(deck[lcv],strlen(deck[lcv]),temp);
    BN_mod_exp(encryptedCard,temp,beta,P,ctx);
    printf("ec: %p: %s\n\n",encryptedCard, BN_bn2dec(encryptedCard));
    encryptedDeck[lcv] = encryptedCard;
}

注意:我不使用这个加密库,所以我不能告诉你 temp 是否需要循环中的相同位置,但似乎你的问题可能出在哪里。

【讨论】:

  • 对不起,我应该更明确一点。 openssl 库中的两个函数是 for 循环中的前 2 个。他们处理从纯文本卡组中取出一张卡片,使其成为 BIGNUM,加密并存储到另一个 BIGNUM 中。 BN_bin2bn(char* str, strlen(str), BIGNUM whereToStore) 和 BN_mod_exp(BIGNUM result, BIGNUM* a, BIGNUM* p, BIGNUM* m, ctx) 所以 mod_exp 的第一个参数是什么变化卡片,然后我将其放入数组中。
  • @AChrapko 当然,所以打算将该指针(same 指针)存储在牌组每个插槽的表中?我之所以提出这个问题,是因为您提到循环结束后它们都是 same 卡。检查卡片组并查看它们是否都是相同的指针,如果是,则它的prolly 不正确。 (或者,我真的需要更多地使用 openssl 而不是 BSAFE =))。
  • 好的,好的,我知道你在说什么。所以真正让我失望的是必须使用 BIGNUM 结构作为我的数组数据类型。当我第一次看这篇文章时,我想“啊,是的,一个 52 个字符 * 的数组,memcpy 将是我最好的朋友”。所以是的,我认为它们都是同一个指针。在这里我的 memcpy 等价物是什么?
  • 您可以使用 BN_copy() 来复制 BIGNUM,但正如 WhozCraig 所说,将创建调用移动到循环内似乎更容易。
  • @AChrapko 我更新了上面的循环以打印 pointer 以及 printf stmt 中的文本转储。如果甲板上没有卡片,那么您可以做以前的事情,但是您需要将数据 out 从 encryptedCard bignum 中提取出来并在下一次循环迭代之前将其保存,否则它将迷失。无论如何,你看它,你正在生成新数据,但是然后猛击旧数据而不保存它。如果您希望它采用 BIGNUM-ptr 以外的形式,则需要在循环之前完成。如果 BIGNUM-ptr 是好的,上面的循环应该可以工作。我想你现在明白了。
猜你喜欢
  • 2016-07-31
  • 2021-02-02
  • 2019-05-26
  • 2020-02-01
  • 2015-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-02
相关资源
最近更新 更多