//使用系统的MD5加密  需要导入头文件
#import <CommonCrypto/CommonCrypto.h>
  /**
     *MD5加密:
     */
//字符串
-(NSString *)md5SecureWithString:(NSString *)str{
    //使用CC_MD5函数进行加密:MD5函数声明的密文由16个16进制的字符组成.
    //将OC字符串转为C语言字符串
    const char *CStr = str.UTF8String;
    /**
     *  @param data#> 要加密的C语言字符串
     *  @param len#>  C语言字符串的长度
     *  @param md#>   生成的16个16进制字符的数组的首地址
     */
    //声明一个字符数组  可存放16个字符
    unsigned char result[CC_MD5_DIGEST_LENGTH];
    CC_MD5(CStr, (CC_LONG)strlen(CStr), result);
    //遍历该C语言数组 将其中的16个字符串拼接起来,形成OC字符串
    NSMutableString *string = [NSMutableString string];
    for (int i = 0; i < CC_MD5_DIGEST_LENGTH; i++) {
        [string appendFormat:@"%02X",result[i]];
    }
    NSLog(@"%@",string);
    return string;
}
/**
其他数据类型加密:先转为NSData对象->获取对应NSData的MD5值
 */
//NSData:
-(NSString *)md5WithData:(NSData *)data{
    //1.声明MD5变量
    CC_MD5_CTX md5;
    //2.MD5变量进行初始化
    CC_MD5_Init(&md5);
    //3.准备进行MD5加密
    /*
     *  @param c#>    MD5变量地址 description#>
     *  @param data#> NSData的C语言类型description#>
     *  @param len#>  data的长度 description#>
     */
    CC_MD5_Update(&md5, data.bytes, (CC_LONG)data.length);
    //4.结束加密(代表加密结束,会将生成好的字符给我们)
    unsigned char result[CC_MD5_DIGEST_LENGTH];
    CC_MD5_Final(result, &md5);
    NSMutableString *str = [NSMutableString string];
    for (int i = 0; i < CC_MD5_DIGEST_LENGTH; i++) {
        [str appendFormat:@"%2X",result[i]];
    }
//    NSLog(@"%@",str);
    return str;
}
- (void)md5WithPerson:(Person *)person{
    //per ->NSData
    //归档操作 复杂对象必须服从协议;
    NSData *data =  [NSKeyedArchiver archivedDataWithRootObject:person];
    //NSData ->MD5加密
 NSString *result = [self md5WithData:data];
    NSLog(@"sss%@",result);
 
}
//数组:数组,字典和集合这些集合类能不能归档转为NSData,取决于其中的元素类型是否服从NSCoding协议.
-(void)md5WithArray:(NSArray *)arr{
    //arr ->NSData;
 NSData *data = [NSKeyedArchiver archivedDataWithRootObject:arr];
    //NSData -> MD5加密
  NSString *str =  [self md5WithData:data];
    NSLog(@"数组:%@",str);
}
 
/**
    钥匙串:
     钥匙串加密是系统级别的,保存在其中的数据是进行过加密的,保存的类型不多:如 账号,密码,证书,秘钥.
     */
 
//发文钥匙串,导入头文件.(编译环境是MRC)
#import "KeychainItemWrapper.h"
    //写入钥匙串
    //从钥匙串中读取用户名和密码
//保存用户名和密码到钥匙串.
- (void)saveToKeyChainWithUserName:(NSString *)userName passWord:(NSString *)passWord{
    //1.创建KeychainItemWrapper钥匙串访问对象
    /**
      参数①:钥匙串访问对象的表示(和读取时保持一致即可);
     参数②:分享分组设置
     */
    KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc]initWithIdentifier:@"zhou" accessGroup:nil];
    //2.key不是自定义的, key是由系统提供的. kSecAttrAccount:一般用于存储账号;  kSecValueData:一般用于存储一些值,如:密码;
    //Foundation框架中的类型,类型要进行转化,一般需要建立一个桥,
    [wrapper setObject:userName forKey:(__bridge id) kSecAttrAccount];
    [wrapper setObject:passWord forKey:(__bridge id)kSecValueData];
}
//从钥匙串中读取用户名和密码
- (void)readFromKeychain{
    //钥匙串访问对象  identifier 需要保持一致
    KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc]initWithIdentifier:@"zhou" accessGroup:nil];
    //取出对应key值
    //读取账号
  NSString *userName = [wrapper objectForKey:(id)kSecAttrAccount];
    //读取密码
 NSString *passWord = [wrapper objectForKey:(id)kSecValueData];
    NSLog(@"user:%@ pwd:%@",userName,passWord);
}
RSA:
 
  /**

    RSA : 非对称加密方式

     密钥:包含公钥和私钥

     公钥:用于加密数据,用于公开,一般存放在数据提供方,IOS客户端.

     私钥:用于解密数据,必须保密,私钥泄露会造成安全问题

*/
 
#import "RSA.h"
 
#pragma mark - RSA -
-(void)RSAWithString:(NSString *)str{
    NSString *publicKey = @"-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDEChqe80lJLTTkJD3X3Lyd7Fj+\nzuOhDZkjuLNPog3YR20e5JcrdqI9IFzNbACY/GQVhbnbvBqYgyql8DfPCGXpn0+X\nNSxELIUw9Vh32QuhGNr3/TBpechrVeVpFPLwyaYNEk1CawgHCeQqf5uaqiaoBDOT\nqeox88Lc1ld7MsfggQIDAQAB\n-----END PUBLIC KEY-----";
    //公钥进行加密
    /**
     *  @param NSString 要加密的字符串
     *  参数②:公钥字符串.
     */
  NSString *secRSAStr = [RSA encryptString:str publicKey:publicKey];
    NSLog(@"secRSAStr:%@",secRSAStr);
    //解密:使用私钥
    NSString *privateKey = @"-----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 *unSecRSAStr = [RSA decryptString:secRSAStr privateKey:privateKey];
    NSLog(@"unSecRSAStr:%@",unSecRSAStr);
}