4

RSA_public_encrypt()を使用して公開鍵でプレーンテキストを暗号化しようとしています。このデータは検証のためにリモートサーバーに送信されます。RSA_public_encryptの出力をRSA_private_decryptに渡すことができ、それが機能するため、暗号化/復号化が機能していると思います。私が今抱えている問題は、HTTP経由でデータを送信するためにデータをbase64エンコードする必要があることです。

テストとして(サーバーに送信する前に)、RSA_public_encrypt()の出力をbase64にエンコードしてから、デコードしてRSA_private_decrypt()に戻します。これは時々機能するように見え、次のようなエラーで失敗します。

error:0407A079:rsa routines:RSA_padding_check_PKCS1_OAEP:oaep decoding error

memcmpを使用して元のデータ(base64より前)をbase64デコード関数の出力と比較すると、内容が一致しているように見えても-1を受け取ります(Visual Studioではメモリの内容を16進数で表示します)。また、さまざまなオンラインツールでbase64でエンコードされたバージョンを確認しましたが、期待値にデコードされているようです。

base64 / unbase64関数からの入力/出力がnullで終了していることを再確認しましたが、ほとんど違いがないようです。

私はこの問題を数日間繰り返してきましたが、base64のエンコード/デコードプロセスでは、すべてが機能するため、問題があるはずです。これがどのように発生する可能性があるかについて誰かがアドバイスを持っているなら、それはありがたいです。

OpenSSLバージョン: 1.0.1c

プラットフォーム: Windows / MSVC

Base64コード:

char *base64(const unsigned char *input, int length)
{
  BIO *bmem, *b64;
  BUF_MEM *bptr;
  char *buff = NULL;

  b64 = BIO_new(BIO_f_base64());
  BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
  bmem = BIO_new(BIO_s_mem());
  b64 = BIO_push(b64, bmem);
  BIO_write(b64, input, length);
  BIO_flush(b64);
  BIO_get_mem_ptr(b64, &bptr);

  buff = (char *)malloc(bptr->length+1);
  memcpy(buff, bptr->data, bptr->length);
  buff[bptr->length] = '\0';

  BIO_free_all(b64);

  return buff;
}

Unbase64コード:

char *unbase64(unsigned char *input, int length)
{
  BIO *b64, *bmem;

  char *buffer = (char *)malloc(length+1);
  memset(buffer, 0, length+1);

  b64 = BIO_new(BIO_f_base64());
  BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
  bmem = BIO_new_mem_buf(input, length);
  bmem = BIO_push(b64, bmem);

  BIO_read(bmem, buffer, length);
  buffer[length] = '\0';

  BIO_free_all(bmem);

  return buffer;
}

暗号化された「helloworld」の例:

š:Œ¼JŒ"ÌïëŸÔè#¢Oo‚À–    œê\çrú¿±a/8ƒòÌ¢Q\T¹]nío

Base64バージョン(上記のコードを使用):

G5qdOgWMvEqMIswZ7+uf1OgPI6JPb4LAlgmc6lzncvq/sWEvOIPyzByiUVwMjYFUuV0Vbu1v

助けてくれてありがとう!

4

1 に答える 1

0

関数で正しいサイズを渡していunbase64ますか?これは、宛先バッファーのサイズではなく、返されるbase64バッファーのサイズである必要があります。つまり、メイン関数の例を使用します。

int main(void)
{
  unsigned char bufron[2000];
  int i;
  char *chab;
  unsigned char *chac;

  for (i = 0; i < 2000; i++) {
      bufron[i] = i % 255;
  }

  chab = base64(bufron, 2000);
  printf("%s\n", chab);

  chac = unbase64(chab, strlen(chab));

  for (i = 0; i < 2000; i++) {
      if (bufron[i] != chac[i]) {
          printf("Failed at %d\n", i);
          return (1);
      }
  }
}
于 2012-05-27T14:59:55.130 に答える