zoukankan      html  css  js  c++  java
  • RSA : 非对称加密方式 密钥:包含公钥和私钥 公钥:用于加密数据,用于公开,一般存放在数据提供方,IOS客户端. 私钥:用于解密数据,必须保密,私钥泄露会造成安全问题

    //使用系统的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----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDEChqe80lJLTTkJD3X3Lyd7Fj+ zuOhDZkjuLNPog3YR20e5JcrdqI9IFzNbACY/GQVhbnbvBqYgyql8DfPCGXpn0+X NSxELIUw9Vh32QuhGNr3/TBpechrVeVpFPLwyaYNEk1CawgHCeQqf5uaqiaoBDOT qeox88Lc1ld7MsfggQIDAQAB -----END PUBLIC KEY-----";

        //公钥进行加密

        /**

         *  @param NSString 要加密的字符串

         *  参数②:公钥字符串.

         */

      NSString *secRSAStr = [RSA encryptString:str publicKey:publicKey];

        NSLog(@"secRSAStr:%@",secRSAStr);

        //解密:使用私钥

        NSString *privateKey = @"-----BEGIN RSA PRIVATE KEY----- MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAMQKGp7zSUktNOQk PdfcvJ3sWP7O46ENmSO4s0+iDdhHbR7klyt2oj0gXM1sAJj8ZBWFudu8GpiDKqXw N88IZemfT5c1LEQshTD1WHfZC6EY2vf9MGl5yGtV5WkU8vDJpg0STUJrCAcJ5Cp/ m5qqJqgEM5Op6jHzwtzWV3syx+CBAgMBAAECgYEApSzqPzE3d3uqi+tpXB71oY5J cfB55PIjLPDrzFX7mlacP6JVKN7dVemVp9OvMTe/UE8LSXRVaFlkLsqXC07FJjhu wFXHPdnUf5sanLLdnzt3Mc8vMgUamGJl+er0wdzxM1kPTh0Tmq+DSlu5TlopAHd5 IqF3DYiORIen3xIwp0ECQQDj6GFaXWzWAu5oUq6j1msTRV3mRZnx8Amxt1ssYM0+ JLf6QYmpkGFqiQOhHkMgVUwRFqJC8A9EVR1eqabcBXbpAkEA3DQfLVr94vsIWL6+ VrFcPJW9Xk28CNY6Xnvkin815o2Q0JUHIIIod1eVKCiYDUzZAYAsW0gefJ49sJ4Y iRJN2QJAKuxeQX2s/NWKfz1rRNIiUnvTBoZ/SvCxcrYcxsvoe9bAi7KCMdxObJkn hNXFQLav39wKbV73ESCSqnx7P58L2QJABmhR2+0A5EDvvj1WpokkqPKmfv7+ELfD HQq33LvU4q+N3jPn8C85ZDedNHzx57kru1pyb/mKQZANNX10M1DgCQJBAMKn0lEx QH2GrkjeWgGVpPZkp0YC+ztNjaUMJmY5g0INUlDgqTWFNftxe8ROvt7JtUvlgtKC XdXQrKaEnpebeUQ= -----END RSA PRIVATE KEY-----";

      NSString *unSecRSAStr = [RSA decryptString:secRSAStr privateKey:privateKey];

        NSLog(@"unSecRSAStr:%@",unSecRSAStr);

    }

  • 相关阅读:
    Nginx软件优化
    分布式文件系统---GlusterFS
    内建DNS服务器--BIND
    ESXI 6.5 从载到安装
    在Linux下写一个简单的驱动程序
    TQ2440开发板网络配置方式
    虚拟机Linux下找不到/dev/cdrom
    求最大公约数
    strcmp的源码实现
    转:嵌入式软件工程师经典笔试题
  • 原文地址:https://www.cnblogs.com/wukun168/p/6010805.html
Copyright © 2011-2022 走看看