des 加密 iOS
转载请注明原文出处
生成同名的Des.h文件和Des.m文件后,拷贝下方的代码可直接使用。注意在Des.m文件中将key值修改为项目所需的key。---》 #define DesKey
过程很简单,将字符串加密转成16进制字符串,以及将16进制字符串转成字符串。
以下是.h文件内容:
//
// Des.h
// desIOS
//
// Created by wusiping on 16/6/13.
// Copyright © 2016年 wusiping. All rights reserved.
// #import <Foundation/Foundation.h> /******字符串转base64(包括DES加密)******/
#define __DesEncodeString( string ) [Des hexStringFromText:string] /******base64(通过DES解密)转字符串******/
#define __DesDecodeString( HexString ) [Des textFromHexString:HexString] @interface Des : NSObject /**
* 字符串加密转成16进制字符串
*/
+ (NSString *)hexStringFromText:(NSString *)string; /**
* 16进制解密生成字符串
*/
+ (NSString *)textFromHexString:(NSString *)HexString; + (NSString *)base64EncodedStringFromData:(NSData *)data;
+ (NSString *)textFrombase64String:(NSString *)base64; @end
以下是.m文件内容:
//
// Des.m
// desIOS
//
// Created by wusiping on 16/6/13.
// Copyright © 2016年 wusiping. All rights reserved.
// #import "Des.h" //引入IOS自带密码库
#import <CommonCrypto/CommonCryptor.h> //空字符串
#define LocalStr_None @"" #define DesKey @"com.nokia.parts" static const char encodingTable[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789/"; @implementation Des /**
* 字符串des加密转成16进制
*/
+ (NSString *)hexStringFromText:(NSString *)string
{
// string = [string stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
if (string && ![string isEqualToString:LocalStr_None]) {
//取项目的bundleIdentifier作为KEY
NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
//IOS 自带DES加密 Begin
data = [self DESEncrypt:data WithKey:DesKey];
//IOS 自带DES加密 End
return [self hexStringEncodedStringFromData:data];
}
else {
return LocalStr_None;
}
} /**
* 把data 进行des加密成16进制
*/
+ (NSString *)hexStringEncodedStringFromData:(NSData *)data
{ Byte *bytes = (Byte *)[data bytes];
//下面是Byte 转换为16进制。
NSString *hexStr=@""; for(int i=0;i<[data length];i++) {
NSString *newHexStr = [NSString stringWithFormat:@"%x",bytes[i]&0xff];///16进制数 if([newHexStr length]==1) hexStr = [NSString stringWithFormat:@"%@0%@",hexStr,newHexStr]; else hexStr = [NSString stringWithFormat:@"%@%@",hexStr,newHexStr];
}
return hexStr; } /**
* des解密16进制 转成字符串
*/
+ (NSString *)textFromHexString:(NSString *)HexString
{ NSInteger len = [HexString length] / 2; // Target length
unsigned char *buf = malloc(len);
unsigned char *whole_byte = buf;
char byte_chars[3] = {'\0','\0','\0'}; int i;
for (i=0; i < [HexString length] / 2; i++) {
byte_chars[0] = [HexString characterAtIndex:i*2];
byte_chars[1] = [HexString characterAtIndex:i*2+1];
*whole_byte = strtol(byte_chars, NULL, 16);
whole_byte++;
} NSData *result = [NSData dataWithBytes:buf length:len];
free(buf); result = [self DESDecrypt:result WithKey:DesKey];
return [[NSString alloc] initWithData:result encoding:NSUTF8StringEncoding]; } //base64解密转string
+ (NSString *)textFrombase64String:(NSString *)base64
{
if (base64 && ![base64 isEqualToString:LocalStr_None]) {
//取项目的bundleIdentifier作为KEY
NSData *data = [self dataWithBase64EncodedString:base64];
//IOS 自带DES解密 Begin
data = [self DESDecrypt:data WithKey:DesKey];
//IOS 自带DES加密 End
return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
}
else {
return LocalStr_None;
} } /************************************************************
函数名称 : + (NSData *)DESEncrypt:(NSData *)data WithKey:(NSString *)key
函数描述 : 文本数据进行DES加密
输入参数 : (NSData *)data
(NSString *)key
输出参数 : N/A
返回参数 : (NSData *)
备注信息 : 此函数不可用于过长文本
**********************************************************/
+ (NSData *)DESEncrypt:(NSData *)data WithKey:(NSString *)key
{
char keyPtr[kCCKeySizeAES256+1];
bzero(keyPtr, sizeof(keyPtr)); [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; NSUInteger dataLength = [data length]; size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize); size_t numBytesEncrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmDES,
kCCOptionPKCS7Padding | kCCOptionECBMode,
keyPtr, kCCBlockSizeDES,
NULL,
[data bytes], dataLength,
buffer, bufferSize,
&numBytesEncrypted);
if (cryptStatus == kCCSuccess) {
return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
} free(buffer);
return nil;
} /************************************************************
函数名称 : + (NSData *)DESEncrypt:(NSData *)data WithKey:(NSString *)key
函数描述 : 文本数据进行DES解密
输入参数 : (NSData *)data
(NSString *)key
输出参数 : N/A
返回参数 : (NSData *)
备注信息 : 此函数不可用于过长文本
**********************************************************/
+ (NSData *)DESDecrypt:(NSData *)data WithKey:(NSString *)key
{
char keyPtr[kCCKeySizeAES256+1];
bzero(keyPtr, sizeof(keyPtr)); [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; NSUInteger dataLength = [data length]; size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize); size_t numBytesDecrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmDES,
kCCOptionPKCS7Padding | kCCOptionECBMode,
keyPtr, kCCBlockSizeDES,
NULL,
[data bytes], dataLength,
buffer, bufferSize,
&numBytesDecrypted); if (cryptStatus == kCCSuccess) {
return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
} free(buffer);
return nil;
} /************************************************************
函数名称 : + (NSData *)dataWithBase64EncodedString:(NSString *)string
函数描述 : base64格式字符串转换为文本数据
输入参数 : (NSString *)string
输出参数 : N/A
返回参数 : (NSData *)
备注信息 :
**********************************************************/
+ (NSData *)dataWithBase64EncodedString:(NSString *)string
{
if (string == nil)
[NSException raise:NSInvalidArgumentException format:@""];
if ([string length] == 0)
return [NSData data]; static char *decodingTable = NULL;
if (decodingTable == NULL)
{
decodingTable = malloc(256);
if (decodingTable == NULL)
return nil;
memset(decodingTable, CHAR_MAX, 256);
NSUInteger i;
for (i = 0; i < 64; i++)
decodingTable[(short)encodingTable[i]] = i;
} const char *characters = [string cStringUsingEncoding:NSASCIIStringEncoding];
if (characters == NULL) // Not an ASCII string!
return nil;
char *bytes = malloc((([string length] + 3) / 4) * 3);
if (bytes == NULL)
return nil;
NSUInteger length = 0; NSUInteger i = 0;
while (YES)
{
char buffer[4];
short bufferLength;
for (bufferLength = 0; bufferLength < 4; i++)
{
if (characters[i] == '\0')
break;
if (isspace(characters[i]) || characters[i] == '=')
continue;
buffer[bufferLength] = decodingTable[(short)characters[i]];
if (buffer[bufferLength++] == CHAR_MAX) // Illegal character!
{
free(bytes);
return nil;
}
} if (bufferLength == 0)
break;
if (bufferLength == 1) // At least two characters are needed to produce one byte!
{
free(bytes);
return nil;
} // Decode the characters in the buffer to bytes.
bytes[length++] = (buffer[0] << 2) | (buffer[1] >> 4);
if (bufferLength > 2)
bytes[length++] = (buffer[1] << 4) | (buffer[2] >> 2);
if (bufferLength > 3)
bytes[length++] = (buffer[2] << 6) | buffer[3];
} bytes = realloc(bytes, length);
return [NSData dataWithBytesNoCopy:bytes length:length];
} /**
* 加密生成base64
*/
+ (NSString *)base64EncodedStringFromData:(NSData *)data{
if ([data length] == 0)
return @""; char *characters = malloc((([data length] + 2) / 3) * 4);
if (characters == NULL)
return nil;
NSUInteger length = 0; NSUInteger i = 0;
while (i < [data length])
{
char buffer[3] = {0,0,0};
short bufferLength = 0;
while (bufferLength < 3 && i < [data length])
buffer[bufferLength++] = ((char *)[data bytes])[i++]; // Encode the bytes in the buffer to four characters, including padding "=" characters if necessary.
characters[length++] = encodingTable[(buffer[0] & 0xFC) >> 2];
characters[length++] = encodingTable[((buffer[0] & 0x03) << 4) | ((buffer[1] & 0xF0) >> 4)];
if (bufferLength > 1)
characters[length++] = encodingTable[((buffer[1] & 0x0F) << 2) | ((buffer[2] & 0xC0) >> 6)];
else characters[length++] = '=';
if (bufferLength > 2)
characters[length++] = encodingTable[buffer[2] & 0x3F];
else characters[length++] = '=';
} return [[NSString alloc] initWithBytesNoCopy:characters length:length encoding:NSASCIIStringEncoding freeWhenDone:YES]; } @end
des 加密 iOS的更多相关文章
- (iOS)Base64加密和DES加密、以及JAVA和iOS中DES加密统一性问题
我们在项目中为了安全方面的考虑,通常情况下会选择一种加密方式对需要安全性的文本进行加密,而Base64加密和DES64加密是常用的加密算法.我记得我在前一个项目中使用的就是这两种加密算法的结合:Bas ...
- iOS 开发之路(AES/DES加密实现) 三
最近接触的这个项目由于以前服务器上用的是DES/CBC/PKCS5Padding加密方式,为了让在iOS上的加密结果与服务器端保持一致,我做了很多尝试,现在分享给大家.PS:现在不推荐用DES了,只是 ...
- iOS DES 加密转base64
//用法 加密转base 64 NSString *str = [self base64StringFromText:@"qingjoin" withKey:@"ke ...
- IOS、java支持DES加密
转载请注明博客地址:http://blog.csdn.net/mengxiangyue/article/details/40015727 近期在考虑数据加密方面的需求,所以对数据加密简单的看了一下,当 ...
- 兼容PHP和Java的des加密解密代码分享
这篇文章主要介绍了兼容PHP和Java的des加密解密代码分享,适合如服务器是JAVA语言编写,客户端是PHP编写,并需要des加密解密的情况,需要的朋友可以参考下 作为一个iOS工程师来解决安卓的问 ...
- 资源 Des加密
Unity3d资源管理分析 http://blog.csdn.net/sgnyyy/article/details/39268215 打包资源 http://www.cnblogs.com/sifen ...
- IOS-plist文件DES加密
转载请说明出处:http://www.cnblogs.com/gexun/p/3705207.html,谢谢. 这些天一直在做一个知识问答的项目,因为初赛的项目题目比较少,所以题目就写在本地的plis ...
- 关于Objective-c和Java下DES加密保持一致的方式
转载自:http://www.cnblogs.com/janken/archive/2012/04/05/2432930.html 最近做了一个移动项目,是有服务器和客户端类型的项目,客户端是要登录才 ...
- Android数据加密之Des加密
前言: 端午节前有个同事咨询我有关Android DES加密的相关实现,简单的实现了一下,今天来总结一下. 其他几种加密方式: Android数据加密之Rsa加密 Android数据加密之Aes加密 ...
随机推荐
- csu 1563 Lexicography
题意:给出一堆字母 问这些字母组成的字符串中第k大的 排列组合,具体看代码 //寒假集训被何柱大大踩好惨(>_<) #include<cstdio> #include<i ...
- libvirt C-API
1,warming-up Specifying URIs to libVirt;name parameter to virConnectOpen or virConnectOpenR ...
- python中判断readline读到文件末尾
fp = open('somefile.txt') while True: line = fp.readline() if not line: #等价于if line == "": ...
- 【我所認知的BIOS】—>ADU.exe
[我所認知的BIOS]—>ADU.exe By LightSeed 2009-5-12 1.概要 在學習的過程中,肯定會要用不少的工具,作為底層的engineer那麼用的工具大多是DOS下.在D ...
- iOS 模态视图转场的动画效果
ModalViewController * modalView = [[ModalViewController alloc]init]; modalView.modalTransitionStyle ...
- 一个JAVA代码
public class HelloJava { public static void main(String[] args) { System.out.println("这"); ...
- LitJson解析遇到的坑
今天在些项目的时候,遇到一个坑,现在跟大家分享一下 我遇到的错误是MissingMethodException: Method not found: 'Default constructor not ...
- ACM题目:487-3279
题目是这样子的 Description Businesses like to have memorable telephone numbers. One way to make a telephone ...
- BZOJ 3230: 相似子串( RMQ + 后缀数组 + 二分 )
二分查找求出k大串, 然后正反做后缀数组, RMQ求LCP, 时间复杂度O(NlogN+logN) -------------------------------------------------- ...
- Linux学习之输入输出重定向
转自:http://www.cnblogs.com/chengmo/archive/2010/10/20/1855805.html 多谢分享 在了解重定向之前,我们先来看看linux 的文件描述符. ...