1

問題があります。http://slproweb.com/products/Win32OpenSSL.htmlを使用すると、暗号化を初期化しようとしますが、常に次のようなエラーが発生します

「OpenSSL アサーションが失敗しました、evp_enc.c(282)」

誰かがこの件で私を助けてくれますか?

私のコード:

bool do_encrypt(const char *in, unsigned char *out, int *outlen, unsigned char *key, unsigned char *iv)
{
  int buflen, tmplen;

  EVP_CIPHER_CTX ctx;
    EVP_CIPHER_CTX_init(&ctx);
    EVP_EncryptInit_ex(&ctx, EVP_rc4(), NULL, key, iv);

  if(!EVP_EncryptUpdate(&ctx, out, &buflen, (unsigned char*)in, strlen(in))) // error here
    {
        return false;
  }

  if(!EVP_EncryptFinal_ex(&ctx, out + buflen, &tmplen))
    {
        return false;
  }

  buflen += tmplen;
  *outlen = buflen;
    EVP_CIPHER_CTX_cleanup(&ctx);

  return true;
}

テストに使用keyする {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}ivは NULL です。

上記のこの関数を使用するコード:

int WINAPI OwnSend(SOCKET s, const char FAR *buff, int len, int flags )
{
    if(s == ServerSocket)
    {
        if(len > 0)
        {
            int outlen;
            unsigned char EncryptBuffer[5500];
            do_encrypt(buff, EncryptBuffer, &outlen, KeyTest, NULL);
            buff = (const char *) EncryptBuffer;
            return pTrampolineSend(s, buff, outlen, flags);
        }
    }
    return pTrampolineSend(s, buff, len, flags);
}

ありがとう!

4

1 に答える 1

1

の唯一のアサーションはEVP_EncryptUpdate、バッファー長が暗号化アルゴリズムのブロック サイズ以下であることをアサーションするものです。

入力のサイズとして呼び出す代わりにstrlen(in)、ループEVP_EncryptUpdateを試して、通過するたびに、次のように入力サイズを制限してください。

int in_size_limit = EVP_CIPHER_CTX_block_size(&ctx);

ループ中に、2 番目と 4 番目の引数のオフセットを、既に暗号化したバイト数だけインクリメントしてください。

if ( EVP_EncryptUpdate(&ctx,
                       out+encrypted_bytes,
                       &bytes_encrypted_this_call,
                       in+encrypted_bytes,
                       in_size_limit) != 1)
{
    /* error */
}
else
{
    encrypted_bytes += bytes_encrypted_this_call;
}
于 2012-11-13T15:35:03.110 に答える