SecKeyEncrypt
JSON形式の文字列を入力として使用しています。SecKeyEncrypt
246 未満の plainTextLength を渡すと、機能します。246 以上の長さを渡すと、戻り値: で失敗しますparamErr (-50)
。
文字列自体の問題かもしれません。私が送信する可能性のあるものの例SecKeyEncrypt
は次のとおりです。
{"handle":"music-list","sym_key":"MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALeaEO7ZrjgOFGLBzBHZtQuzH2GNDYMLWP+fIFNu5Y+59C6HECY+jt0yOXXom2mzp/WYYI/9G+Ig8OD6YiKv2nMCAwEAAQ==","app_id":"xgfdt.LibraryTestApp","api_key":"7e080f74de3625b90dd293fc8be560a5cdfafc08" }
245 番目の文字は「0」です。
この作業との間で変化する唯一の入力は、plainTextLength です。SecKeyGetBlockSize()
は 256 を返すので、最大 256 文字の長さの入力は機能するはずです。
これが私の暗号化方法です:
+ (NSData*)encrypt:(NSString*)data usingPublicKeyWithTag:(NSString*)tag { OSStatus ステータス = noErr; size_t cipherBufferSize; uint8_t *cipherBuffer; // [cipherBufferSize] size_t dataSize = 246;//[データ lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; const uint8_t* textData = [[data dataUsingEncoding:NSUTF8StringEncoding] バイト]; SecKeyRef publicKey = [暗号化 copyPublicKeyForTag:tag]; NSAssert(publicKey, @"タグによって参照されている公開鍵は、それを使用してデータを暗号化する前に、キーチェーンに格納されている必要があります!"); // バッファを割り当てます cipherBufferSize = SecKeyGetBlockSize(publicKey); // この値は変更されませんが、cipherBufferSize は変更される可能性があります。 const size_t fullCipherBufferSize = cipherBufferSize; cipherBuffer = malloc(cipherBufferSize); NSMutableData* AccumulatedEncryptedData = [NSMutableData dataWithCapacity:0]; // エラー処理 for (int ii = 0; ii*fullCipherBufferSize < dataSize; ii++) { const uint8_t* dataToEncrypt = (textData+(ii*fullCipherBufferSize)); const size_t subsize = (((ii+1)*fullCipherBufferSize) > dataSize) ? fullCipherBufferSize-(((ii+1)*fullCipherBufferSize) - dataSize) : fullCipherBufferSize; // 公開鍵を使用して暗号化します。 ステータス = SecKeyEncrypt( publicKey, kSecPaddingPKCS1、 dataToEncrypt、 サブサイズ、 暗号バッファ、 &cipherBufferSize ); [accumulatedEncryptedData appendBytes:cipherBuffer の長さ:cipherBufferSize]; } if (publicKey) CFRelease(publicKey); 無料 (cipherBuffer); 蓄積された暗号化されたデータを返します。 }