0

そのため、暗号を格納している char 配列の末尾に暗号テキストの長さを追加しようとしています

...
int cipherTextLength = 0;
unsigned char *cipherText = NULL;
...
EVP_EncryptFinal_ex(&encryptCtx, cipherText + cipherTextLength, &finalBlockLength);
cipherTextLength += finalBlockLength;
EVP_CIPHER_CTX_cleanup(&encryptCtx);

// Append the length of the cipher text onto the end of the cipher text
// Note, the length stored will never be anywhere near 4294967295 
char cipherLengthChar[1];
sprintf(cipherLengthChar, "%d", cipherTextLength);
strcat(cipherText, cipherLengthChar);
printf("ENC - cipherTextLength: %d\n", cipherTextLength);
...

strcat問題は、バイナリ データを扱うときに問題なく使用できるとは思えないことです。誰かがこれを行うためのより良い方法を提案できますか?

ありがとう!

編集

わかりましたので、長さを追加しようとした理由について少し説明を加えます。私のencrypt関数では、関数は暗号化されEVP_EncryptUpdateている長さを必要とします。plainTextこちらの方がはるかに入手しやすいので、この部分は問題ありません。ただし、同様にEVP_DecryptFinal_exdecrypt関数で使用するには、復号化される長さがciperText必要になるため、どこかに保存する必要があります。

これを実装しているアプリケーションでは、不適切なハッシュを適切な暗号化に変更するだけです。さらに手間を加えると、アプリケーションでは、まず XML から読み取った情報を復号化し、何かを実行してから、暗号化して再度 XML に書き換える必要があるため、この暗号の長さを何らかの形で暗号に格納する必要があります。また、これを再設計する余地もありません。

4

3 に答える 3

0

必要なテキストを格納するために、cipherText と cipheLegthChar の両方に十分な大きさの配列があることを願っています。したがって、代わりに

unsigned char *cipherText = NULL;

あなたが持つことができます

unsigned char cipherText[MAX_TEXT];

同様に

cipherLenghthChar[MAX_INT];

または、それらを動的に割り当てることができます。

ここで、MAX_TEXT と MAX_INT は、テキストと整数を格納するための最大バッファー サイズです。また、EVP_EncryptFinal_ex NULL の最初の呼び出しの後、cipherText を終了して、strcat が機能するようにします。

于 2013-08-30T09:31:12.443 に答える