我试图在iOS中使用RSA2048并且正在关注Apple的example codes以及此问题RSA implementations in Objective C。我已经使用iOS 8.4.1在iPhone 5c上进行了测试,但是样本代码在使用私钥解密时失败,错误代码为-9809(遇到基础加密错误),即使使用公钥加密也是如此。我理解基本方法是生成一个RSA密钥对,将它们保存在密钥链中,并使用公钥ref加密和私钥解密。我完全失去了为什么解密失败,并不总是,有时解密成功。
可在https://gist.github.com/aceisScope/372e6d6f92650ce03624找到完整代码。抛出错误的解密部分如下,其中有时状态= -9809,其他时候它起作用并返回0:
status = SecKeyDecrypt(privateKey,
PADDING,
cipherBuffer,
cipherBufferSize,
plainBuffer,
&plainBufferSize
);
我还设置了一个检查,如果已经生成了这样的密钥对,下次加密/解密被调用时,它将直接使用密钥链中已经生成并存储的密钥对而不生成新的密钥对。
更新: 我遇到了这篇文章iPhone Public-Key Encryption SecKeyEncrypt returns error 9809 (errSSLCrypto),发现错误的密码缓冲区大小可能会导致-9809错误加密。然而,即使我确保加密中的密码缓冲区大小和解密中的普通缓冲区大小都与密钥块大小和私钥块大小相同,加密始终有效,但解密失败时不时。
答案 0 :(得分:0)
我发现了问题。在加密结束时,将密码缓冲区转换为NSData时,在以下代码中
NSMutableData *data=[[NSMutableData alloc] init];
[data appendBytes:cipherBuffer length:strlen( (char*)cipherBuffer ) + 1];
长度不正确。它应该是密码缓冲区的大小,与密钥块大小相同。 所以在将其改为
之后NSData *data = [NSData dataWithBytes:cipherBuffer length:cipherBufferSize];
解密现在有效。