DES算法

☆提供高质量的数据保护,防止数据未经授权的泄露和未被察觉的修改

☆具有相当高的复杂性,使得破译的开销超过可能获得的利益,同时又要便于理解和掌握

☆DES密码体制的安全性应该不依赖于算法的保密,其安全性仅以加密密钥的保密为基础

☆实现经济,运行有效,并且适用于多种完全不同的应用

苹果本身支持DES加密,在项目中引入头文件 CommonCrypto/CommonCryptor.h 即可使用相关函数.

我自己对其进行了封装,支持ARC与非ARC

YXCrypto.h

//
// YXCrypto.h
// 用秘钥给字符串加密或者解密
//
// Created by YouXian on 14-3-18.
// Copyright (c) 2014年 YouXian. All rights reserved.
// #import <Foundation/Foundation.h> @interface YXCrypto : NSObject /*!
* 给字符串加密
*/
+ (NSString *)DesEncryptString:(NSString*)src WithKey:(NSString *)key; /*!
* 给字符串解密
*/
+ (NSString *)DesDecryptString:(NSString*)src WithKey:(NSString *)key; @end

YXCrypto.m

//
// YXCrypto.m
// 用秘钥给字符串加密或者解密
//
// Created by YouXian on 14-3-18.
// Copyright (c) 2014年 YouXian. All rights reserved.
// #import "YXCrypto.h"
#import <CommonCrypto/CommonCryptor.h> #if __has_feature(objc_arc)
// ARC
#define Auto_Release(obj)
#define Safe_Release(obj)
#else
// 非ARC
#define Auto_Release(obj) [obj autorelease]
#define Safe_Release(obj) [obj release]; obj = nil
#endif static YXCrypto *shareInstance = nil; @implementation YXCrypto /*!
* 给字符串加密
*/
+ (NSString *)DesEncryptString:(NSString*)src WithKey:(NSString *)key {
NSString* strRet = @""; if (shareInstance == nil)
{
shareInstance = [[YXCrypto alloc] init];
} // encrypt source content
NSData* bytes = [src dataUsingEncoding:NSUTF8StringEncoding];
NSData* data = [shareInstance DesCryptWithOperation:kCCEncrypt
bytes:bytes
key:key]; // format bytes to visible string
char* pBuff = (char*)[data bytes];
for (int i=; i<data.length; i++) {
strRet = [strRet stringByAppendingFormat:@"%02X", pBuff[i]& 0xFF];
}
return strRet;
} /*!
* 给字符串解密
*/
+ (NSString *)DesDecryptString:(NSString*)src WithKey:(NSString *)key
{
if (shareInstance == nil)
{
shareInstance = [[YXCrypto alloc] init];
} static unsigned char _map_ch2hex[] =
{
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
, , , , , , , // :, ;, <, =, >, ?, @,
0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
}; // decode source content to bytes
unsigned char* bytes = (unsigned char*)malloc((src.length+)*sizeof(unsigned char));
[[src uppercaseString] getCString:(char*)bytes maxLength:src.length+ encoding:NSUTF8StringEncoding];
unsigned char *p1 = bytes, *p2 = bytes;
int n = src.length/;
for (int i=; i<n; i++) {
*p1 = _map_ch2hex[*p2-''] * 0x10 + _map_ch2hex[*(p2+)-''];
p1++;
p2+=;
}
NSData* data = [NSData dataWithBytes:bytes
length:n]; // decrypt source bytes
NSData* dataOut = [shareInstance DesCryptWithOperation:kCCDecrypt
bytes:data
key:key];
free(bytes); NSString* strRet = [[NSString alloc] initWithData:dataOut
encoding:NSUTF8StringEncoding];
Auto_Release(strRet); return strRet;
} - (NSData *)DesCryptWithOperation:(CCOperation)operation bytes:(NSData*)bytes key:(NSString *)key { NSUInteger dataLength = [bytes length]; size_t bufferSize = ([bytes length] + kCCBlockSizeDES) & ~(kCCBlockSizeDES - );
unsigned char *buffer = (unsigned char *)malloc(bufferSize*sizeof(unsigned char));
memset((void*)buffer, , bufferSize); size_t numBytesCrypted = ;
CCCryptorStatus cryptStatus = CCCrypt(operation,
kCCAlgorithmDES,
kCCOptionPKCS7Padding | kCCOptionECBMode,
(void const*)[key UTF8String],
kCCKeySizeDES,
NULL,
[bytes bytes], dataLength,
(void*)buffer, bufferSize,
&numBytesCrypted);
NSData* dataRet = nil;
if (cryptStatus == kCCSuccess) {
dataRet = [[NSData alloc] initWithBytes:buffer length:numBytesCrypted];
Auto_Release(dataRet);
}
free(buffer);
return dataRet;
} @end

使用:

附录1:https://github.com/alfaromeodev/Cryptor

//
// Cryptor.h
// test
//
// Created by Da Zhang on 11/5/12.
// Copyright 2012 __MyCompanyName__. All rights reserved.
// #import <Foundation/Foundation.h>
#import <CommonCrypto/CommonDigest.h>
#import <CommonCrypto/CommonCryptor.h> @interface Cryptor : NSObject { } /*
all the methods below only support utf8 string
*/
+ (NSString *)encodeMD5:(NSString *)str; + (NSString *)encodeDES:(NSString *)plainString key:(NSString *)key;
+ (NSString *)decodeDES:(NSString *)decodedString key:(NSString*)key; + (NSString *)encodeBase64:(NSString *)plainString;
+ (NSString *)decodeBase64:(NSString *)decodedString; @end
//
// Cryptor.m
// test
//
// Created by Da Zhang on 11/5/12.
// Copyright 2012 __MyCompanyName__. All rights reserved.
// #import "Cryptor.h" @interface Cryptor () + (NSString *)encodeBase64WithData:(NSData *)objData;
+ (NSData *)decodeBase64WithUTF8String:(NSString *)strBase64;
+ (NSString *)parseByte2HexString:(Byte *)bytes; @end static const char _base64EncodingTable[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
static const short _base64DecodingTable[] = {
-, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -,
-, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -,
-, -, -, -, -, -, -, -, -, -, -, , -, -, -, ,
, , , , , , , , , , -, -, -, -, -, -,
-, , , , , , , , , , , , , , , ,
, , , , , , , , , , , -, -, -, -, -,
-, , , , , , , , , , , , , , , ,
, , , , , , , , , , , -, -, -, -, -,
-, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -,
-, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -,
-, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -,
-, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -,
-, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -,
-, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -,
-, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -,
-, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -
}; @implementation Cryptor #pragma mark private section
+ (NSData *)decodeBase64WithUTF8String:(NSString *)strBase64 {
const char * objPointer = [strBase64 cStringUsingEncoding:NSUTF8StringEncoding];
int intLength = strlen(objPointer);
int intCurrent;
int i = , j = , k; unsigned char * objResult;
objResult = calloc(intLength, sizeof(char)); // Run through the whole string, converting as we go
while ( ((intCurrent = *objPointer++) != '\0') && (intLength-- > ) ) {
if (intCurrent == '=') {
if (*objPointer != '=' && ((i % ) == )) {// || (intLength > 0)) {
// the padding character is invalid at this point -- so this entire string is invalid
free(objResult);
return nil;
}
continue;
} intCurrent = _base64DecodingTable[intCurrent];
if (intCurrent == -) {
// we're at a whitespace -- simply skip over
continue;
} else if (intCurrent == -) {
// we're at an invalid character
free(objResult);
return nil;
} switch (i % ) {
case :
objResult[j] = intCurrent << ;
break; case :
objResult[j++] |= intCurrent >> ;
objResult[j] = (intCurrent & 0x0f) << ;
break; case :
objResult[j++] |= intCurrent >>;
objResult[j] = (intCurrent & 0x03) << ;
break; case :
objResult[j++] |= intCurrent;
break;
}
i++;
} // mop things up if we ended on a boundary
k = j;
if (intCurrent == '=') {
switch (i % ) {
case :
// Invalid state
free(objResult);
return nil; case :
k++;
// flow through
case :
objResult[k] = ;
}
} // Cleanup and setup the return NSData
NSData * objData = [[[NSData alloc] initWithBytes:objResult length:j] autorelease];
free(objResult);
return objData;
} + (NSString *)encodeBase64WithData:(NSData *)objData {
const unsigned char * objRawData = [objData bytes];
char * objPointer;
char * strResult; // Get the Raw Data length and ensure we actually have data
int intLength = [objData length];
if (intLength == ) return nil; // Setup the String-based Result placeholder and pointer within that placeholder
strResult = (char *)calloc(((intLength + ) / ) * , sizeof(char));
objPointer = strResult; // Iterate through everything
while (intLength > ) { // keep going until we have less than 24 bits
*objPointer++ = _base64EncodingTable[objRawData[] >> ];
*objPointer++ = _base64EncodingTable[((objRawData[] & 0x03) << ) + (objRawData[] >> )];
*objPointer++ = _base64EncodingTable[((objRawData[] & 0x0f) << ) + (objRawData[] >> )];
*objPointer++ = _base64EncodingTable[objRawData[] & 0x3f]; // we just handled 3 octets (24 bits) of data
objRawData += ;
intLength -= ;
} // now deal with the tail end of things
if (intLength != ) {
*objPointer++ = _base64EncodingTable[objRawData[] >> ];
if (intLength > ) {
*objPointer++ = _base64EncodingTable[((objRawData[] & 0x03) << ) + (objRawData[] >> )];
*objPointer++ = _base64EncodingTable[(objRawData[] & 0x0f) << ];
*objPointer++ = '=';
} else {
*objPointer++ = _base64EncodingTable[(objRawData[] & 0x03) << ];
*objPointer++ = '=';
*objPointer++ = '=';
}
} // Terminate the string-based result
*objPointer = '\0'; // Return the results as an NSString object
return [NSString stringWithCString:strResult encoding:NSUTF8StringEncoding];
} + (NSString *)parseByte2HexString:(Byte *)bytes {
NSMutableString *hexStr = [[NSMutableString alloc]init];
int i = ;
if(bytes) {
while (bytes[i] != '\0') {
NSString *hexByte = [NSString stringWithFormat:@"%x",bytes[i] & 0xff];///16进制数
if([hexByte length]==) [hexStr appendFormat:@"0%@", hexByte];
else [hexStr appendFormat:@"%@", hexByte];
i++;
}
}
//NSLog(@"bytes 的16进制数为:%@",hexStr);
return hexStr;
} #pragma mark public section
+ (NSString *)encodeMD5:(NSString *)str { const char *cStr = [str UTF8String]; unsigned char result[CC_MD5_DIGEST_LENGTH]; CC_MD5( cStr, strlen(cStr), result ); return [NSString stringWithFormat: @"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", result[], result[], result[], result[], result[], result[], result[], result[], result[], result[], result[], result[], result[], result[], result[], result[] ]; } + (NSString *)encodeBase64:(NSString *)plainString {
return [Cryptor encodeBase64WithData:[plainString dataUsingEncoding:NSUTF8StringEncoding]];
} + (NSString *)decodeBase64:(NSString *)decodedString {
NSData * objData = [Cryptor decodeBase64WithUTF8String:decodedString];
return [[NSString alloc] initWithData:objData encoding:NSUTF8StringEncoding];
} + (NSString *)encodeDES:(NSString *)plainString key:(NSString *)key {
NSString *ciphertext = nil;
const char *textBytes = [plainString UTF8String];
NSUInteger dataLength = strlen(textBytes);
unsigned char buffer[];
memset(buffer, , sizeof(char));
Byte iv[] = {,,,,,,,};
size_t numBytesEncrypted = ;
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
kCCAlgorithmDES,
kCCOptionPKCS7Padding,
[key UTF8String],
kCCKeySizeDES,
iv,
textBytes,
dataLength,
buffer,
,
&numBytesEncrypted);
if (cryptStatus == kCCSuccess) {
NSData *data = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesEncrypted];
ciphertext = [[Cryptor encodeBase64WithData:data] autorelease];
}
return ciphertext;
} + (NSString *)decodeDES:(NSString*)decodedString key:(NSString*)key {
NSData* cipherData = [Cryptor decodeBase64WithUTF8String:decodedString];
unsigned char buffer[];
memset(buffer, , sizeof(char));
size_t numBytesDecrypted = ;
Byte iv[] = {,,,,,,,};
CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
kCCAlgorithmDES,
kCCOptionPKCS7Padding,
[key UTF8String],
kCCKeySizeDES,
iv,
[cipherData bytes],
[cipherData length],
buffer,
,
&numBytesDecrypted);
NSString* plainText = nil;
if (cryptStatus == kCCSuccess) {
NSData* data = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesDecrypted];
plainText = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease];
}
return plainText;
} @end

附录2:AES加密

NSData+AES.h + NSData+AES.m

#import <Foundation/Foundation.h>

/**
* Adds AES encryption and decryption capabilities to NSData.
*/
@interface NSData (AES) /**
* Encrypt NSData using AES256 with a given symmetric encryption key.
* @param key The symmetric encryption key
*/
- (NSData *)AES256EncryptWithKey:(NSString *)key; /**
* Decrypt NSData using AES256 with a given symmetric encryption key.
* @param key The symmetric encryption key
*/
- (NSData *)AES256DecryptWithKey:(NSString *)key; @end
#import "NSData+AES.h"
#import <CommonCrypto/CommonCryptor.h> @implementation NSData (AES) - (NSData *)AES256EncryptWithKey:(NSString *)key
{
// 'key' should be 32 bytes for AES256, will be null-padded otherwise
char keyPtr[kCCKeySizeAES256+]; // room for terminator (unused)
bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding) // fetch key data
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; NSUInteger dataLength = [self length]; //See the doc: For block ciphers, the output size will always be less than or
//equal to the input size plus the size of one block.
//That's why we need to add the size of one block here
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize); size_t numBytesEncrypted = ;
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
keyPtr, kCCKeySizeAES256,
NULL /* initialization vector (optional) */,
[self bytes], dataLength, /* input */
buffer, bufferSize, /* output */
&numBytesEncrypted);
if (cryptStatus == kCCSuccess) {
//the returned NSData takes ownership of the buffer and will free it on deallocation
return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
} free(buffer); //free the buffer;
return nil;
} - (NSData *)AES256DecryptWithKey:(NSString *)key {
// 'key' should be 32 bytes for AES256, will be null-padded otherwise
char keyPtr[kCCKeySizeAES256+]; // room for terminator (unused)
bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding) // fetch key data
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; NSUInteger dataLength = [self length]; //See the doc: For block ciphers, the output size will always be less than or
//equal to the input size plus the size of one block.
//That's why we need to add the size of one block here
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize); size_t numBytesDecrypted = ;
CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
keyPtr, kCCKeySizeAES256,
NULL /* initialization vector (optional) */,
[self bytes], dataLength, /* input */
buffer, bufferSize, /* output */
&numBytesDecrypted); if (cryptStatus == kCCSuccess) {
//the returned NSData takes ownership of the buffer and will free it on deallocation
return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
} free(buffer); //free the buffer;
return nil;
} @end

使用 DES 算法对数据加密的更多相关文章

  1. 聊聊密码学中的DES算法

    用心分享,共同成长 没有什么比你每天进步一点点更实在了 本文已经收录至我的github,欢迎大家踊跃star 和 issues. https://github.com/midou-tech/artic ...

  2. DES算法详解

    本文主要介绍了DES算法的步骤,包括IP置换.密钥置换.E扩展置换.S盒代替.P盒置换和末置换. 1.DES算法简介 DES算法为密码体制中的对称密码体制,又被称为美国数据加密标准. DES是一个分组 ...

  3. AES算法,DES算法,RSA算法JAVA实现

    1     AES算法 1.1    算法描述 1.1.1      设计思想 Rijndael密码的设计力求满足以下3条标准: ① 抵抗所有已知的攻击. ② 在多个平台上速度快,编码紧凑. ③ 设计 ...

  4. 安全体系(一)—— DES算法详解

    本文主要介绍了DES算法的步骤,包括IP置换.密钥置换.E扩展置换.S盒代替.P盒置换和末置换. 安全体系(零)—— 加解密算法.消息摘要.消息认证技术.数字签名与公钥证书 安全体系(二)——RSA算 ...

  5. Web安全学习笔记之DES算法实例详解

    转自http://www.hankcs.com/security/des-algorithm-illustrated.html 译自J. Orlin Grabbe的名作<DES Algorith ...

  6. DES算法解析

    DES算法  美国国家标准局1973年开始研究除国防部外的其它部门的计算机系统的数据加密标准,于1973年5月15日和1974年8月27日先后两次向公众发出了征求加密算法的公告. 1977年1月,美国 ...

  7. DES算法与四种加密模式的代码实现(C++语言)

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/Love_Irelia97/article/ ...

  8. 使用DES算法实现加密解密

    使用DES算法实现加密解密 我们常见的加密算法有DES.MD5.IDEA.AES等等,这篇随笔介绍使用DES算法实现加密解密 首先介绍一下DES算法: DES算法为密码体制中的对称密码体制,又被称为美 ...

  9. DES算法实现

    概述(团队项目) DES是一个分组加密算法,它以64位为分组对数据加密.同时DES也是一个对称算法:加密和解密用的是同一个算法.DES是一个包含16个阶段的"替换–置换"的分组加密 ...

随机推荐

  1. .NetCore读取配置Json文件到类中并在程序使用

    ConfigurationBuilder 这个类提供了配置绑定,在dnc中 Program中WebHost提供了默认的绑定(appsettings文件) 如果我们需要加载我们自己的json配置文件怎么 ...

  2. MFC+WinPcap编写一个嗅探器之五(过滤模块)

    这一节主要介绍如何获设置捕获过滤,这里的过滤是指在捕获前过滤 设置捕获过滤主要是在CFilterDlg中完成,也就是对应之前创建的设置过滤规则对话框,如图: 首先要根据用户的选择来生成一个合法的过滤规 ...

  3. USACO 6.1 Postal Vans(一道神奇的dp)

    Postal Vans ACM South Pacific Region -- 2003 Tiring of their idyllic fields, the cows have moved to ...

  4. 本机ip和127.0.0.1的区别

    简介 连接上因特网的每一台计算机都会有一个IP地址, 在linux下可以使用命令ifconfig来查看本机的ip地址(windows为ipconfig), 比如我当前电脑的ip地址为192.168.0 ...

  5. JAVAEE——宜立方商城12:购物车实现、订单确认页面展示

    1. 学习计划 第十二天: 1.购物车实现 2.订单确认页面展示 2. 购物车的实现 2.1. 功能分析 1.购物车是一个独立的表现层工程. 2.添加购物车不要求登录.可以指定购买商品的数量. 3.展 ...

  6. spring 装配bean的三种方式

    这段时间在学习Spring,依赖注入DI和面向切面编程AOP是Spring框架最核心的部分.这次主要是总结依赖注入的bean的装配方式. 什么是依赖注入呢?也可以称为控制反转,简单的来说,一般完成稍微 ...

  7. 使用GIT进行源码管理——GUI客户端

    很多人对GIT GUI客户端是非常不屑一顾的,但我非常喜欢GUI的方便快捷,也不用记忆冗杂的命令,本文简单的介绍了几种免费的Windows下的GIT客户端,方便大家使用. Git for Window ...

  8. 【基础知识】.Net基础加强第三天

    一. 里氏替换原则--类型转换 1. 里氏替换原则:当需要一个父类类型对象的时候,可以给一个子类类型的对象. 2. 里氏替换原则实际也就是发生了隐身转换 3.  a.>把子类类型赋值给父类类型, ...

  9. MySQL 类型转换

    1.问题描述 在项目中遇到要将Int类型转为Char类型,然后利用转化后的Char类型进行模糊查询. 例:合同编号在数据库中为int类型 8066 用利用 806 模糊查询出合同编号为8066数据记录 ...

  10. CSS3组件化之圆波扩散

    本篇文章主要介绍用CSS3实现的水波扩散涟漪,圆波扩散,光圈扩散,雷达波向外散发动画. 预期效果应该是这样:,其实应该比这个更优美,因为设计师提供的gif出现透明度丢失问题,所以建议用css3实现. ...