2009-04-16 12 views
1

私は、Boneh-FranklinのIDベースの暗号化を実装するプログラムを作成しています。実際の暗号化方法については、私が入手したBlowfishを使用しています(https://voltar.org/)。私はブローイングの暗号化/復号化コードを自分のプログラムに適応しようとしています。私のプログラムの違いは、標準入力からメッセージを読み取り、それを暗号化して印刷し、それを解読して解読することです(元のメッセージでなければなりません)。現在、私は入力メッセージを "?"サイトのコードに従ってください。ただし、解読は読めない文字として印刷されます。私はこの問題を解決しようとしましたが、私は立ち往生しました。手伝ってくれませんか? ***************Blowfish暗号化の適用上の問題

//this loop reads the input from the user since C does not 
//provide a safe function to read strings with white spaces 

while (in != '?'){ 
in=getchar(); 
if(in != '?') //dont include the delim character in the string 
     msg[q++]=in; 
} 
msg[q]='\0'; //truncate the string by the null character 

//initializations 

BF_KEY s_key;  //shared key of the blowfish encryption 
char plain[1000000]; //the plaintext of the message 
char cipher[1000000]; //the ciphertext of the message 
char byte;   //to hold the byte of the msg 
char *token;  //points to tokens of the msg 
char IV[8]="MY*IV000"; //the initialization vector 
int offset = 0;  //the offset of encryption 
int b_count = 0;  //number of bytes in d_buf 
char block[8];  //blocks of encryption 
char msg[1000000];  //the input msg from the user 
int j;   //used to read input in a loop with getchar 
int i;   //for-loop value 
int len;   //used to calculate lengths different variables 
int f;   //flag for the setup stage 
int q; //used to read input in a loop with getchar 
q=0; //reset the index reader 
char in; //to read characters 
printf("Please enter the message you wish to send:\n"); 

は************これは、入力メッセージを読むために私のコードです

************暗号化にコードを使用(引用と参照)しました**************

もちろん私はプログラムの引数

for(i=0; i<strlen(msg); i++) //copy the input message to plain 
    plain[i] = msg[i]; 

//set up the shared key of the BF encryption 

BF_set_key(&s_key, strlen(ekey_buf), ekey_buf);  

while(1){ 
    for(i=0; i<8; i++) //reinitiate the block of 8 characters each time 

     block[i] = 0; 
    strncpy(block, plain+offset, 8); 
    BF_cbc_encrypt(plain+offset, cipher, 8, &s_key, IV, BF_ENCRYPT); 
    for(i=0; i<strlen(cipher); i++){ 
    printf("%02x", (unsigned char) cipher[i]); 
} 
if(strlen(plain+offset)>8){ //if there is still more characters 
    offset += 8;   //process the next block of 8 characters 
} else 
     break;  
} 
//the cipher is correctly printed 

ない標準入力から読み込まれたメッセージ*********** *次に、解読にコードを使用しました。**************

ここでは、暗号をトークン化した部分を除外して、プレーンchar配列を作成しました。復号化、私は単に(これは暗号化関数から出力されるように)復号化する暗号アレイを通過し、かつ長さ=のSTRLEN(暗号)

//set up the shared key of the BF encryption 

BF_set_key(&s_key, strlen(dkey_buf), dkey_buf);   
BF_cbc_encrypt(cipher, plain, strlen(cipher), &s_key, IV, BF_DECRYPT); 

printf("plain after decryption: %s\n", plain); 
//HERE IS THE PROBLEM: I get unreadable characters as output of this line 

と無地char配列に格納されたすべてのヘルプが理解されます。ご迷惑をおかけして申し訳ありません。

+0

あなたのループ「安全な入力を提供する」は安全ではありません。バッファオーバーフローやEOFのテストは行いません。 Cは安全に行を読むためのfgets()を提供します。 –

+1

入力をプレーンにコピーするループはひどく非効率です。それはコピーされた各文字に対してstrlen()を呼び出します。これは何千もの文字列のdiredです。長さをチェックしたstrcpy()またはstrcpy_s()を使用するか、ピンチでstrncpy()を使用してください。 –

+1

おそらく、入力をトークン化して「プレーン」に値を設定するコードを除外すべきではないでしょう。おそらく関連性があります。解読段階では、それはおそらく関連しているでしょう:IVをどのように埋めるのですか? – jettero

答えて

1

私はそれが汚れたIVですが、それはちょうど推測です。

for(i=0; i<8; i++) ivec[i] = 'i'; 
BF_cbc_encrypt(inputz, outputz, strlen(inputz), &key, ivec, BF_ENCRYPT); 

// won't decrypt right: 
BF_cbc_encrypt(inputz, outputz, strlen(inputz), &key, ivec, BF_DECRYPT); 
// without resetting the ivec to all 'i's, the decryption will fail. 

// This would work though: 

for(i=0; i<8; i++) ivec[i] = 'i'; 
BF_cbc_encrypt(inputz, outputz, strlen(inputz), &key, ivec, BF_ENCRYPT); 

for(i=0; i<8; i++) ivec[i] = 'i'; 
BF_cbc_encrypt(inputz, outputz, strlen(inputz), &key, ivec, BF_DECRYPT); 

私の推測は、最初のブロック以降のすべてのブロックが正しく復号化される場合にのみ正しいと言えます。

strlen(inputz)のもう一つの大きな問題は、strlen()が8byteの境界に正確に当てはまらないと、あなたの解読は最終的に失敗するということです。私はこの問題をむしろ完全にgist on githubとして扱ってきました。

+1

IVを復号化する前に初期値にIVを再初期化しました。正常に動作します。 Jetteroに感謝します。 – user91613

1

エンコードを確認してください。

1

plainをnullにする必要があります。具体的にはplain[ strlen(dkey_buf) ] = 0などが必要です。

0

IBEアルゴリズムを利用するプログラムの使用/配布に関する特許制限はありませんか?

+0

おそらく輸出制限があります。あなたのプロジェクトが純粋に学術的なものであれば、特許の制限は問題にはなりません。あなたがそれからお金を稼ぐとき、...彼らは適用可能であれば訴えるでしょう。 彼がプログラム全体を投稿した場合、彼はおそらく犯罪的な方法で問題になる可能性があります。ベン・リンはStanfordのページでアドバイスを受けています。 – jettero

関連する問題