URL加解密

背景介绍

加密方式

  • 加密:首先对字符串记性AES128加密,然后进行base64加密(主要是为了去除特殊字符)
  • 解密:先base64解密,然后在AES128解密即可还原数据
  • 其中base64加解密使用 GTMBase64添加两个方法
  1. + (NSString*)encodeBase64Data:(NSData *)data {
  2. data = [GTMBase64 encodeData:data];
  3. NSString *base64String = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
  4. return base64String;
  5. }
  6. + (NSData*)decodeBase64String:(NSString * )input {
  7. NSData *data = [input dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
  8. data = [GTMBase64 decodeData:data];
  9. return data;
  10. }

AES128使用系统CommonCrypto/CommonCryptor.h实现 //用于AES

添加NSData分类,增加两个方法

  1. #pragma mark - AES128位加解密
  2. - (NSData *)AES128EncryptWithKey:(NSString *)key {
  3. char keyPtr[kCCKeySizeAES128 + 1];
  4. memset(keyPtr, 0, sizeof(keyPtr));
  5. [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
  6. NSUInteger dataLength = [self length];
  7. size_t bufferSize = dataLength + kCCBlockSizeAES128;
  8. void *buffer = malloc(bufferSize);
  9. size_t numBytesEncrypted = 0;
  10. CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
  11. kCCAlgorithmAES,
  12. kCCOptionPKCS7Padding|kCCOptionECBMode,
  13. keyPtr,
  14. kCCBlockSizeAES128,
  15. NULL /* initialization vector (optional) */,
  16. [self bytes],
  17. dataLength, /* input */
  18. buffer,
  19. bufferSize, /* output */
  20. &numBytesEncrypted);
  21. if (cryptStatus == kCCSuccess) {
  22. //the returned NSData takes ownership of the buffer and will free it on deallocation
  23. return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
  24. }
  25. free(buffer); //free the buffer;
  26. return nil;
  27. }
  28. - (NSData *)AES128DecryptWithKey:(NSString *)key {
  29. // 'key' should be 32 bytes for AES256, will be null-padded otherwise
  30. char keyPtr[kCCKeySizeAES128+1]; // room for terminator (unused)
  31. bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding)
  32. // fetch key data
  33. [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
  34. NSUInteger dataLength = [self length];
  35. //See the doc: For block ciphers, the output size will always be less than or
  36. //equal to the input size plus the size of one block.
  37. //That's why we need to add the size of one block here
  38. size_t bufferSize = dataLength + kCCBlockSizeAES128;
  39. void *buffer = malloc(bufferSize);
  40. size_t numBytesDecrypted = 0;
  41. CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
  42. kCCAlgorithmAES128,
  43. kCCOptionPKCS7Padding|kCCOptionECBMode,
  44. keyPtr,
  45. kCCBlockSizeAES128,
  46. NULL /* initialization vector (optional) */,
  47. [self bytes],
  48. dataLength, /* input */
  49. buffer,
  50. bufferSize, /* output */
  51. &numBytesDecrypted);
  52. if (cryptStatus == kCCSuccess) {
  53. //the returned NSData takes ownership of the buffer and will free it on deallocation
  54. return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
  55. }
  56. free(buffer); //free the buffer;
  57. return nil;
  58. }

直奔主题

  • AFNetworking 的post请求如下
  1. - (AFHTTPRequestOperation *)POST:(NSString *)URLString
  2. parameters:(id)parameters
  3. constructingBodyWithBlock:(void (^)(id <AFMultipartFormData> formData))block
  4. success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success
  5. failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure
  • 其中URLString可以作为最基础的,不需要加密

    parameters 就是我们需要加密的地方,这是一个字典,因为AFN会对这个parameters进行解析,所以对这个参数集合进行一次包装,拼接成一个字符串。然后对字符串进行加密。

原来的代码是这样请求数据的

  1. NSMutableDictionary *para = [NSMutableDictionary dictionary];
  2. para[@"method"] = @"securityAdd";
  3. para[@"userId"] = userId;
  4. para[@"userPsw"] = userPsw;
  5. para[@"content"] = @"ddddd123891237";
  6. NSString *url = [NSString stringWithFormat:@"https://%@:82/frame/webInteface.do?", NHBaseURL];
  7. AFHTTPRequestOperation *operation = [NetWorkInst POST:url parameters:dict constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
  8. } success:^(AFHTTPRequestOperation *operation, id responseObject) {
  9. }];

加密后代码是这样的

  1. NSMutableDictionary *para = [NSMutableDictionary dictionary];
  2. para[@"method"] = @"securityAdd";
  3. para[@"userId"] = userId;
  4. para[@"userPsw"] = userPsw;
  5. para[@"content"] = @"ddddd123891237";
  6. // 开始加密,格式化数据****************************
  7. NSString *str = [NSString stringWithFormat:@"'method':'securityAdd','userId':'%@','userPsw':'%@','content':'%@'",userId,userPsw,content];
  8. NSLog(@"原始数据:%@",str);
  9. NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
  10. NSData *aaa = [data AES128EncryptWithKey:@"song.com"]; // aes加密
  11. NSLog(@"加密AES128后:%@",aaa);
  12. NSString *bbb = [PublicMethod encodeBase64Data:aaa];//base64加密
  13. NSLog(@"base64加密后:%@",bbb);
  14. NSMutableDictionary *dict = [NSMutableDictionary dictionary];
  15. dict[@"info"] = bbb;
  16. // 开始解密****************************
  17. NSData *da = [PublicMethod decodeBase64String:bbb]; //base64解密
  18. NSString *ccc = [[NSString alloc] initWithData:da encoding:NSUTF8StringEncoding];
  19. NSLog(@"base64解密后:%@",ccc);
  20. NSData *ddd = [da AES128DecryptWithKey:@"song.com"];// aes解密
  21. NSString *eee = [[NSString alloc] initWithData:ddd encoding:NSUTF8StringEncoding];
  22. NSLog(@"解密AES128后:%@",eee);
  23. NSString *url = [NSString stringWithFormat:@"https://%@:82/frame/webInteface.do?", NHBaseURL];
  24. AFHTTPRequestOperation *operation = [NetWorkInst POST:url parameters:dict constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
  25. } success:^(AFHTTPRequestOperation *operation, id responseObject) {
  26. }];

欢迎关注公众号

iOS URL加解密的更多相关文章

  1. iOS,信息加解密

    1.AES加解密 AES加解密 // //  AESEncryptAndDecrypt.h //  NSData扩展方法,用于处理aes加解密 // //  Created by Vie on 16/ ...

  2. iOS RSA加解密签名和验证

    转自:http://www.jianshu.com/p/81b0b54436b8 Pre:在公司负责了一个项目,需要用到iOS RSA验证签名的功能.后台给我的仅仅是一个公钥的字符串.经过起初的一段时 ...

  3. iOS RC4加解密算法

    -(NSString *)encrypt:(NSString *)string withKey:(NSString *)key{ self.sBox = [[self frameSBox:key] m ...

  4. 加解密、PKI与CA基础

    介绍 这门知识如果以前尝过的各位想必都知道:枯燥无比!因此在文中我会尽量讲的生动些,举一些例子,并试图以一个完整的例子来贯穿整个讲述过程.今年又恰逢莎翁逝世400周年,一方面也为了纪念这位伟大的作家. ...

  5. DES跨(C# Android IOS)三个平台通用的加解密方法

          #region   跨平台加解密(c# 安卓 IOS)       //  public static string sKey = "12345678";       ...

  6. .net 安卓IOS跨平台des加解密双向的(可以互相加解密)

    #region 跨平台加解密(c# 安卓 IOS) // public static string sKey = "12345678"; // /// // /// 解密 // / ...

  7. 【iOS】FMDB/SQLCipher数据库加解密,迁移

    2016-04-19更新:本文代码可能有些问题,请移步 http://zhengbomo.github.io/2016-04-18/sqlcipher-start/ 查看 sqlite应用几乎在所有的 ...

  8. java与IOS之间的RSA加解密

    很简单的一个需求,ipad端给密码RSA加密,传到java后台,解密.RSA加密算法是基于一个密钥对的,分为公钥和私钥,一般情况公钥加密,私钥解密,但也可私钥加密,公钥解密.还可以验签,就是先用私钥对 ...

  9. URL加载系统----iOS工程师必须熟练掌握

    URL加载系统----iOS工程师必须熟练掌握     iOS根本离不开网络——不论是从服务端读写数据.向系统分发计算任务,还是从云端加载图片.音频.视频等.   当应用程序面临处理问题的抉择时,通常 ...

随机推荐

  1. org.apache.tomcat.util.descriptor.web.WebXml.setVersion Unknown version string [4.0]. Default version will be used.报错

    org.apache.tomcat.util.descriptor.web.WebXml.setVersion Unknown version string [4.0]. Default versio ...

  2. 【洛谷P1107】 [BJWC2008]雷涛的小猫

    雷涛的小猫 题目链接 n^2DP比较好想, f[i][j]表示第i棵树高度为j的最大收益 直接从上到下转移即可,每次记录下max f[1~n][j] 用于下面的转移 f[i][j]=max(f[i][ ...

  3. 【XP-IE8】XP系统的IE8无法正常访问图片,按钮无反应,不执行JS脚本代码

    环境: Windows XP ,自带的是IE6,另外安装的 IE8 . 状况: 使用IE8浏览内网网站,点击登录按钮,没有反应.滚动图片新闻不显示.但使用Chrome浏览器,一切正常,说明是IE8某处 ...

  4. c语言描述的直接插入排序法

    #include<stdio.h> #include<stdlib.h> #define SIZE 6 typedef int Type; //直接插入排序法 void Ins ...

  5. js标准对象

    在JavaScript的世界里,一切都是对象. 但是某些对象还是和其他对象不太一样.为了区分对象的类型,我们用typeof操作符获取对象的类型,它总是返回一个字符串: typeof 123; //'n ...

  6. 修改状态栏,电池,wifi的颜色为白色

    修改状态栏,电池,wifi的颜色为白色 在info里面设置View controller-based status bar appearance,为no

  7. Spring知识点小结(一)

    一.Spring的简介 1.spring是一个full-stack轻量级开源框架    2.spring的两大核心        IoC: inverse of control  控制反转:反转是对象 ...

  8. 第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛--K-密码

    链接:https://www.nowcoder.com/acm/contest/90/K 来源:牛客网 - 1.题目描述 ZiZi登录各种账号的时候,总是会忘记密码,所以他把密码都记录在一个记事本上. ...

  9. 最长递增子序列(51Nod - 1134)

    20180604 23:18 https://blog.csdn.net/joylnwang/article/details/6766317(写得很用心,膜拜dalao) 给出长度为N的数组,找出这个 ...

  10. PC QQ客服代码

    一. <a target="_blank" href="http://wpa.qq.com/msgrd?v=3&uin=QQ号&site=qq&am ...