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