iOS使用openSSL加密应该怎么做

iOS使用openSSL加密应该怎么做,第1张

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

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

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

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

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

几个说明:

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

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

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

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

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

1)创建私钥

openssl genrsa -out private_key.pem 1024

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

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

3)自签署根证书

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

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

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

1.导入Security.framework。

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

3.从public_key.der读取公钥。

4.加密。

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

RSA.h

//

// RSA.h

//

#import 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")

}

Xcode自带gcc编译器,但是安装了Xcode以后需要安装Command Line Tools才能在命令行使用!方法是:打开Xcode 选择偏好设置(Preference),然后选择Downloads选项卡,安装一下Command Line Tools就可以在命令行使用了。

环境:macbook、终端、XCode、openssl1.1.1a

环境:macbook、终端、XCode、openssl1.1.1a

环境:macbook、终端、XCode、openssl1.1.1a

重要的事儿要说三遍...

【下一篇:openssl 自签名证书 - 制作证书(二)】


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11263106.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-14
下一篇 2023-05-14

发表评论

登录后才能评论

评论列表(0条)

保存