私は、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配列に格納されたすべてのヘルプが理解されます。ご迷惑をおかけして申し訳ありません。
あなたのループ「安全な入力を提供する」は安全ではありません。バッファオーバーフローやEOFのテストは行いません。 Cは安全に行を読むためのfgets()を提供します。 –
入力をプレーンにコピーするループはひどく非効率です。それはコピーされた各文字に対してstrlen()を呼び出します。これは何千もの文字列のdiredです。長さをチェックしたstrcpy()またはstrcpy_s()を使用するか、ピンチでstrncpy()を使用してください。 –
おそらく、入力をトークン化して「プレーン」に値を設定するコードを除外すべきではないでしょう。おそらく関連性があります。解読段階では、それはおそらく関連しているでしょう:IVをどのように埋めるのですか? – jettero