ios - SecKeyDecrypt 在 iOS 中并不总是使用 RSA 解密

标签 ios security encryption rsa

我正在 .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/

相关文章:

ios - 没有填充的画圈 IOS

iOS - 显示带有签名的 PDF

php - 为什么 PHP crypt() 将盐添加到散列中?

c++ - 我如何在 C++ 的 Caesar Cipher 程序中包含空格?

ruby - 在 Ruby 中实现 gpg 加密

ios - 使用扩展创建 socket 在 UITableViewCell 中表现得很奇怪

iphone - 未调用 viewForZoomingInScrollView 以支持缩放

java - 使用 Ajax 和基于 Java 的服务器的 Web 应用程序 - 安全相关

javascript - 有什么方法可以检测用户是否从本地存储中删除了任何项目

java - JAVA中快速简单的字符串加密/解密