0

RSAを使用しているクライアント/サーバーソケットに何か奇妙なことがあります。ローカルホストでテストすると、すべてがうまくいきますが、クライアントをPCに配置し、サーバーを他のPCに配置すると、問題が発生します。

クライアントは接続を呼び出した後、サーバーとの公開鍵交換のメソッドを呼び出します。コードのこの部分は正常に機能します。この後、クライアントはサーバーにリクエストを送信します。

strcpy(send_pack->op, "help\n");
RSA_public_encrypt(strlen(send_pack->op), send_pack->op, 
        encrypted_send->op, rsa_server, padding);

rw_value = write(server, encrypted_send, sizeof (encrypted_pack));
if (rw_value == -1) {
    stampa_errore(write_error);
    close(server);
    exit(1);
}
if (rw_value == 0) {
    stampa_errore(no_response);
    close(server);
    exit(1);
}
printf("---Help send, waiting for response\n");
set_alarm();
rw_value = read(server, encrypted_receive, sizeof (encrypted_pack));
alarm(0);
if (rw_value == -1) {
    stampa_errore(read_error);
    exit(1);
}
if (rw_value == 0) {
    stampa_errore(no_response);
    close(server);
    exit(1);
}
RSA_private_decrypt(RSA_size(rsa), encrypted_receive->message, 
        receive_pack->message, rsa, padding);
printf("%s\n", receive_pack->message);
return;
}

ただし、サーバーがサーバー側で受信メッセージを復号化しようとすると、「ヘルプ」文字列は表示されません。これはネット上でのみ発生し、ローカルホストでは同じコードが正常に機能します...

編集:

typedef struct pack1 {
unsigned char user[encrypted_size];
unsigned char password[encrypted_size];
unsigned char op[encrypted_size];
unsigned char obj[encrypted_size];
unsigned char message[encrypted_size];
int id;
}encrypted_pack;

暗号化されたサイズは512で、使用されるパディングはRSA_PKCS1_PADDINGです。

4

1 に答える 1

0

あなたはあなたが全部を読んだと仮定しています、512 sizeof (encrypted_pack)バイト、一度に。これは常に発生するとは限りません。それより少なくなる可能性があるためread(2)、完全なアプリケーションメッセージが表示されるまでループする必要があります。

0を編集:

完全ではないメッセージを復号化しようとしています。TCPはバイトのストリームであり、そのように扱う必要があります。アプリケーションメッセージの境界については知りません。次のようなことをする必要があります。

char buffer[sizeof( encrypted_pack )];
size_t to_read = sizeof( encrypted_pack );
size_t offset = 0;

while ( true ) {
    ssize_t rb = ::read( fd, buffer + offset, to_read - offset );
    if ( rb == -1 ) { /* handle error */ }
    else if ( rb == 0 ) { /* handle EOF */ }
    else {
        offset += rb;
        to_read -= rb;
        if ( to_read == 0 ) break;
    }
}

// handle complete message in buffer

送信側でも同じことを行う必要があります-ループでソケットにバイトを書き込みます-。

その仮想インターフェイスのMTUは通常約16Kであるのに対し、通常のイーサネットでは1500であるため、ループバックを介して「機能」します。したがって、TCPはデータを1つのチャンクで転送します。しかし、あなたはそれに頼ることはできません。

于 2012-09-15T21:35:57.870 に答える