#import "ViewController.h"
#import <CommonCrypto/CommonCrypto.h>
#import "KeychainItemWrapper.h"
#import "RSA/RSA.h"
#import "Person.h"
#import "AppDelegate.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
/*
加密方式:
MD5加密 钥匙串加密 公钥私钥加密
移动端网络传输需要注意网络数据安全
MD5加密是一种时尚的加密方式,可被推算的可能性很小
这里使用MD5加密方式不同的方式有不同的方式,简单区分
首先需要引入类库
字符串可以直接使用MD5加密
字典数组等需要创建MD5对象初始化使用更新的方式加密步骤大体为
数据对象进行归档
创建MD5
初始化
更新加密
结束加密接收返回加密的内容
字符串转换接收加密内容
钥匙串加密是苹果推崇的,苹果规定,所有APP的账号密码以及无线等密码或者支付密码都是加入系统类库保存钥匙串
使用钥匙串很简单,和字典一样创建对象,然后使用set方法根据K存,根据K取值
这里需要注意的是,我使用的苹果官方提供的伪钥匙串类,因为钥匙串功能只有在真机才可以,再有你要使用钥匙串,K值是要使用系统给的,不能随意起,在取值的时候根据唯一为钥匙串对象的一个编码取值,然后再根据系统给的K取值才可以
公钥和私钥是指的,发送的密文是公有的加密方式但是你的解密方式是独有的 这里我使用可以个对三方的类库
这里设计到一个问题就是对称和非对称的问题,他们指的是,对称密钥,发出方的加密方式和接收方的解密方式是一样的,非对称是指的,发出方是一种加密方式,而接收方又是另一种解密方式,在安全度上,非对称更安全一点。
再有就是KVO,KVO机制指观察者的意思,创建对象,注册其为被观察者,那相应的就要有一个观察者,那就是KVO机制,当被观察者值发生改变的时候就会 触发一个固定事件从而做出一些响应,要使用KVO有很多需要注意的地方,比如你要重写固定方法,否则会崩溃,使用完观察者需要写移除等。实际使用还有很多 方便之处,自行探讨简单总结说明,具体使用看代码吧。
*/
//MD5加密
[self myMd5];
//钥匙串的加密
[self myKEY];
//公钥和私钥加密解密
[self EncryptionStr];
//KVO的dome
[self kvoDemo];
AppDelegate *delegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
}
#warning MD5加密算法
- (void)myMd5{
//定义字符串的方式
NSString *str = @"beijinghuanyingni";
//创建接收容器
unsigned char strleng[16];
//加密字符串
CC_MD5(str.UTF8String,(CC_LONG)strlen(str.UTF8String), strleng);
//创建可变字符串
NSMutableString *strBeijing = [[NSMutableString alloc] init];
//循环拼接得到数据加密
for (int i = 0; i < 16; i++) {
[strBeijing appendFormat:@"%02x",strleng[i]];
}
NSLog(@"%@",strBeijing);
//数组类型的需要归档
NSArray *array = @[@"张三",@"李四",@"王五",@"赵六"];
//归档
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:array];
//创建MD5
CC_MD5_CTX md5;
//初始化
CC_MD5_Init(&md5);
// 开始更新加密
CC_MD5_Update(&md5, data.bytes, (CC_LONG)data.length);
//接收容器
unsigned char md5data[16];
//结束加密
CC_MD5_Final(md5data, &md5);
//创建可变字符串接收加密后的数据
NSMutableString *strMd5 = [[NSMutableString alloc] init];
//拼接数据
for (int i = 0; i < 16; i++) {
[strMd5 appendFormat:@"%02X",md5data[i]];
}
//输出
NSLog(@"%@",strMd5);
}
#warning 钥匙串加密
- (void)myKEY{
//创建钥匙串对象
KeychainItemWrapper *keyitem = [[KeychainItemWrapper alloc] initWithIdentifier:@"北京" accessGroup:nil];
//固定的K值
id keyNameUser = (__bridge id)kSecAttrAccount;
id keyPasoWord = (__bridge id)kSecValueData;
//添加进钥匙串类字典
[keyitem setObject:@"张三" forKey:keyNameUser];
[keyitem setObject:@"1567898" forKey:keyPasoWord];
//根据相同的钥匙串类对象得到数据
NSString *str1 = [keyitem objectForKey:keyNameUser];
NSString *str2 = [keyitem objectForKey:keyPasoWord];
NSLog(@"%@%@",str1,str2);
}
#warning 公钥和私钥的加密解密
- (void)EncryptionStr{
//加密字符串
NSString *pubkey = @"-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDEChqe80lJLTTkJD3X3Lyd7Fj+\nzuOhDZkjuLNPog3YR20e5JcrdqI9IFzNbACY/GQVhbnbvBqYgyql8DfPCGXpn0+X\nNSxELIUw9Vh32QuhGNr3/TBpechrVeVpFPLwyaYNEk1CawgHCeQqf5uaqiaoBDOT\nqeox88Lc1ld7MsfggQIDAQAB\n-----END PUBLIC KEY-----";
//加密
NSString *string = [RSA encryptString:@"你吃饭了吗??" publicKey:pubkey];
//解密字符串
NSString *privkey = @"-----BEGIN RSA PRIVATE KEY-----\nMIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAMQKGp7zSUktNOQk\nPdfcvJ3sWP7O46ENmSO4s0+iDdhHbR7klyt2oj0gXM1sAJj8ZBWFudu8GpiDKqXw\nN88IZemfT5c1LEQshTD1WHfZC6EY2vf9MGl5yGtV5WkU8vDJpg0STUJrCAcJ5Cp/\nm5qqJqgEM5Op6jHzwtzWV3syx+CBAgMBAAECgYEApSzqPzE3d3uqi+tpXB71oY5J\ncfB55PIjLPDrzFX7mlacP6JVKN7dVemVp9OvMTe/UE8LSXRVaFlkLsqXC07FJjhu\nwFXHPdnUf5sanLLdnzt3Mc8vMgUamGJl+er0wdzxM1kPTh0Tmq+DSlu5TlopAHd5\nIqF3DYiORIen3xIwp0ECQQDj6GFaXWzWAu5oUq6j1msTRV3mRZnx8Amxt1ssYM0+\nJLf6QYmpkGFqiQOhHkMgVUwRFqJC8A9EVR1eqabcBXbpAkEA3DQfLVr94vsIWL6+\nVrFcPJW9Xk28CNY6Xnvkin815o2Q0JUHIIIod1eVKCiYDUzZAYAsW0gefJ49sJ4Y\niRJN2QJAKuxeQX2s/NWKfz1rRNIiUnvTBoZ/SvCxcrYcxsvoe9bAi7KCMdxObJkn\nhNXFQLav39wKbV73ESCSqnx7P58L2QJABmhR2+0A5EDvvj1WpokkqPKmfv7+ELfD\nHQq33LvU4q+N3jPn8C85ZDedNHzx57kru1pyb/mKQZANNX10M1DgCQJBAMKn0lEx\nQH2GrkjeWgGVpPZkp0YC+ztNjaUMJmY5g0INUlDgqTWFNftxe8ROvt7JtUvlgtKC\nXdXQrKaEnpebeUQ=\n-----END RSA PRIVATE KEY-----";
//解密
NSString *str = [RSA decryptString:string privateKey:privkey];
NSLog(@"%@",str);
}
#warning KVO检测数值变化
- (void)kvoDemo{
//创建对象
Person *person = [Person new];
//赋值
person.name = @"zhangsan";
//注册被观察者,观察者
[person addObserver:self forKeyPath:@"name" options:(NSKeyValueObservingOptionNew) context:nil];
//改变被观察者
person.name = @"zhaosi";
//释放观察者
[person removeObserver:self forKeyPath:@"name"];
}
//当被观察者值改变时触发事件
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{
//输出改变以后的值
NSLog(@"%@",change);
}
转载于:https://my.oschina.net/rdqblogs/blog/684935