作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在 .NET 中使用 RSACrpytoServiceProvider 来使用 iOS 生成的公钥加密数据。在iOS端,使用相同的私钥,有时解密成功有时不成功。我在 .NET 中使用相同的公钥创建不同的密文,并使用 Base64 编码传递它。在 iOS 中,我解码 Base64 并将此方法作为内容发送。我使用 SecKeyGeneratePair 生成 key 对。我在生成之前删除了具有相同标签的 key 对。SecKeyDecrypt 返回的错误是:OSStatus return error code -9809 operation could not be completed.
可能是什么问题?
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);
最佳答案
经过一番挖掘,我意识到从 publickey 中提取的模数是 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/
我是一名优秀的程序员,十分优秀!