我正在 .NET 中使用 RSACrpytoServiceProvider 通过 iOS 生成的公钥来加密数据。
在iOS端,使用相同的私钥,有时解密成功有时不成功。我在 .NET 中使用相同的公钥创建不同的密文,并使用 Base64 编码传递它。在 iOS 中,我解码 Base64 并将此方法作为内容发送。
我使用 SecKeyGeneratePair 生成 key 对。我在生成之前删除了具有相同标签的 key 对。
SecKeyDecrypt返回的错误是:OSStatus返回错误代码-9809操作无法完成。
可能是什么问题?
size_t cipherBufferSize = [content length];
void *cipherBuffer = malloc(cipherBufferSize);
[content getBytes:cipherBuffer length:cipherBufferSize];
size_t plainBufferSize = [content length];
uint8_t *plainBuffer = malloc(plainBufferSize);
OSStatus sanityCheck = SecKeyDecrypt(key,
kSecPaddingPKCS1,
cipherBuffer,
cipherBufferSize,
plainBuffer,
&plainBufferSize);
最佳答案
经过一番挖掘, 我意识到从公钥中提取的模数是 129 字节。它必须是 128。我使用 getPublicKeyModFromKeyData 方法来提取模数。 我发现这在开头增加了一个额外的字节。我删除了那个字节现在它可以工作了。感谢您的帮助。
- (NSData *)getPublicKeyModFromKeyData:(NSData*)pk
{
if (pk == NULL) return NULL;
int iterator = 0;
iterator++; // TYPE - bit stream - mod + exp
[self derEncodingGetSizeFrom:pk at:&iterator]; // Total size
iterator++; // TYPE - bit stream mod
int mod_size = [self derEncodingGetSizeFrom:pk at:&iterator];
// return [pk subdataWithRange:NSMakeRange(iterator, mod_size)];
NSData* subData=[pk subdataWithRange:NSMakeRange(iterator, mod_size)];
return [subData subdataWithRange:NSMakeRange(1, subData.length-1)];
}
关于ios - SecKeyDecrypt 在 iOS 中并不总是使用 RSA 解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29147812/