DES加密(支持ARC与MRC)

源文件:

YXCrypto.h 与 YXCrypto.m

//
//  YXCrypto.h
//  用秘钥给字符串加密或者解密
//
//  Created by YouXian on 14-11-16.
//  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
//  用秘钥给字符串加密或者解密
//
//  Created by YouXian on 14-11-16.
//  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=0; 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,
        0, 0, 0, 0, 0, 0, 0,    // :, ;, <, =, >, ?, @,
        0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
    };

    // decode source content to bytes
    unsigned char* bytes = (unsigned char*)malloc((src.length+1)*sizeof(unsigned char));
    [[src uppercaseString] getCString:(char*)bytes maxLength:src.length+1 encoding:NSUTF8StringEncoding];
    unsigned char *p1 = bytes, *p2 = bytes;
    unsigned long n = src.length/2;
    for (int i=0; i<n; i++) {
        *p1 = _map_ch2hex[*p2-‘0‘] * 0x10 + _map_ch2hex[*(p2+1)-‘0‘];
        p1++;
        p2+=2;
    }
    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 - 1);
    unsigned char *buffer = (unsigned char *)malloc(bufferSize*sizeof(unsigned char));
    memset((void*)buffer, 0, bufferSize);

    size_t numBytesCrypted = 0;
    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

此类是用类方法,使用非常便利:

时间: 2024-08-28 09:22:35

DES加密(支持ARC与MRC)的相关文章

IOS、java支持DES加密

最近在考虑数据加密方面的需求,所以对数据加密简单的看了一下,当然不是看的原理,只是看看怎么能够实现.现在我们需要实现的是移动端和后台 (java)数据加解密的配合,开始的时候考虑的使用RSA,因为RSA是非对称加密,更加安全点,但是RSA加密的过程中,ios公钥加密的数据,后台 java是能够解密成功,但是后台java私钥加密的东西,前端ios,就没有解密成功,实验了很多方法,最终也没有成功,所以就放弃了,转向了安全性差 一点的DES加密. 对于DES.RSA的介绍,自己百度去吧,因为我也说不明

ARC和MRC混合模式下的编译问题

在一个支持ARC (Automatic Reference Counting)的项目中,有时候需要禁止其中几个文件使用ARC模式编译(比如你用了第三方不支持ARC的类库).这时就要点击工程文件,在target->build phases->Compiler flags中添加“-fno-objc-arc" 反之如果希望在MRC的项目中支持ARC模式,这时就要点击工程文件,在target->build phaese->compiler flags中添加“-fobjc-arc”

关于 Des加密(Android与ios 与后台java服务器之间的加密解密)

关于 Des加密(Android与ios  与后台java服务器之间的加密解密) http://blog.sina.com.cn/s/blog_7c8dc2d50101id91.html (2013-04-17 11:47:23)   分类: iPhone开发 最近做了一个移动项目,是有服务器和客户端类型的项目,客户端是要登录才行的,登录的密码要用DES加密,服务器是用Java开发的,客户端要同时支持多平台(Android.iOS),在处理iOS的DES加密的时候遇到了一些问题,起初怎么调都调不

iOS arc VS mrc学习笔记

一.* Core Foundation与objective-c Object进行交换 * 对于Core Foundation与objective-cObject进行交换时,需要用到的ARC管理机制有: (1) (__bridge_transfer) op or alternatively CFBridgingRelease(op) is used to consume a retain-count of a CFTypeRef while transferring it over to ARC.

关于Objective-c和Java下DES加密保持一致的方式

转载自:http://www.cnblogs.com/janken/archive/2012/04/05/2432930.html 最近做了一个移动项目,是有服务器和客户端类型的项目,客户端是要登录才行的,登录的密码要用DES加密,服务器是用Java开发的,客户端要同时支持多平台(Android.iOS),在处理iOS的DES加密的时候遇到了一些问题,起初怎么调都调不成和Android端生成的密文相同.最终一个忽然的想法让我找到了问题的所在,现在将代码总结一下,以备自己以后查阅. 首先,Java

DES加密实现(翻译自书籍《Wiley.Implementing.SSL.TLS.Using.Cryptography.and.PKI》)

理解BlockCipher加密算法 凯撒大帝被认为是最古老的对称加密算法.所谓的凯撒加密法(你也许可以从报纸上找到一个作为消遣来玩),它随机的给每一个字母分配一个数字.在这个简单的算法当中,字母到数字的映射就是key.现代加密算法比凯撒算法肯定复杂的多,以便抵御来自计算机的攻击.尽管基本原理是一样,替换一个字母或其它什么东西为另外一个字母或其它什么东西,后续都对替换后的东西进行处理,在几个世纪以来,更多的混淆和扩散(confusion and diffusion)要素被加入,从而创建了现代加密算

(iOS)Base64加密和DES加密、以及JAVA和iOS中DES加密统一性问题

我们在项目中为了安全方面的考虑,通常情况下会选择一种加密方式对需要安全性的文本进行加密,而Base64加密和DES64加密是常用的加密算法.我记得我在前一个项目中使用的就是这两种加密算法的结合:Base64 + DES加密.当然这需要移动端和后台服务器做一个统一. 1.Base64加解密 值得一提的是:apple提供了基础的Base64加解密算法.这样我们就可以直接使用方法去实现Base64加解密.先看一下apple都提供了哪些方法: @interface NSData (NSDataBase6

【Android开发经验】DES加密时代的终结者——AES加密算法

转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992 在前面的两篇文章中,我们介绍了DES算法,3DES算法以及他们的Android程序实现,并研究了如何才能实现不同平台下加密算法的一致性.不过话说起来,DES算法是在1976年被美国的国家标准局定为联邦资料的加密标准的,到现在已经接近40年了.我们都知道,在计算机的世界里有一个摩尔定律,就是每过18个月,计算机的晶体管的数量就会翻一番,对应的计算速度也会翻倍,虽然现在的发展速度有所放缓,但是每过三年左右,计

DES加密解密-&gt;java实现

DES加密解密涉及到的JAVA类 Cipher 此类为加密和解密提供密码功能.它构成了 Java Cryptographic Extension (JCE) 框架的核心. 为创建 Cipher 对象,应用程序调用 Cipher 的 getInstance 方法并将所请求转换 的名称传递给它.还可以指定提供者的名称(可选). 转换 是一个字符串,它描述为产生某种输出而在给定的输入上执行的操作(或一组操作).转换始终包括加密算法的名称(例如,DES),后面可能跟有一个反馈模式和填充方案. 转换具有以