参考http://www.cnblogs.com/janken/archive/2012/04/05/2432930.html,做了个小修改,实现PHP,JAVA,Objective-c加解密结果相同。
原先Android版的客户端与服务端(PHP)通讯部分内容用DES加密,加密方法:http://www.pocketdigi.com/20121112/940.html
直接拷贝原文的源码,发现结果不同,原因在于,我在java和php里用的IvParameterSpec是动态的,就是key转成byte[],但原文是静态写死的。
上修改后的源码:
先是Base64:
Base64.h:

  1. #import <Foundation/Foundation.h>
  2. @interface Base64 : NSObject
  3. +(int)char2Int:(char)c;
  4. +(NSData *)decode:(NSString *)data;
  5. +(NSString *)encode:(NSData *)data;
  6. @end

Base64.m

  1. #import "Base64.h"
  2. static const char encodingTable[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  3. @interface Base64()
  4. +(int)char2Int:(char)c;
  5. @end
  6. @implementation Base64
  7. +(NSString *)encode:(NSData *)data
  8. {
  9. if (data.length == 0)
  10. return nil;
  11. char *characters = malloc(data.length * 3 / 2);
  12. if (characters == NULL)
  13. return nil;
  14. int end = data.length - 3;
  15. int index = 0;
  16. int charCount = 0;
  17. int n = 0;
  18. while (index <= end) {
  19. int d = (((int)(((char *)[data bytes])[index]) & 0x0ff) << 16)
  20. | (((int)(((char *)[data bytes])[index + 1]) & 0x0ff) << 8)
  21. | ((int)(((char *)[data bytes])[index + 2]) & 0x0ff);
  22. characters[charCount++] = encodingTable[(d >> 18) & 63];
  23. characters[charCount++] = encodingTable[(d >> 12) & 63];
  24. characters[charCount++] = encodingTable[(d >> 6) & 63];
  25. characters[charCount++] = encodingTable[d & 63];
  26. index += 3;
  27. if(n++ >= 14)
  28. {
  29. n = 0;
  30. characters[charCount++] = ' ';
  31. }
  32. }
  33. if(index == data.length - 2)
  34. {
  35. int d = (((int)(((char *)[data bytes])[index]) & 0x0ff) << 16)
  36. | (((int)(((char *)[data bytes])[index + 1]) & 255) << 8);
  37. characters[charCount++] = encodingTable[(d >> 18) & 63];
  38. characters[charCount++] = encodingTable[(d >> 12) & 63];
  39. characters[charCount++] = encodingTable[(d >> 6) & 63];
  40. characters[charCount++] = '=';
  41. }
  42. else if(index == data.length - 1)
  43. {
  44. int d = ((int)(((char *)[data bytes])[index]) & 0x0ff) << 16;
  45. characters[charCount++] = encodingTable[(d >> 18) & 63];
  46. characters[charCount++] = encodingTable[(d >> 12) & 63];
  47. characters[charCount++] = '=';
  48. characters[charCount++] = '=';
  49. }
  50. NSString * rtnStr = [[NSString alloc] initWithBytesNoCopy:characters length:charCount encoding:NSUTF8StringEncoding freeWhenDone:YES];
  51. return rtnStr;
  52. }
  53. +(NSData *)decode:(NSString *)data
  54. {
  55. if(data == nil || data.length <= 0) {
  56. return nil;
  57. }
  58. NSMutableData *rtnData = [[NSMutableData alloc]init];
  59. int slen = data.length;
  60. int index = 0;
  61. while (true) {
  62. while (index < slen && [data characterAtIndex:index] <= ' ') {
  63. index++;
  64. }
  65. if (index >= slen || index + 3 >= slen) {
  66. break;
  67. }
  68. int byte = ([self char2Int:[data characterAtIndex:index]] << 18) + ([self char2Int:[data characterAtIndex:index + 1]] << 12) + ([self char2Int:[data characterAtIndex:index + 2]] << 6) + [self char2Int:[data characterAtIndex:index + 3]];
  69. Byte temp1 = (byte >> 16) & 255;
  70. [rtnData appendBytes:&temp1 length:1];
  71. if([data characterAtIndex:index + 2] == '=') {
  72. break;
  73. }
  74. Byte temp2 = (byte >> 8) & 255;
  75. [rtnData appendBytes:&temp2 length:1];
  76. if([data characterAtIndex:index + 3] == '=') {
  77. break;
  78. }
  79. Byte temp3 = byte & 255;
  80. [rtnData appendBytes:&temp3 length:1];
  81. index += 4;
  82. }
  83. return rtnData;
  84. }
  85. +(int)char2Int:(char)c
  86. {
  87. if (c >= 'A' && c <= 'Z') {
  88. return c - 65;
  89. } else if (c >= 'a' && c <= 'z') {
  90. return c - 97 + 26;
  91. } else if (c >= '0' && c <= '9') {
  92. return c - 48 + 26 + 26;
  93. } else {
  94. switch(c) {
  95. case '+':
  96. return 62;
  97. case '/':
  98. return 63;
  99. case '=':
  100. return 0;
  101. default:
  102. return -1;
  103. }
  104. }
  105. }
  106. @end

DESUtils.h:

  1. #import <Foundation/Foundation.h>
  2. #import <CommonCrypto/CommonCrypto.h>
  3. #import "Base64.h"
  4. @interface DESUtils : NSObject
  5. +(NSString *)decryptUseDES:(NSString *)cipherText key:(NSString *)key;
  6. +(NSString *) encryptUseDES:(NSString *)plainText key:(NSString *)key;
  7. @end

DESUtils.m:

  1. #import "DESUtils.h"
  2. @implementation DESUtils
  3. +(NSString *)decryptUseDES:(NSString *)cipherText key:(NSString *)key
  4. {
  5. NSString *plaintext = nil;
  6. NSData *cipherdata = [Base64 decode:cipherText];
  7. unsigned char buffer[1024];
  8. memset(buffer, 0, sizeof(char));
  9. size_t numBytesDecrypted = 0;
  10. CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmDES,
  11. kCCOptionPKCS7Padding,
  12. [key UTF8String], kCCKeySizeDES,
  13. (Byte *)[[key dataUsingEncoding:NSUTF8StringEncoding] bytes],
  14. [cipherdata bytes], [cipherdata length],
  15. buffer, 1024,
  16. &numBytesDecrypted);
  17. if(cryptStatus == kCCSuccess) {
  18. NSData *plaindata = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesDecrypted];
  19. plaintext = [[NSString alloc]initWithData:plaindata encoding:NSUTF8StringEncoding];
  20. }
  21. return plaintext;
  22. }
  23. +(NSString *) encryptUseDES:(NSString *)plainText key:(NSString *)key
  24. {
  25. NSString *ciphertext = nil;
  26. NSData *textData = [plainText dataUsingEncoding:NSUTF8StringEncoding];
  27. NSUInteger dataLength = [textData length];
  28. unsigned char buffer[1024];
  29. memset(buffer, 0, sizeof(char));
  30. size_t numBytesEncrypted = 0;
  31. CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmDES,
  32. kCCOptionPKCS7Padding,
  33. [key UTF8String], kCCKeySizeDES,
  34. (Byte *)[[key dataUsingEncoding:NSUTF8StringEncoding] bytes],
  35. [textData bytes], dataLength,
  36. buffer, 1024,
  37. &numBytesEncrypted);
  38. if (cryptStatus == kCCSuccess) {
  39. NSData *data = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesEncrypted];
  40. ciphertext = [Base64 encode:data];
  41. }
  42. return ciphertext;
  43. }
  44. @end

© 2014, 冰冻鱼. 请尊重作者劳动成果,复制转载保留本站链接! 应用开发笔记

iOS开发:用DES对字符串加解密的更多相关文章

  1. 李洪强iOS开发Swift篇—03_字符串和数据类型

    李洪强iOS开发Swift篇—03_字符串和数据类型 一.字符串 字符串是String类型的数据,用双引号""包住文字内容  let website = "http:// ...

  2. android中使用jni对字符串加解密实现分析

    android中使用jni对字符串加解密实现分析 近期项目有个需求.就是要对用户的敏感信息进行加密处理,比方用户的账户password,手机号等私密信息.在java中,就对字符串的加解密我们能够使用A ...

  3. iOS开发-通过正则表达式判断字符串是否为纯阿拉伯数字

    iOS开发-通过正则表达式判断字符串是否为纯阿拉伯数字 简述:NSString * regex_0 = @"\\d{1,}";   /*允许首位为0*/ NSString * re ...

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

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

  5. iOS - (base64对字符串加解密)

    今天公司让做支付系统,为了安全起见,需要对一些数据进行加密,然而我首想到的就是 base64 ,严格来说这不是一种加密方式,这只是将原有的一些字符串或者其它的一些文本进行一个转化而已,就是转化成数字, ...

  6. DES,AeS加解密,MD5,SHA加密

    1.DES一共就有4个参数参与运作:明文.密文.密钥.向量.其中这4者的关系可以理解为: 密文=明文+密钥+向量: 明文=密文-密钥-向量: 为什么要向量这个参数呢?因为如果有一篇文章,有几个词重复, ...

  7. 在ios开发中有多少常用的加密解密方式(备用)

    最常用的是MD5和base64编码,还有DES 3DES AES加密 ios怎么实现RAS加密解密 最近几天折腾了一下如何在iOS上使用RSA来加密.iOS上并没有直接的RSA加密API.但是iOS提 ...

  8. [IOS 开发] NSDateFormatter的格式字符串 -- 《整理的笔记》

    在ios开发中, OBjective-C中的NSDate是一个挺讨厌的类型, 自己找不到转换成字符串的类型,还得带一个NSDateFormatter的类型. 官方文档上对NSDateFormatter ...

  9. C#常用字符串加解密方法封装

    C#中常用的字符串加密.解密方法封装,包含只加密但不解密的方法.收藏起来备用. //方法一 //须添加对System.Web的引用 //using System.Web.Security; /// & ...

随机推荐

  1. spark(四)

    一. spark 2  版本 相对于以前版本的变化 spark core  : Accumulators (累加器):性能更好,页面上也可以看到累加器的信息 spark sql: 1. 2.DataS ...

  2. Python3 字典 fromkeys()方法

     Python3 字典 描述 Python 字典 fromkeys() 函数用于创建一个新字典,以序列seq中元素做字典的键,value为字典所有键对应的初始值. 语法 fromkeys()方法语法: ...

  3. 驱动之LCD的介绍与应用20170209

    本文主要介绍的是LCD的介绍与应用,直接看个人笔记即可:

  4. Linux系统之路——python多版本共存问题(ps:自行切换python版本,pip安装遇到的一些问题)

    经常遇到这样的情况: 系统自带的Python是2.6,自己需要Python 2.7中的某些特性: 系统自带的Python是2.x,自己需要Python 3.x: 此时需要在系统中安装多个Python, ...

  5. dfs.datanode.du.reserved 预留空间不生效的问题

    生产环境(cdh5.5.1)遇到一个问题:已经设置 dfs.datanode.du.reserved预留空间为20G,但是磁盘仍然被写满了. 当挂载磁盘作为datanode的存储空间,如果磁盘大小为2 ...

  6. shell多进程的实现

    需求:多个脚本彼此互不干涉,同时运行,节省时间 菜鸟级实现: #!/bin/sh dir="/data/test" $dir/sbin/test1.sh >> $dir ...

  7. 跟我一起写Makefile(四)

    书写命令———— 每条规则中的命令和操作系统Shell的命令行是一致的.make会一按顺序一条一条的执行命令,每条命令的开头必须以[Tab]键开头,除非,命令是紧跟在依赖规则后面的分号后的.在命令行之 ...

  8. [csp-201809-3]元素选择器-编译原理

    声明:同样是参考照抄hyh学长的代码!(有问题我马上删这篇emm 题目链接:http://118.190.20.162/view.page?gpid=T77 题面: 这棵树的样子(同样是来自学长的图) ...

  9. 【BZOJ】2440: [中山市选2011]完全平方数

    [题意]T次询问第k小的非完全平方数倍数的数.T<=50,k<=10^9.(即无平方因子数——素因数指数皆为0或1的数) [算法]数论(莫比乌斯函数) [题解]考虑二分,转化为询问[1,x ...

  10. 【计蒜客】是男人就过 8 题--Pony.AI 题 A. A String Game 后缀自动机+SG函数

    [题目]A. A String Game [题意]给定目标串S和n个子串Ti,Alice和Bob轮流选择一个子串操作,必须且只能在子串末尾添加一个字符使得新串也是S的子串,不能操作即输,求胜利者.|S ...