当前位置: 首页 > 知识库问答 >
问题:

为什么SecKeyEncrypt会为超过246字节的输入字符串返回paramErr(-50)?

杭令
2023-03-14
{"handle":"music-list","sym_key":"MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALeaEO7ZrjgOFGLBzBHZtQuzH2GNDYMLWP+fIFNu5Y+59C6HECY+jt0yOXXom2mzp/WYYI/9G+Ig8OD6YiKv2nMCAwEAAQ==","app_id":"xgfdt.LibraryTestApp","api_key":"7e080f74de3625b90dd293fc8be560a5cdfafc08"}
+ (NSData*)encrypt:(NSString*)data usingPublicKeyWithTag:(NSString*)tag
{

    OSStatus status = noErr;

    size_t cipherBufferSize;
    uint8_t *cipherBuffer;

    // [cipherBufferSize]
    size_t dataSize = 246;//[data lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
    const uint8_t* textData = [[data dataUsingEncoding:NSUTF8StringEncoding] bytes];

    SecKeyRef publicKey = [Encryption copyPublicKeyForTag:tag];

    NSAssert(publicKey, @"The public key being referenced by tag must have been stored in the keychain before attempting to encrypt data using it!");

    //  Allocate a buffer

    cipherBufferSize = SecKeyGetBlockSize(publicKey);
    // this value will not get modified, whereas cipherBufferSize may.
    const size_t fullCipherBufferSize = cipherBufferSize;
    cipherBuffer = malloc(cipherBufferSize);

    NSMutableData* accumulatedEncryptedData = [NSMutableData dataWithCapacity:0];

    //  Error handling

    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;

        // Encrypt using the public key.
        status = SecKeyEncrypt(    publicKey,
                               kSecPaddingPKCS1,
                               dataToEncrypt,
                               subsize,
                               cipherBuffer,
                               &cipherBufferSize
                               );

        [accumulatedEncryptedData appendBytes:cipherBuffer length:cipherBufferSize];
    }

    if (publicKey) CFRelease(publicKey);

    free(cipherBuffer);

    return accumulatedEncryptedData;
}

共有1个答案

公良飞尘
2023-03-14

从文档中:

PlainTextLen
明文缓冲区中数据的长度(以字节为单位)。这必须小于或等于SecKeyGetBlockSize函数返回的值。当执行PKCS1填充时,可以加密的数据的最大长度比SecKeyGetBlockSize函数返回的值(SecKeyGetBlockSize()-11)少11个字节。

(强调我的)

 类似资料:
  • 问题内容: 这是有效的,并返回JavaScript中的字符串 为什么?这是怎么回事 问题答案: 如果我们将其拆分,则混乱等于: 在JavaScript中,确实是这样。将某物转换为数字,在这种情况下,它将降为或(请参见下面的规范详细信息)。 因此,我们可以简化它(优先于): 因为意思是:从中获取第一个元素,所以确实: 返回内部数组()。由于引用,说错了,但是让我们调用内部数组以避免错误的表示法。 在

  • 情况是这样的。我正在根据从数据库获取的数据动态生成要在JPanel上显示的组件。系统会提示用户输入一个整数,并根据该整数进行一些计算。输出应以十进制值形式给出。因此,我将答案分配给了一个double,并使用decimalformat进行格式化。 当我将double值传递给DecimalFormat的format()方法时,即使我没有输入任何值为0,也会出现错误。 生成错误的代码段, 请考虑变量和是

  • 问题内容: 我有一个带有3个嵌套数组的简单php结构。 我不使用特定的对象,而是使用2个嵌套循环构建数组。 这是我要转换为Json的数组的var_dump的示例。 在另一个脚本中,我具有类似的结构并且工作正常。所以我不明白为什么在这里不起作用。 编辑:似乎有编码问题。当返回ASCII,该作品但当它返回UTF8,它不工作了。 Edit2:返回表示:格式错误的UTF-8字符,可能编码不正确。 问题答案

  • 问题内容: 这可能是最简单的事情之一,但我看不到自己在做错什么。 我的输入包括一个带有数字的第一行(要读取的行数),一串包含数据的行和最后一行仅包含\ n的行。我应该处理此输入,并在最后一行之后做一些工作。 我有这个输入: 对于读取输入,我有以下代码。 我的问题是为什么我什么都不打印?程序读取第一行,然后不执行任何操作。 问题答案: 不读取以下换行符,因此第一个(返回 当前 行的其余部分 )将始终

  • 为什么返回而不是像或这样的较小类型?我的理解是,这个方法只返回-1、0或1。 第二部分,如果我要设计一个比较方法来比较两个类型的对象,并且我只想返回-1、0或1,那么使用或通常是个好主意吗? 编辑:我已经更正,不返回-1,0或1,它实际上返回一个值 答案似乎大致是,没有理由返回小于的类型,因为返回值是右值,而这些右值不会受益于小于int类型(4字节)。此外,许多人指出,大多数系统的寄存器可能会有大

  • 这可能是最简单的事情之一,但我没有看到我做错了什么。 我的输入包括第一行带有数字(要读取的行数),一堆带有数据的行和最后一行只带有\n。我应该处理这个输入,在最后一行之后,做一些工作。 我有这样的意见: 为了读取输入,我有以下代码。 我的问题是为什么我不打印任何东西?程序读取第一行,然后什么也不做。