iOS开发:用DES对字符串加解密
参考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:
- #import <Foundation/Foundation.h>
- @interface Base64 : NSObject
- +(int)char2Int:(char)c;
- +(NSData *)decode:(NSString *)data;
- +(NSString *)encode:(NSData *)data;
- @end
Base64.m
- #import "Base64.h"
- static const char encodingTable[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
- @interface Base64()
- +(int)char2Int:(char)c;
- @end
- @implementation Base64
- +(NSString *)encode:(NSData *)data
- {
- if (data.length == 0)
- return nil;
- char *characters = malloc(data.length * 3 / 2);
- if (characters == NULL)
- return nil;
- int end = data.length - 3;
- int index = 0;
- int charCount = 0;
- int n = 0;
- while (index <= end) {
- int d = (((int)(((char *)[data bytes])[index]) & 0x0ff) << 16)
- | (((int)(((char *)[data bytes])[index + 1]) & 0x0ff) << 8)
- | ((int)(((char *)[data bytes])[index + 2]) & 0x0ff);
- characters[charCount++] = encodingTable[(d >> 18) & 63];
- characters[charCount++] = encodingTable[(d >> 12) & 63];
- characters[charCount++] = encodingTable[(d >> 6) & 63];
- characters[charCount++] = encodingTable[d & 63];
- index += 3;
- if(n++ >= 14)
- {
- n = 0;
- characters[charCount++] = ' ';
- }
- }
- if(index == data.length - 2)
- {
- int d = (((int)(((char *)[data bytes])[index]) & 0x0ff) << 16)
- | (((int)(((char *)[data bytes])[index + 1]) & 255) << 8);
- characters[charCount++] = encodingTable[(d >> 18) & 63];
- characters[charCount++] = encodingTable[(d >> 12) & 63];
- characters[charCount++] = encodingTable[(d >> 6) & 63];
- characters[charCount++] = '=';
- }
- else if(index == data.length - 1)
- {
- int d = ((int)(((char *)[data bytes])[index]) & 0x0ff) << 16;
- characters[charCount++] = encodingTable[(d >> 18) & 63];
- characters[charCount++] = encodingTable[(d >> 12) & 63];
- characters[charCount++] = '=';
- characters[charCount++] = '=';
- }
- NSString * rtnStr = [[NSString alloc] initWithBytesNoCopy:characters length:charCount encoding:NSUTF8StringEncoding freeWhenDone:YES];
- return rtnStr;
- }
- +(NSData *)decode:(NSString *)data
- {
- if(data == nil || data.length <= 0) {
- return nil;
- }
- NSMutableData *rtnData = [[NSMutableData alloc]init];
- int slen = data.length;
- int index = 0;
- while (true) {
- while (index < slen && [data characterAtIndex:index] <= ' ') {
- index++;
- }
- if (index >= slen || index + 3 >= slen) {
- break;
- }
- 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]];
- Byte temp1 = (byte >> 16) & 255;
- [rtnData appendBytes:&temp1 length:1];
- if([data characterAtIndex:index + 2] == '=') {
- break;
- }
- Byte temp2 = (byte >> 8) & 255;
- [rtnData appendBytes:&temp2 length:1];
- if([data characterAtIndex:index + 3] == '=') {
- break;
- }
- Byte temp3 = byte & 255;
- [rtnData appendBytes:&temp3 length:1];
- index += 4;
- }
- return rtnData;
- }
- +(int)char2Int:(char)c
- {
- if (c >= 'A' && c <= 'Z') {
- return c - 65;
- } else if (c >= 'a' && c <= 'z') {
- return c - 97 + 26;
- } else if (c >= '0' && c <= '9') {
- return c - 48 + 26 + 26;
- } else {
- switch(c) {
- case '+':
- return 62;
- case '/':
- return 63;
- case '=':
- return 0;
- default:
- return -1;
- }
- }
- }
- @end
DESUtils.h:
- #import <Foundation/Foundation.h>
- #import <CommonCrypto/CommonCrypto.h>
- #import "Base64.h"
- @interface DESUtils : NSObject
- +(NSString *)decryptUseDES:(NSString *)cipherText key:(NSString *)key;
- +(NSString *) encryptUseDES:(NSString *)plainText key:(NSString *)key;
- @end
DESUtils.m:
- #import "DESUtils.h"
- @implementation DESUtils
- +(NSString *)decryptUseDES:(NSString *)cipherText key:(NSString *)key
- {
- NSString *plaintext = nil;
- NSData *cipherdata = [Base64 decode:cipherText];
- unsigned char buffer[1024];
- memset(buffer, 0, sizeof(char));
- size_t numBytesDecrypted = 0;
- CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmDES,
- kCCOptionPKCS7Padding,
- [key UTF8String], kCCKeySizeDES,
- (Byte *)[[key dataUsingEncoding:NSUTF8StringEncoding] bytes],
- [cipherdata bytes], [cipherdata length],
- buffer, 1024,
- &numBytesDecrypted);
- if(cryptStatus == kCCSuccess) {
- NSData *plaindata = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesDecrypted];
- plaintext = [[NSString alloc]initWithData:plaindata encoding:NSUTF8StringEncoding];
- }
- return plaintext;
- }
- +(NSString *) encryptUseDES:(NSString *)plainText key:(NSString *)key
- {
- NSString *ciphertext = nil;
- NSData *textData = [plainText dataUsingEncoding:NSUTF8StringEncoding];
- NSUInteger dataLength = [textData length];
- unsigned char buffer[1024];
- memset(buffer, 0, sizeof(char));
- size_t numBytesEncrypted = 0;
- CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmDES,
- kCCOptionPKCS7Padding,
- [key UTF8String], kCCKeySizeDES,
- (Byte *)[[key dataUsingEncoding:NSUTF8StringEncoding] bytes],
- [textData bytes], dataLength,
- buffer, 1024,
- &numBytesEncrypted);
- if (cryptStatus == kCCSuccess) {
- NSData *data = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesEncrypted];
- ciphertext = [Base64 encode:data];
- }
- return ciphertext;
- }
- @end
© 2014, 冰冻鱼. 请尊重作者劳动成果,复制转载保留本站链接! 应用开发笔记
iOS开发:用DES对字符串加解密的更多相关文章
- 李洪强iOS开发Swift篇—03_字符串和数据类型
李洪强iOS开发Swift篇—03_字符串和数据类型 一.字符串 字符串是String类型的数据,用双引号""包住文字内容 let website = "http:// ...
- android中使用jni对字符串加解密实现分析
android中使用jni对字符串加解密实现分析 近期项目有个需求.就是要对用户的敏感信息进行加密处理,比方用户的账户password,手机号等私密信息.在java中,就对字符串的加解密我们能够使用A ...
- iOS开发-通过正则表达式判断字符串是否为纯阿拉伯数字
iOS开发-通过正则表达式判断字符串是否为纯阿拉伯数字 简述:NSString * regex_0 = @"\\d{1,}"; /*允许首位为0*/ NSString * re ...
- DES跨(C# Android IOS)三个平台通用的加解密方法
#region 跨平台加解密(c# 安卓 IOS) // public static string sKey = "12345678"; ...
- iOS - (base64对字符串加解密)
今天公司让做支付系统,为了安全起见,需要对一些数据进行加密,然而我首想到的就是 base64 ,严格来说这不是一种加密方式,这只是将原有的一些字符串或者其它的一些文本进行一个转化而已,就是转化成数字, ...
- DES,AeS加解密,MD5,SHA加密
1.DES一共就有4个参数参与运作:明文.密文.密钥.向量.其中这4者的关系可以理解为: 密文=明文+密钥+向量: 明文=密文-密钥-向量: 为什么要向量这个参数呢?因为如果有一篇文章,有几个词重复, ...
- 在ios开发中有多少常用的加密解密方式(备用)
最常用的是MD5和base64编码,还有DES 3DES AES加密 ios怎么实现RAS加密解密 最近几天折腾了一下如何在iOS上使用RSA来加密.iOS上并没有直接的RSA加密API.但是iOS提 ...
- [IOS 开发] NSDateFormatter的格式字符串 -- 《整理的笔记》
在ios开发中, OBjective-C中的NSDate是一个挺讨厌的类型, 自己找不到转换成字符串的类型,还得带一个NSDateFormatter的类型. 官方文档上对NSDateFormatter ...
- C#常用字符串加解密方法封装
C#中常用的字符串加密.解密方法封装,包含只加密但不解密的方法.收藏起来备用. //方法一 //须添加对System.Web的引用 //using System.Web.Security; /// & ...
随机推荐
- SSH 阿里云服务器
1.在服务机上操作 创建要远程登录的用户和密码 sudo adduser username 正在添加用户“username”... 正在添加新组“username”(1001)... 正在添加新 ...
- 为Azure Web Site 添加ADFS验证支持之一 设置ADFS的信任关系
很多时候企业开发的应用都会通过AD(Active Directory)进行验证用户名密码的,在企业里面统一一个AD来进行账号密码管理也是一个很好的实践.当企业打算将一个应用迁移到Azure的时候,使用 ...
- GIT每次都要输入用户名和密码的解决方案
三.配置客户端长期存储用户各和密码 长期存储密码: git config --global credential.helper store 缓存用户信息 3600s zb@zb-computer:/h ...
- DLL基本知识
一.生成方式: 使用DEF文件定义导出接口或使用__declspec(dllexport)描述接口,编译链接后生成dll+lib,其中lib是导入库,里面只有对导出接口的描述,而没有具体实现. 二.链 ...
- bzoj 1367: [Baltic2004]sequence
1367: [Baltic2004]sequence Time Limit: 20 Sec Memory Limit: 64 MB Description Input Output 一个整数R Sa ...
- 字符串:KMP
KMP是字符串匹配的经典算法 也是众多字符串基础的重中之重 A. 题意:给T组数据,每组有长度为n和m的母串和模式串.判断模式串是否是母串的子串,如果是输出最先匹配完成的位置,否则输出-1. 做法:直 ...
- 【BZOJ】4318: OSU! 期望DP
[题意]有一个长度为n的01序列,每一段极大的连续1的价值是L^3(长度L).现在给定n个实数表示该位为1的概率,求期望总价值.n<=10^5. [算法]期望DP [题解]后缀长度是一个很关键的 ...
- 【洛谷 P4542】 [ZJOI2011]营救皮卡丘(费用流)
题目链接 用最多经过\(k\)条经过\(0\)的路径覆盖所有点. 定义\(ds[i][j]\)表示从\(i\)到\(j\)不经过大于\(max(i,j)\)的点的最短路,显然可以用弗洛伊德求. 然后每 ...
- Redis数据类型之列表(list)
1. 什么是列表 redis的列表使用双向链表实现,往列表中放元素的时候复杂度是O(1),但是随机访问的时候速度就不行了,因为需要先遍历到指定的位置才可以取到元素. 既然列表是使用链表实现的,那么就说 ...
- vue登录/查看/结束端口号
下班时间到啦! --下班都是他们的,而我,还是什么都没有. vue登录(未登录情况下不允许进入) 在路由里加上登录的权限 meta: { requireAuth: true, title: 'Logi ...