3

そのため、クリプト クラスでは、SRA プロトコルを使用してメンタル ポーカーを実装しています。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() を埋める必要があると思います。

4

1 に答える 1

2

forループのすぐ上:

BIGNUM *encryptedCard = BN_new();

これが指すものを変更することはありません。新しいデータを同じカードにドロップし続け、そのカードを 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、ループで同じ局所性が必要かどうかはわかりませんが、問題がどこにあるのかはわかりません。

于 2012-10-18T05:45:39.160 に答える