现在的位置: 首页 > 综合 > 正文

iphone加密算法AES

2013年10月08日 ⁄ 综合 ⁄ 共 3267字 ⁄ 字号 评论关闭
NSData+AESTest
.h 代码:
@interface NSData (AESTest)
- (NSData*)AES256EncryptWithKey:(NSString*)key;
- (NSData*)AES256DecryptWithKey:(NSString*)key;
@end


NSData+AESTest
.m 代码:
#import <CommonCrypto/CommonCryptor.h

#import "NSData+ AESTest .h"

 

@implementation NSData (AESAdditions)
- (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 [NSMutableData 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 [NSMutableData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
}

free(buffer); //free the buffer;
return nil;
}
@end



测试代码

#import 
"NSData+ AESTest
.h"


int
 main 
(
int
 argc
,
 
const
 
char
 
*
 argv
[])
 
{

       
NSAutoreleasePool * pool = [[ NSAutoreleasePool alloc ] init ];

       
NSString * key = @ "my password" ;
       
NSString * secret = @ "text to encrypt" ;

       
NSData * plain = [ secret dataUsingEncoding : NSUTF8StringEncoding ];
       
NSData * cipher = [ plain AES256EncryptWithKey : key ];
        printf
( "%s/n" , [[ cipher description ] UTF8String ]);

        plain
= [ cipher AES256DecryptWithKey : key ];
        printf
( "%s/n" , [[ plain description ] UTF8String ]);
        printf
( "%s/n" , [[[ NSString alloc ] initWithData : plain encoding : NSUTF8StringEncoding ] UTF8String ]);

       
[ pool drain ];
       
return 0 ;
}

-
 
(
NSData
*)
 encryptString
 :( 
NSString
*)
plaintext withKey
 :( 
NSString
*)
key 
{

       
return [[ plaintext dataUsingEncoding : NSUTF8StringEncoding ] AES256EncryptWithKey : key ];
}

- ( NSString *) decryptData :( NSData *) ciphertext withKey :( NSString *) key {
       
return [[[ NSString alloc ] initWithData :[ ciphertext AES256DecryptWithKey : key ]
                                      encoding
: NSUTF8StringEncoding ] autorelease ];
}



抱歉!评论已关闭.