Open ZanderDev opened 8 years ago
@ideawu demo 中 公私钥怎么生成的
@ZanderDev 我也遇到同样的问题,我看了一下代码
(SecKeyRef)addPrivateKey:(NSString *)key{ NSRange spos = [key rangeOfString:@"-----BEGIN RSA PRIVATE KEY-----"]; NSRange epos = [key rangeOfString:@"-----END RSA PRIVATE KEY-----"]; if(spos.location != NSNotFound && epos.location != NSNotFound){ NSUInteger s = spos.location + spos.length; NSUInteger e = epos.location; NSRange range = NSMakeRange(s, e-s); key = [key substringWithRange:range]; } key = [key stringByReplacingOccurrencesOfString:@"\r" withString:@""]; key = [key stringByReplacingOccurrencesOfString:@"\n" withString:@""]; key = [key stringByReplacingOccurrencesOfString:@"\t" withString:@""]; key = [key stringByReplacingOccurrencesOfString:@" " withString:@""];
// This will be base64 encoded, decode it. NSData *data = base64_decode(key);
/_/ data = [RSA stripPrivateKeyHeader:data];//这个方法???? /_/
if(!data){ return nil; } ....... }
主要是上面方法中我注释的那行代码的问题,把那行代码注释掉,就可以解密成功,但是这样demo中的密钥就又不行了,这个方法我还不明白是干嘛的,希望作者可以解惑 @ideawu
又查了一些资料。 BEGIN RSA PRIVATE KEY is PKCS#1,里面只有RSA的私钥信息; BEGIN PRIVATE KEY is PKCS#8,除了私钥,还有些附加信息在前面,比如version和算法。 mac上用openssl生成的key第一种,而php生成的是第二种。所以我想上面提到的方法应该是为了还原key吧
@amazingYu 问题解决了,按照你提供的方案:注释“data = [RSA stripPrivateKeyHeader:data];”。非常感谢你的回答。👍
谢谢, 这个讨论应该对不少人有帮助.
也许可以通过判断来决定是否调用 stripPrivateKeyHeader(), 我会看看.
@ideawu 敬业福
@ZanderDev MAC下生成的私钥不能直接被使用,需要进行PKCS#8编码 编码之后就可以了 pkcs8 -topk8 -in rsa_private_key.pem -out pkcs8_rsa_private_key.pem -nocrypt
发现你们说的注释 data = [RSA stripPrivateKeyHeader:data]; 这行代码最终可行。最终的问题是判断 if (0x04 != c_key[idx++]) return nil; 这个判断的问题
生成方法 参考 http://blog.csdn.net/lvxiangan/article/details/45318443
生成的公钥私钥如下