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