2

Apple Developer サイトで提供されている例に基づいて、iOS アプリケーションに publickey privatekey RSA 暗号化を実装しました。

uint8_t cipherBufferを暗号化して返し、から復号化すると完全に機能しuint8_t cipherBufferます。ただし、暗号化されたデータを として.xcdataモデルに保存する必要がありNSDataます。

私が抱えている問題は、復号化するときに確実に変換uint8_t cipherBufferNSDataたり、NSData元に戻したりすることです。uint8_t復号化されたデータは切り捨てられているようです。

uint8_tこれは、暗号化されたバッファをNSData次のように変換する方法です。

return [NSData dataWithBytesNoCopy:cipherBuffer length:BUFFER_SIZE];

これは、暗号化を復号化するときに、暗号化されNSDataたものをバッファに変換する方法です。uint8_t

uint8_t *cipherBuffer = (uint8_t*)[cipherText bytes];
4

3 に答える 3

4

jghとジョディに感謝します。

暗号化方法をバッファを「malloc」するように変更し、バイトをに書き込むいくつかのアプローチを試しましたが、最終的には次のようになりNSDataました。

return [NSData dataWithBytes:(const void *)cipherBuffer length:CIPHER_BUFFER_SIZE];

最終的に問題を修正したのuint8_tは、復号化方法での作成方法を変更することでした:

const uint8_t *cipherBuffer = (const uint8_t*)[data bytes];
于 2012-08-07T23:05:38.287 に答える
4

Without seeing how you're creating cipherBuffer, it's difficult to say exactly why it's not working. However, from the documentation on dataWithBytesNoCopy:

The returned object takes ownership of the bytes pointer and frees it on deallocation. Therefore, bytes must point to a memory block allocated with malloc.

If you're just declaring cipherBuffer as

uint8_t cipherBuffer[BUFFER_SIZE];

it may explain your problems. Instead, use malloc:

uint8_t* cipherBuffer = malloc(BUFFER_SIZE);
于 2012-08-05T21:34:33.250 に答える
1

生のポインターを与えてから、そのポインターを再利用しているように聞こえます。

dataWithBytesNoCopy:あなたが与えたポインタを保持したい。実際には、 で作成したポインタを渡す必要がありますmalloc。これは、データの処理が完了すると解放されるためです。

NSDataオブジェクトに所有権を取得させたくない場合は、 を使用する必要がありますdataWithBytesNoCopy:length:freeWhenDone:

于 2012-08-05T21:35:57.713 に答える