//
// NSData+AES.h
// Smile
//
// Created by 蒲晓涛 on 12-11-24.
// Copyright (c) 2012年 BOX. All rights reserved.
// // 版权属于原作者
// http://code4app.com (cn) http://code4app.net (en)
// 发布代码于最专业的源码分享网站: Code4App.com #import <Foundation/Foundation.h> @class NSString; @interface NSData (Encryption) - (NSData *)AES128EncryptWithKey:(NSString *)key; //加密
- (NSData *)AES128DecryptWithKey:(NSString *)key; //解密 @end
//
// NSData+AES.h
// Smile
//
// Created by 蒲晓涛 on 12-11-24.
// Copyright (c) 2012年 BOX. All rights reserved.
// // 版权属于原作者
// http://code4app.com (cn) http://code4app.net (en)
// 发布代码于最专业的源码分享网站: Code4App.com #import "NSData+AES.h"
#import <CommonCrypto/CommonCryptor.h> #define gIv @"205681D89D731A8F" //可以自行修改 @implementation NSData (Encryption) //(key和iv向量这里是16位的) 这里是CBC加密模式,安全性更高 - (NSData *)AES128EncryptWithKey:(NSString *)key {//加密
char keyPtr[kCCKeySizeAES128+];
bzero(keyPtr, sizeof(keyPtr));
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; char ivPtr[kCCKeySizeAES128+];
memset(ivPtr, , sizeof(ivPtr));
[gIv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding]; NSUInteger dataLength = [self length];
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);
size_t numBytesEncrypted = ; CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
kCCAlgorithmAES128,
kCCOptionPKCS7Padding,
keyPtr,
kCCBlockSizeAES128,
ivPtr,
[self bytes],
dataLength,
buffer,
bufferSize,
&numBytesEncrypted);
if (cryptStatus == kCCSuccess) {
return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
}
free(buffer);
return nil;
} - (NSData *)AES128DecryptWithKey:(NSString *)key {//解密
char keyPtr[kCCKeySizeAES128+];
bzero(keyPtr, sizeof(keyPtr));
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; char ivPtr[kCCKeySizeAES128+];
memset(ivPtr, , sizeof(ivPtr));
[gIv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding]; NSUInteger dataLength = [self length];
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);
size_t numBytesDecrypted = ;
CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
kCCAlgorithmAES128,
kCCOptionPKCS7Padding,
keyPtr,
kCCBlockSizeAES128,
ivPtr,
[self bytes],
dataLength,
buffer,
bufferSize,
&numBytesDecrypted);
if (cryptStatus == kCCSuccess) {
return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
}
free(buffer);
return nil;
} @end
//
// SecurityUtil.h
// Smile
//
// Created by 蒲晓涛 on 12-11-24.
// Copyright (c) 2012年 BOX. All rights reserved.
// // 版权属于原作者
// http://code4app.com (cn) http://code4app.net (en)
// 发布代码于最专业的源码分享网站: Code4App.com #import <Foundation/Foundation.h> @interface SecurityUtil : NSObject #pragma mark - base64
+ (NSString*)encodeBase64String:(NSString *)input;
+ (NSString*)decodeBase64String:(NSString *)input; + (NSString*)encodeBase64Data:(NSData *)data;
+ (NSString*)decodeBase64Data:(NSData *)data; #pragma mark - AES加密
//将string转成带密码的data
//加密后16进制输出
+(NSString*)encryptAESDataToHexString:(NSString*)string app_key:(NSString*)key ; //加密后base64输出
+(NSString*)encryptAESDataToBase64:(NSString*)string app_key:(NSString*)key; //将带密码的data转成string
//解密base64
+(NSString*)decryptAESStringFromBase64:(NSString *)string app_key:(NSString*)key; //解密16进制
+(NSString*)decryptAESStringFromHexString:(NSString *)string app_key:(NSString*)key; @end

//
// SecurityUtil.h
// Smile
//
// Created by 蒲晓涛 on 12-11-24.
// Copyright (c) 2012年 BOX. All rights reserved.
// // 版权属于原作者
// http://code4app.com (cn) http://code4app.net (en)
// 发布代码于最专业的源码分享网站: Code4App.com #import "SecurityUtil.h"
#import "GTMBase64.h"
#import "NSData+AES.h" #define C2I(c) ((c >= '0' && c<='9') ? (c-'0') : ((c >= 'a' && c <= 'z') ? (c - 'a' + 10): ((c >= 'A' && c <= 'Z')?(c - 'A' + 10):(-1))))
@implementation SecurityUtil #pragma mark - base64
+ (NSString*)encodeBase64String:(NSString * )input {
NSData *data = [input dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
data = [GTMBase64 encodeData:data];
NSString *base64String = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
return base64String;
} + (NSString*)decodeBase64String:(NSString * )input {
NSData *data = [input dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
data = [GTMBase64 decodeData:data];
NSString *base64String = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
return base64String;
} + (NSString*)encodeBase64Data:(NSData *)data {
data = [GTMBase64 encodeData:data];
NSString *base64String = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
return base64String;
} + (NSString*)decodeBase64Data:(NSData *)data {
data = [GTMBase64 decodeData:data];
NSString *base64String = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
return base64String;
} #pragma mark - AES加密
//将string转成带密码的data
+(NSString*)encryptAESDataToHexString:(NSString*)string app_key:(NSString*)key
{
//将nsstring转化为nsdata
NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
NSData *encryptedData = [data AES128EncryptWithKey:key];
Byte *bytes = (Byte *)[encryptedData bytes];
NSLog(@"%@", encryptedData);
//下面是Byte 转换为16进制。
NSString *hexStr=@"";
for(int i=;i<[encryptedData length];i++) {
NSString *newHexStr = [NSString stringWithFormat:@"%x",bytes[i]&0xff];///16进制数 if([newHexStr length]==) hexStr = [NSString stringWithFormat:@"%@0%@",hexStr,newHexStr]; else hexStr = [NSString stringWithFormat:@"%@%@",hexStr,newHexStr];
}
NSLog(@"%@", hexStr);
NSLog(@"%@", hexStr.uppercaseString);
return hexStr.uppercaseString;
} +(NSString*)encryptAESDataToBase64:(NSString*)string app_key:(NSString*)key
{
//将nsstring转化为nsdata
NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
NSData *encryptedData = [data AES128EncryptWithKey:key];
Byte *bytes = (Byte *)[encryptedData bytes];
NSLog(@"%@", encryptedData);
NSLog(@"加密后的字符串 :%@",[encryptedData base64Encoding]); return [encryptedData base64Encoding];
} #pragma mark - 转16进制
-(NSString *)hexStringFromData:(NSData *)data{
Byte *bytes = (Byte *)[data bytes];
//下面是Byte 转换为16进制。
NSString *hexStr=@"";
for(int i=;i<[data length];i++) {
NSString *newHexStr = [NSString stringWithFormat:@"%x",bytes[i]&0xff];///16进制数 if([newHexStr length]==) hexStr = [NSString stringWithFormat:@"%@0%@",hexStr,newHexStr]; else hexStr = [NSString stringWithFormat:@"%@%@",hexStr,newHexStr];
}
return hexStr;
} #pragma mark - 16进制转data
-(NSData *)convert:(NSString *)str { const char* cs = str.UTF8String; int count = strlen(cs); int8_t bytes[count / ]; for(int i = ; i<count; i+=)
{
char c1 = *(cs + i);
char c2 = *(cs + i + );
if(C2I(c1) >= && C2I(c2) >= ){
bytes[i / ] = C2I(c1) * + C2I(c2);
}else{
return nil;
}
}
return [NSData dataWithBytes:bytes length:count / ];
} #pragma mark - AES解密
//将带密码的data转成string
+(NSString*)decryptAESStringFromBase64:(NSString *)string app_key:(NSString*)key
{
NSData *EncryptData = [GTMBase64 decodeString:string]; //解密前进行GTMBase64编码
//使用密码对data进行解密
NSData *decryData = [EncryptData AES128DecryptWithKey:key];
//将解了密码的nsdata转化为nsstring
NSString *str = [[NSString alloc] initWithData:decryData encoding:NSUTF8StringEncoding];
return str;
}
//--------------------------------------------------------
+(NSString*)decryptAESStringFromHexString:(NSString *)string app_key:(NSString*)key
{
//16进制转data
const char* cs = string.UTF8String; int count = strlen(cs); int8_t bytes[count / ]; for(int i = ; i<count; i+=)
{
char c1 = *(cs + i);
char c2 = *(cs + i + );
if(C2I(c1) >= && C2I(c2) >= ){
bytes[i / ] = C2I(c1) * + C2I(c2);
}else{
return nil;
}
}
NSData * newData = [NSData dataWithBytes:bytes length:count / ];
NSLog(@"%@", newData);
//NSData *EncryptData = [GTMBase64 decodeString:string]; //解密前进行GTMBase64编码
//使用密码对data进行解密
NSData *decryData = [newData AES128DecryptWithKey:key];
//将解了密码的nsdata转化为nsstring
NSString *str = [[NSString alloc] initWithData:decryData encoding:NSUTF8StringEncoding];
return str;
} @end
 

AES 加解密的更多相关文章

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

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

  2. c# Aes加解密和对象序列化

    aes加解密 public class AesCryptto { private string key = "hjyf57468jhmuist"; private string i ...

  3. Java、C#双语版配套AES加解密示例

      这年头找个正经能用的东西那是真难,网上一搜索一大堆,正经能用的没几个,得,最后还是得靠自己,正巧遇上需要AES加解密的地方了,而且还是Java和C#间的相互加解密操作,这里做个备忘 这里采用的加解 ...

  4. AES加解密算法Qt实现

    [声明] (1) 本文源码 在一位未署名网友源码基础上,利用Qt编程,实现了AES加解密算法,并添加了文件加解密功能.在此表示感谢!该源码仅供学习交流,请勿用于商业目的. (2) 图片及描述 除图1外 ...

  5. aes加解密 Illegal key size

    做aes加密时,发生一个奇怪的错误,在本地环境是好的,发布到测试环境就出问题, java.security.InvalidKeyException: Illegal key size 想到本地环境之前 ...

  6. C# RSA加解密与验签,AES加解密,以及与JAVA平台的密文加解密

    前言: RSA算法是利用公钥与密钥对数据进行加密验证的一种算法.一般是拿私钥对数据进行签名,公钥发给友商,将数据及签名一同发给友商,友商利用公钥对签名进行验证.也可以使用公钥对数据加密,然后用私钥对数 ...

  7. Aes加解密,php

    Aes类库 <?php namespace Aes; class Aes { /** * var string $method 加解密方法,可通过openssl_get_cipher_metho ...

  8. cryptoJS AES 加解密简单使用

    简单记录一下,前端利用 cryptoJS 如何加解密的.主要是关于 AES 加解密. 需求描述:需要对 url 中的参数进行 AES 解密,然后再把该参数进行 MD5 加密通过接口传递. AES AE ...

  9. AES加解密程序的实现

    AES加解密程序的实现正常情况,用户不能访问sys.dbms_crypto,需要DBA授权:grant execute on dbms_crypto to crm;建立加解密的PKG_AES包:CRE ...

  10. 收银台数据库存储AES加解密

    高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法加密和解密用到的密钥是相同的,这种加密方式加密速度非常快,适合经常发送数据的场合.缺点是密钥的传输 ...

随机推荐

  1. Windows server 2008 上部署 MVC (NopCommerce 3.4)网站

    自己用开源框架做了个商城,该框架是基于mvc4的,本地编译通过,运行一切正常,关于发布遇到了好几个问题. 本地: IIS7.5. VS2013 总结后发现只需要设置两个问题,就不会有那些古怪的问题:什 ...

  2. SRM 508 DIV1 500pt(DP)

    题目简述 给定一个大小为 n的序列(n<=10)R,要求你计算序列A0, A1, ..., AN-1的数量,要求A序列满足A0 + A1 + ... + AN-1 = A0 | A1 | ... ...

  3. cloudera hbase集群简单思路

    文章copy link:http://cloudera.iteye.com/blog/889468 链接所有者保留所有权! http://www.csdn.net/article/2013-05-10 ...

  4. POJ 1236 Network of Schools (有向图的强连通分量)

    Network of Schools Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 9073   Accepted: 359 ...

  5. Linux 性能监控的18个命令行工具

    对于系统和网络管理员来说每天监控和调试Linux系统的性能问题是一项繁重的工作.在IT领域作为一名Linux系统的管理员工作5年后,我逐渐 认识到监控和保持系统启动并运行是多么的不容易.基于此原因,我 ...

  6. ThinkPHP框架的网站url重写

    nginx location / { root /var/www; index index.html index.htm index.php; if (!-e $request_filename) { ...

  7. CentOS 搭建LNMP服务器和LAMP服务器

    CentOS 搭建LNMP服务器 方法一:yum安装 1.更新YUM源 wget http://www.atomicorp.com/installers/atomic   #下载atomic自动更新Y ...

  8. ActiveMQ学习笔记(二) JMS与Spring

    上文可见,JMS Native API使用起来不是特别方便.好在Spring提供了很好的JMS支持. (一)配置ConnectionFactory 如果使用连接池的话,不要忘记activemq-poo ...

  9. 一、Microsoft Dynamics CRM 4.0 SDK概述

    Chapter 1. Microsoft Dynamics CRM 4.0 SDK Overview(SDK概述) You are probably reading this book because ...

  10. disque概要

    做项目过程接触到disque,记录一下. disque是redis之父开源的基于内存的分布式作业队列,用c语言实现的非阻塞网络服务器. disque的设计目标:Its goal is to captu ...