c - 将元素添加到 C 中的结构数组

标签 c arrays struct

因此,对于加密类,我们正在使用 SRA 协议(protocol)实现 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()。

最佳答案

就在你的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 是否需要循环中的相同位置,但看起来你的问题可能出在哪里。

关于c - 将元素添加到 C 中的结构数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12947731/

相关文章:

c - 按值传递和返回结构(带有数组成员)

c - 从给定 1->2->3->4 的链表中删除所有其他节点以获得 2->4?

javascript - 使用 ClientScript 类将 VB.net 数组传递给 javascript

javascript - 如何从另一个数组的所有元素中过滤一个数组

c++ - 打包的结构没有预期的大小

python - 结构错误 : unpack requires a string argument of length 4

C语言中将一种数据结构复制到另一种数据结构

python - PyArg_Parse 返回帧对象而不是 PyLongObject

c++ - 具有虚拟文件系统的 c 预处理器

arrays - 查找清空数组的最小操作数