0

以前の投稿に関連していますが、その複製ではありません。今、私は何かを試してみました

ここで、コードの論理エラーについてお尋ねします。

/*u_int8_t ....etc are alias for uint8_t...etc so don't bother about them*/

void crypt(u_int8_t *key, u_int32_t keylen,
    u_int8_t *data, u_int32_t datalen)
{
    FILE *fp,*fq;

    fp=fopen("key","w");
    fputs((char *)key,fp);
    fq=fopen("file.txt","w");
    d=0;
    while(data[d]) {
        fputc((int)data[d],fq);
        d++;
    }
    fputc('\0',fq);

    fclose(fp);
    fclose(fq)
}

出力:

udit@udit-Dabba ~/Downloads/sendip-2.5-mec-2/mec $ cat key 
kaheudit@udit-Dabba ~/Downloads/sendip-2.5-mec-2/mec $ cat file.txt 
udit@udit-Dabba ~/Downloads/sendip-2.5-mec-2/mec $

キーはファイルに出力されますが、データには出力されません。

コードを少し変更すると、次のようになります。

void
crypt(u_int8_t *key, u_int32_t keylen,
    u_int8_t *data, u_int32_t datalen)
{

    int d,k;
    FILE *fp,*fq;

    fp=fopen("key","w");
    fputs((char *)key,fp);

    fq=fopen("file.txt","w");
    for (d=0, k=0; d < datalen; ++d, k = (k+1)%keylen) {
          data[d] ^= key[k];
          fputc(data[d],fq);
    }

    fclose(fp);
    fclose(fq);

}

キーとデータが印刷されるようになりました...データは正確ではありませんが(ただし、ファイルに書き留めることはできます)

udit@udit-Dabba ~/Downloads/sendip-2.5-mec-2/mec $ cat key 
kaheudit@udit-Dabba ~/Downloads/sendip-2.5-mec-2/mec $ cat file.txt 
kthpOWWkahe;c��"�he
kajcudit@udit-Dabba ~/Downloads/sendip-2.5-mec-2/mec $

crypt 関数の呼び出しは次のとおりです。

  bool
  espcrypto(esp_private *epriv, sendip_data *data, sendip_data *pack)
  {
      u_int32_t keylen;
      u_int8_t *key;
      static u_int8_t fakekey;
      struct ip_esp_hdr *esp = (struct ip_esp_hdr *)pack->data;

      if (!epriv->keylen) {   /* This isn't going to be very productive... */
          key = &fakekey;
          keylen = 1;
      } else {
          key = (u_int8_t *)epriv->key;
          keylen = epriv->keylen;
      }

      /* Encrypt everything past the ESP header */
      crypt(key, keylen,
            (u_int8_t *)esp->enc_data,
             pack->alloc_len + data->alloc_len 
                 - sizeof(struct ip_esp_hdr));
      return TRUE;
  }

次のパケットは、実際にファイルに書き出す必要があるデータを記述しています...

udit@udit-Dabba ~/Downloads/sendip-2.5-mec-2/mec $ sendip -v -p ipv6 -dabcd -6s ::1 -p    
esp -es 0x20 -eq 0x40 -ek "kahe" -ec crypt.so -p tcp -ts 21 -td 21 ::2

Added 43 options
Initializing module ipv6
Initializing module esp
Initializing module tcp
Finalizing module tcp
Finalizing module esp
Finalizing module ipv6
Final packet data:
60 00 00 00   `...
00 24 32 20   .$2 
00 00 00 00   ....
00 00 00 00   ....
00 00 00 00   ....
00 00 00 01   ....
00 00 00 00   ....
00 00 00 00   ....
00 00 00 00   ....
00 00 00 02   ....
00 00 00 20   ... 
00 00 00 40   ...@
6B 74 68 70   kthp  /*data portion starts from here*/
4F 57 1F 57   OW.W
6B 61 68 65   kahe
3B 63 97 9A   ;c..
22 C0 68 65   ".he
0A 03 0B 01   ....
6B 61 6A 63   kajc  /*data portion ends here*/
Freeing module ipv6
Freeing module esp
Freeing module tcp

助けてください....以前の投稿で満足のいく実装を受け取っていないので、自分の手で試してみます.本当に必要です..

4

2 に答える 2

3

文字列セマンティクスを使用してバイナリ データを処理しています。それはうまくいきません。よく見ると、file.txt の出力例の最初の文字が であることがわかります。kこれは、キーの最初の文字でもあります。これは、データが NUL バイトで開始され、while ループが即座に終了することを意味します。

まず、ファイルをバイナリ モードで開く必要があります。

fp=fopen("key","wb");
fq=fopen("file.txt","wb");

キーの使用を書き込むには

fwrite(key, keylen, 1, fp);

次に、2 番目の例で for ループを使用してデータを書き込みます。あなたの問題は単にバイナリ対テキストモードだったのかもしれません。

編集: hexdump -C file.txtcat の代わりに使用してファイルを表示してみてください。

于 2011-10-01T18:08:25.373 に答える
0

ここ

while(data[d]) {
    fputc((int)data[d],fq);
    d++;
}

data[d] は 0 (バイナリ データであるため) であるため、「すぐに」ループを終了します。

于 2011-10-01T18:08:40.910 に答える