最常用的是MD5和base64编码,还有DES 3DES AES加密
ios怎么实现RAS加密解密
最近几天折腾了一下如何在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/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");}
时间: 2024-08-09 05:39:31