Ios 2级RSA加密

Ios 2级RSA加密,ios,encryption,cryptography,rsa,Ios,Encryption,Cryptography,Rsa,我在应用程序中要求使用2个不同的公钥进行2级RSA加密。 1) 使用第一个公钥加密明文。 2) 使用第二个公钥加密第一个的输出 我正在使用iOS安全框架来做同样的事情。第一级加密工作正常,但当我尝试使用第二个公钥再次加密第一步的输出时,健全性检查返回-50失败。 我假设这是由于缓冲区大小小于加密所需文本的原因。但我不确定要改变什么参数才能达到同样的效果。我尝试将padding从kSecPaddingPKCS1更改为其他类型,但没有提供所需的输出 以下是我的加密功能: + (NSData*)get

我在应用程序中要求使用2个不同的公钥进行2级RSA加密。 1) 使用第一个公钥加密明文。 2) 使用第二个公钥加密第一个的输出

我正在使用iOS安全框架来做同样的事情。第一级加密工作正常,但当我尝试使用第二个公钥再次加密第一步的输出时,健全性检查返回-50失败。 我假设这是由于缓冲区大小小于加密所需文本的原因。但我不确定要改变什么参数才能达到同样的效果。我尝试将padding从
kSecPaddingPKCS1
更改为其他类型,但没有提供所需的输出

以下是我的加密功能:

+ (NSData*)getRSAEncryptedText:(NSString*)plaintext withPublicKeyIdSuffix:(NSString*)idSuffix {

    SecKeyRef publicKey = NULL;

    NSString *publicKeyIdentifier = [NSString stringWithFormat:@"%@.%@",[[NSBundle mainBundle] bundleIdentifier], idSuffix];
    NSData * publicTag = [publicKeyIdentifier dataUsingEncoding:NSUTF8StringEncoding];

    NSMutableDictionary *queryPublicKey = [[NSMutableDictionary alloc] init];
    [queryPublicKey setObject:kSecClassKey forKey:kSecClass];
    [queryPublicKey setObject:publicTag forKey:kSecAttrApplicationTag];
    [queryPublicKey setObject:kSecAttrKeyTypeRSA forKey:kSecAttrKeyType];
    [queryPublicKey setObject:[NSNumber numberWithBool:YES] forKey:kSecReturnRef];

    SecItemCopyMatching((CFDictionaryRef)queryPublicKey, (CFTypeRef *)&publicKey);

    if (!publicKey)
    {
        if(publicKey) CFRelease(publicKey);

        return nil;
    }

    size_t cipherBufferSize = SecKeyGetBlockSize(publicKey);

    SecPadding kTypeOfWrapPadding = kSecPaddingPKCS1;
    //  SecPadding kTypeOfWrapPadding = kSecPaddingNone;

    uint8_t* cipherBuffer = malloc( cipherBufferSize * sizeof(uint8_t) );
    memset((void *)cipherBuffer, 0x0, cipherBufferSize);

    OSStatus sanityCheck = noErr;

    // Encrypt using the public key.
    sanityCheck = SecKeyEncrypt(publicKey,
                                kTypeOfWrapPadding,
                                (const uint8_t *)[[plaintext dataUsingEncoding:NSUTF8StringEncoding] bytes],
                                [[plaintext dataUsingEncoding:NSUTF8StringEncoding] length],
                                cipherBuffer,
                                &cipherBufferSize
                                );

    if (sanityCheck != noErr) {
        //NSLog(@"error with encryption");
        free(cipherBuffer);
        return nil;
    }

    NSData *encryptedData = [NSData dataWithBytes:cipherBuffer length:cipherBufferSize];

    return encryptedData;
}

请建议如何实现第二级加密。

问题现在已经解决,您已经改变了密钥用于加密的顺序。大小较小的一个先用于加密,然后用于第二个。

似乎很疯狂,但唯一的可能是1)第二个模数大于第一个模数,2)使用
kSecPaddingNone
进行第二次加密。-50:“传递给函数的一个或多个参数无效。”检查它们,找出哪一个。第一次加密输出的数据大小是多少,第二个密钥允许加密的最大大小是多少?请记住,使用PKCS1填充时,输入数据必须比SecKeyGetBlockSize小11字节。@GregS如果两个模足够接近(例如,两个模都有256个前导1位),则即使第一个模更大,它也会以压倒性的概率工作。(虽然我不明白你们为什么要这么做)@GregS同意你们的意见,但这是要求。是的,正如您在第1)点中提到的,如果第二个公钥大于第一个公钥,它将正常工作,因为它将满足msg小于加密密钥的要求