SecKeyEncryptJSON形式の文字列を入力として使用しています。SecKeyEncrypt246 未満の 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);
蓄積された暗号化されたデータを返します。
}