关于AES加密(下)
来源:互联网 发布:n卡线程优化 编辑:程序博客网 时间:2024/06/05 20:27
上期提供了Java中AES加密,因为在使用时,一般Java作为服务器或者终端,可能涉及到ios作为终端,至少我遇到的场景是这样的,所以贴上IOS端的AES加密。首先我下面的代码是基于NSData的Category;上代码吧:
NSData+AES256.h
#import <Foundation/Foundation.h>#import <CommonCrypto/CommonCryptor.h>#import <CommonCrypto/CommonKeyDerivation.h>@interface NSData (AES256)+ (NSData *)AES256EncryptWithPlainText:(NSString *)plain; /*加密方法,参数需要加密的内容*/+ (NSData *)AES256DecryptWithCiphertext:(NSString *)ciphertexts; /*解密方法,参数数密文*/@end
NSData+AES256.m
#import "NSData+AES256.h"#define PASSWORD @"Per vallum duces Labant"static const char encodingTable[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";const NSUInteger kAlgorithmKeySize = kCCKeySizeAES256;const NSUInteger kPBKDFRounds = 10000; // ~80ms on an iPhone 4//static Byte saltBuff[] = {0,1,2,3,4,5,6,7,8,9,0xA,0xB,0xC,0xD,0xE,0xF};static NSString *key = @"H@}+T@b}hS/5798DGILXURXp'o$cC%!XpOibP N6Gg@1um*kAS; [7y&BcSSo+m*";static Byte ivBuff[] = {0xA,1,0xB,5,4,0xF,7,9,0x17,3,1,6,8,0xC,0xD,91};@implementation NSData (AES256)+ (NSData *)AESKeyForPassword:(NSString *)password{ //Derive a key from a text password/passphrase NSMutableData *derivedKey = [NSMutableData dataWithLength:kAlgorithmKeySize]; //NSData *salt = [NSData dataWithBytes:saltBuff length:kCCKeySizeAES128]; NSData *salt = [key dataUsingEncoding:NSUTF8StringEncoding]; int result = CCKeyDerivationPBKDF(kCCPBKDF2, // algorithm算法 password.UTF8String, // password密码 password.length, // passwordLength密码的长度 salt.bytes, // salt内容 salt.length, // saltLen长度 kCCPRFHmacAlgSHA1, // PRF kPBKDFRounds, // rounds循环次数 derivedKey.mutableBytes, // derivedKey derivedKey.length); // derivedKeyLen derive:出自 NSAssert(result == kCCSuccess, @"Unable to create AES key for spassword: %d", result); return derivedKey;}/*加密方法*/+ (NSData*)AES256EncryptWithPlainText:(NSString *)plain { NSData *plainText = [plain dataUsingEncoding:NSUTF8StringEncoding];// 'key' should be 32 bytes for AES256, will be null-padded otherwisechar keyPtr[kCCKeySizeAES256+1]; // room for terminator (unused)bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding) NSUInteger dataLength = [plainText length];size_t bufferSize = dataLength + kCCBlockSizeAES128;void *buffer = malloc(bufferSize); bzero(buffer, sizeof(buffer));size_t numBytesEncrypted = 0; CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128,kCCOptionPKCS7Padding, [[NSData AESKeyForPassword:PASSWORD] bytes], kCCKeySizeAES256, ivBuff /* initialization vector (optional) */, [plainText bytes], dataLength, /* input */ buffer, bufferSize, /* output */ &numBytesEncrypted);if (cryptStatus == kCCSuccess) { NSData *encryptData = [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted]; NSLog(@"%@", [encryptData base64Encoding]);return encryptData;}free(buffer); //free the buffer;return nil;}/*解密方法*/+ (NSData *)AES256DecryptWithCiphertext:(NSString *)ciphertexts{ NSData *cipherData = [NSData dataWithBase64EncodedString:ciphertexts];// 'key' should be 32 bytes for AES256, will be null-padded otherwisechar keyPtr[kCCKeySizeAES256+1]; // room for terminator (unused)bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding) NSUInteger dataLength = [cipherData length];size_t bufferSize = dataLength + kCCBlockSizeAES128;void *buffer = malloc(bufferSize); size_t numBytesDecrypted = 0;CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding, [[NSData AESKeyForPassword:PASSWORD] bytes], kCCKeySizeAES256, ivBuff ,/* initialization vector (optional) */ [cipherData bytes], dataLength, /* input */ buffer, bufferSize, /* output */ &numBytesDecrypted);if (cryptStatus == kCCSuccess) { NSData *encryptData = [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];return encryptData;}free(buffer); //free the buffer;return nil;}+ (id)dataWithBase64EncodedString:(NSString *)string;{ if (string == nil) [NSException raise:NSInvalidArgumentException format:nil]; 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];}- (NSString *)base64Encoding;{ if ([self length] == 0) return @""; char *characters = malloc((([self length] + 2) / 3) * 4); if (characters == NULL) return nil; NSUInteger length = 0; NSUInteger i = 0; while (i < [self length]) { char buffer[3] = {0,0,0}; short bufferLength = 0; while (bufferLength < 3 && i < [self length]) buffer[bufferLength++] = ((char *)[self 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] autorelease];}@end
- 关于AES加密(下)
- 关于AES加密(上)
- 关于python AES加密
- 关于AES在Linux下加密解密出错问题解决方案
- 关于 PHP Android iOS 通用aes加密
- JAVA实现AES加密[高级加密标准(AdvancedEncryptionStandard,AES)]
- mysql AES 加密(笔记)
- 加密解密(DES,AES)
- C#下Base64、MD5、AES加密
- android数据加密(二)AES加密
- iOS-关于MD5加密,AES加密,RSA加签验签
- 关于CryptoJS中md5加密以及aes加密的随笔
- AES加密
- AES加密
- AES加密
- AES加密
- AES 加密
- AES加密
- WinForms 控件
- 南阳OJ-214-最长子序列-二分查找给力啊哈哈
- [POJ 2104]K-th Number (不带修改的区间k大,函数式线段树)
- 一个web项目web.xml的配置中<context-param>配置作用
- 题目1190:大整数排序
- 关于AES加密(下)
- 第一个XAML程序
- Openstack Swift Quotas初探(Grizzly)
- web.xml 中的listener、 filter、servlet 加载顺序及其详解
- 为什么是UBUNTU的PEAR OS?
- NYOJ-269-VF(DP不好理解)
- Ubuntu下J2EE开发环境的搭建(JDK+Eclipse+Tomcat)
- Codeforces ABBYY Cup 3.0 / 316A1 316A2 Special Task(模拟&贪心&组合数学)
- <context annotation-config />标签意义