iOS 中 AES256 的实现 - 更喜欢 C 实现,OC 封装的风格

iOS 中 AES256 的实现 - 更喜欢 C 实现,OC 封装的风格

太阳火神的美丽人生 (http://blog.csdn.net/opengl_es)

本文遵循“署名-非商业用途-保持一致”创作公用协议

转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS、Android、Html5、Arduino、pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作。

这段话摘自维基百科

高级加密标准Advanced
Encryption Standard,AES)
,在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS
PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。

该算法为比利时密码学家Joan Daemen和Vincent Rijmen所设计,结合两位作者的名字,以Rijndael为名投稿高级加密标准的甄选流程。(Rijndael的发音近于 "Rhine doll")

目录

  [隐藏

在网上搜了一下AES256,居然有这么一篇“闲来无事,写个AES(256位)加解密程序”,是Java中的实现,有空转载一下。

待我用iOS中的加解密和JAVA中的这篇互相验证确实可互逆时,那么我就可以 “原创” 一篇 “整理iOS和Android与C#.NET服务器之间AES256的加解密研究整理”,一定很受欢迎。

完全是乔布斯的理论??@@@!!!

素材已经是现成的了,在2011年时就已经搜集整理好,以备后用。只不过那个实现是使用的iOS的框架加强功能,并未与C#调通,这个确需进一步验证。

下面还是直接贴源代码吧,至于源代码哪儿来的,俺也不太清楚了,至少有一点可以明确,不是我写的,我是个上层建筑师,并不关心,也不愿意花这些时间去研究土质是什么样的,处于什么样的地层带,我关心的是建筑的风格(其实,更多是因为不懂土质学问题吧?!哈哈)。

声明部分:

#import <Foundation/Foundation.h>
#import <CommonCrypto/CommonCryptor.h>

@interface NSData (AES256)
- (NSData *)AES256EncryptWithKey:(NSString *)key;
- (NSData *)AES256DecryptWithKey: (NSString *)key;

@end

实现部分:

#import "NSData+AES256.h"

@implementation NSData (AES256)
- (NSData *)AES256EncryptWithKey:(NSString *)key {
	// 'key' should be 32 bytes for AES256, will be null-padded otherwise
	char keyPtr[kCCKeySizeAES256+1]; // 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 = 0;
	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+1]; // 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 = 0;
	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
时间: 2024-10-03 21:26:27

iOS 中 AES256 的实现 - 更喜欢 C 实现,OC 封装的风格的相关文章

iOS 7 对比 Android 4.3 细节评测 - 相互借鉴进行中,哪款更是你的菜?

class="post_content" itemprop="articleBody"> 一直以来,关于苹果 iOS 和谷歌 Android 谁更好用的争论从来没有间断过,它们不仅代表了世界上两个最先进.最受欢迎的移动平台,同时也是苹果和谷歌两家科技巨头品味.风格的不同表现-- 那么,在 iOS 7 正式推出之际,将其与谷歌最新的 Android 4.3 对比,也是具有一定意义的,下面我们就来看看它们之间详细的差异所在. 1. 锁屏和主屏界面 显然,在锁屏界面

与iOS 6相比用户更喜欢iOS 7的图标

硅谷网讯 iOS7的图标和http://www.aliyun.com/zixun/aggregation/11676.html">iOS6的图标到底哪个版本好看目前仍然存在极大争议,为了得到用户最真实的想法,国外科技资讯网站TechCrunch通过调查工具Polar进行了一次调查,问题就是"iOS7和iOS6,你喜欢哪个版本"? 据TechCrunch报道,调查结果显示,目前一共有4.6万名用户参与了此次调查,其中绝大部分的用户都表示更喜欢iOS7,比例达到2:1. 该

设计者更喜欢什么操作系统

日新月异的网页设计文化现在已经成长为一系列的子标准.网页设计文化发展20年之后的现在,世界各地的设计者都在将自己的好想法用在万维网上.软件通常是根据用户的需要而产生的,但如果你工作在(网页设计)第一线,这个话题就对你很重要了. 在操作系统领域,有三种系统是应用的比较多的:Windows系统.Mac OS X系统以及各种Linux发行版.对于本文,我们将专注于讨论Windows系统和Mac系统的应用.这并不是说Linux系统(尤其是Ubuntu系统)不能用在图形和网页设计中.只是因为和Window

Google Maps for iOS 2.3.4导航更快并增加语言支持

Google已经更新了iOS版本的地图应用,在新版本中除了带来新的功能,还加入了对阿拉伯语和希伯来语的支持.此外,最大的改进还是对导航的访问,现在已经变得更快.而在路径重规划的时候,该应用也有望更快更准确.新增的路线和交通概览也应该有所帮助,特别是当你在驾驶的时候.当然,这些提示仅适用于那些非重度使用者,下面是本次(Google Maps 2.3.4 for iOS)的更新日志: 更快进入导航,具备了完整的路线和交通概览: 侧边菜单加入了提示和技巧: 新增阿拉伯语和希伯来语的支持(包括语音导航)

iOS中nil、Nil、NULL、NSNull详解

  这篇文章主要介绍了iOS中nil.Nil.NULL.NSNull详解的相关资料,需要的朋友可以参考下 ObjC 里面的几个空值符号经常会差点把我搞死,这些基础的东西一点要弄清楚才行,以提高码农的基本素质. nil nil 是 ObjC 对象的字面空值,对应 id 类型的对象,或者使用 @interface 声明的 ObjC 对象. 例如: ? 1 2 3 4 NSString *someString = nil; NSURL *someURL = nil; id someObject = n

IOS中一段文字设置多种字体颜色代码

  这篇文章主要介绍了IOS中一段文字设置多种字体颜色代码,十分的实用,有需要的小伙伴可以参考下. 给定range和需要设置的颜色,就可以给一段文字设置多种不同的字体颜色,使用方法如下: 代码如下: [self fuwenbenLabel:contentLabel FontNumber:[UIFont systemFontOfSize:15] AndRange:NSMakeRange(6, 1) AndColor:RGBACOLOR(34, 150, 253, 1)]; 代码如下: //设置不同

iOS中RunLoop机制浅探

iOS中RunLoop机制浅探 一.浅识RunLoop         RunLoop这个家伙在iOS开发中,我们一直在用,却从未注意过他,甚至都不从见过他的面孔,那个这个神秘的家伙究竟是做什么的?首先,我们先来观察一下我们的程序运行机制.         无论是面向对象的语言或是面向过程的语言,代码的执行终究是面向过程的.线程也一样,一个线程从开始代码执行,到结束代码销毁.就像HELLO WORLD程序,打印出字符串后程序就结束了,那么,我们的app是如何实现如下这样的机制的呢:app从运行开

iOS中 流媒体播放和下载

      每日更新关注:http://weibo.com/hanjunqiang  新浪微博  iOS中关于流媒体的简介:介于下载本地播放与实时流媒体之间的一种播放形式,下载本地播放必须全部将文件下载完成后才能播放,而渐进式下载不必等到全部下载完成后再播放,它可以一边下载一边播放,在完成播放内容之后,整个文件会保存在手机上. 实时流媒体 实时流媒体是一边接收数据包一边播放,本地不保留文件副本,实时流式传输总是实时传送,可以实时实况转播,支持随机访问,用户可以快进或者快退以观看前面或后面的内容.

iOS 中正则表达式使用方法汇总

iOS 中正则表达式使用方法汇总 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 某种语言中的正则工具算是木桶,而这个工具处理的是正则表达式,算是水,那么水很多,无论是淡水还是咸水,或是雨水,至