2级RSA加密

时间:2014-09-08 06:48:23

标签: ios encryption cryptography rsa

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

我正在使用iOS安全框架来做同样的事情。第一级加密工作正常,但是当我尝试使用第二个公钥再次加密第一步的输出时,完整性检查无法返回-50。 我假设这是由于加密所需文本的缓冲区大小较小的原因。但我不确定要改变什么参数来实现相同的目标。我尝试将填充从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 个答案:

答案 0 :(得分:0)

此问题现已解决,已更改密钥用于加密的顺序。尺寸较小的一个现在首先用于加密,然后用于第二个。