ios 公钥字符串怎么加密解密

 我来答
137******04
2017-07-09 · 超过177用户采纳过TA的回答
知道答主
回答量:372
采纳率:0%
帮助的人:111万
展开全部

最近几天折腾了一下如何在iOS上使用RSA来加密。iOS上并没有直接的RSA加密API。但是iOS提供了x509的API,而x509是支持RSA加密的。因此,我们可以通过制作自签名的x509证书(由于对安全性要求不高,我们并不需要使用CA认证的证书),再调用x509的相关API来进行加密。接下来记录一下整个流程。

第一步,制作自签名的证书

  1. 最简单快捷的方法,打开Terminal,使用openssl(Mac OS X自带)生成私钥和自签名的x509证书。

  2. openssl req -x509 -out public_key.der -outform der -new -newkey rsa:1024 -keyout private_key.pem -days 3650

  3. 按照命令行的提示输入内容就行了。

  4. 几个说明:

  5. public_key.der是输出的自签名的x509证书,即我们要用的。

  6. private_key.pem是输出的私钥,用来解密的,请妥善保管。

  7. rsa:1024这里的1024是密钥长度,1024是比较安全的,如果需要更安全的话,可以用2048,但是加解密代价也会增加。

  8. -days:证书过期时间,一定要加上这个参数,默认的证书过期时间是30天,一般我们不希望证书这么短就过期,所以写上比较合适的天数,例如这里的3650(10年)。

  9. 事实上,这一行命令包含了好几个步骤(我研究下面这些步骤的原因是我手头已经由一个private_key.pem私钥了,想直接用这个来生成x509证书,也就是用到了下面的2-3)

  10. 1)创建私钥

  11. openssl genrsa -out private_key.pem 1024

  12. 2)创建证书请求(按照提示输入信息)

  13. openssl req -new -out cert.csr -key private_key.pem

  14. 3)自签署根证书

  15. openssl x509 -req -in cert.csr -out public_key.der -outform der -signkey private_key.pem -days 3650

  16. 2.验证证书。把public_key.der拖到xcode中,如果文件没有问题的话,那么就可以直接在xcode中打开,看到证书的各种信息。

第二步,使用public_key.der来进行加密。

  1. 导入Security.framework。

  2. 2.把public_key.der放到mainBundle中(一般直接拖到Xcode就行啦)。

  3. 3.从public_key.der读取公钥。

  4. 4.加密。

  5. 下面是参考代码(只能用于加密长度小于等于116字节的内容,适合于对密码进行加密。使用了ARC,不过还是要注意部分资源需要使用CFRealse来释放)

  6. RSA.h

  7. //

  8. //  RSA.h

  9. //

  10. #import <Foundation/Foundation.h>

@interface RSA : NSObject {

SecKeyRef publicKey;

SecCertificateRef certificate;

SecPolicyRef policy;

SecTrustRef trust;

size_t maxPlainLen;

}


- (NSData *) encryptWithData:(NSData *)content;

- (NSData *) encryptWithString:(NSString *)content;


@end


RSA.m

//

//  RSA.m

//

#import "RSA.h"


@implementation RSA


- (id)init {

self = [super init];

NSString *publicKeyPath = [[NSBundle mainBundle] pathForResource:@"public_key"

ofType:@"der"];

if (publicKeyPath == nil) {

NSLog(@"Can not find pub.der");

return nil;

}

NSDate *publicKeyFileContent = [NSData dataWithContentsOfFile:publicKeyPath];

if (publicKeyFileContent == nil) {

NSLog(@"Can not read from pub.der");

return nil;

}

certificate = SecCertificateCreateWithData(kCFAllocatorDefault, ( __bridge CFDataRef)publicKeyFileContent);

if (certificate == nil) {

NSLog(@"Can not read certificate from pub.der");

return nil;

}

policy = SecPolicyCreateBasicX509();

OSStatus returnCode = SecTrustCreateWithCertificates(certificate, policy, trust);

if (returnCode != 0) {

NSLog(@"SecTrustCreateWithCertificates fail. Error Code: %ld", returnCode);

return nil;

}

SecTrustResultType trustResultType;

returnCode = SecTrustEvaluate(trust, trustResultType);

if (returnCode != 0) {

NSLog(@"SecTrustEvaluate fail. Error Code: %ld", returnCode);

return nil;

}

publicKey = SecTrustCopyPublicKey(trust);

if (publicKey == nil) {

NSLog(@"SecTrustCopyPublicKey fail");

return nil;

}

maxPlainLen = SecKeyGetBlockSize(publicKey) - 12;

return self;

}


- (NSData *) encryptWithData:(NSData *)content {

size_t plainLen = [content length];

if (plainLen > maxPlainLen) {

NSLog(@"content(%ld) is too long, must < %ld", plainLen, maxPlainLen);

return nil;

}

void *plain = malloc(plainLen);

[content getBytes:plain 

length:plainLen];

size_t cipherLen = 128; // 当前RSA的密钥长度是128字节

void *cipher = malloc(cipherLen);

OSStatus returnCode = SecKeyEncrypt(publicKey, kSecPaddingPKCS1, plain, 

plainLen, cipher, cipherLen);

NSData *result = nil;

if (returnCode != 0) {

NSLog(@"SecKeyEncrypt fail. Error Code: %ld", returnCode);

}

else {

result = [NSData dataWithBytes:cipher 

length:cipherLen];

}

free(plain);

free(cipher);

return result;

}


- (NSData *) encryptWithString:(NSString *)content {

return [self encryptWithData:[content dataUsingEncoding:NSUTF8StringEncoding]];

}


- (void)dealloc{

CFRelease(certificate);

CFRelease(trust);

CFRelease(policy);

CFRelease(publicKey);

}


@end


使用方法:

RSA *rsa = [[RSA alloc] init];

if (rsa != nil) {

NSLog(@"%@",[rsa encryptWithString:@"test"]);

}

else {

NSLog(@"init rsa error");

}

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式