我们正在实现使用SRA协议的Mental Poker加密算法。在此过程中,我们将使用BIGNUM的openSSL库http://www.openssl.org/docs/crypto/bn.html,但是我在将加密卡添加到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]));
}
在 for 循环中的打印语句输出了 52 个不同的值(每张牌一个)。原本我希望这些值只是被简单地添加到数组 encryptedDeck 中,但是当我在循环结束后检查这些值时,它们全部等于第 52 张牌。出现了什么问题导致每个新牌的索引都被覆盖了呢?或者是其他奇怪的情况?
处理结构体数组时是否有一些显而易见的事情被忽略了?我能想到的唯一可能就是数组没有足够的空间被初始化。
我认为可以把 BIGNUM 值转换为 char* 并以这种方式存储到数组中,但我尝试避免这样做,因为我不知道指针需要多大,也无法猜测它们的范围。类似于:
char encryptedDeck[52][something ridiculous];
我省略了一些代码,但我相信这仍然可以编译(只要您有openssl库,并在编译时链接它),并为我没有初始化的所有其他BIGNUM指针填充BN_new()。