6

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);

    蓄積された暗号化されたデータを返します。
}
4

1 に答える 1

9

ドキュメントから:

plainTextLen プレーン
テキスト バッファ内のデータの長さ (バイト単位)。これは、SecKeyGetBlockSize 関数によって返される値以下である必要があります。PKCS1 パディングが実行される場合、暗号化できるデータの最大長は、SecKeyGetBlockSize 関数によって返される値 (secKeyGetBlockSize() - 11) よりも 11 バイト少なくなります。

(私のものを強調)

PKCS1 パディングを使用しています。したがって、ブロック サイズが 256 の場合、一度に暗号化できるのは 245 バイトまでです。

于 2013-01-10T00:08:14.010 に答える