`
z251257144
  • 浏览: 91461 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

[iOS]AES加密在iOS上面的实现

    博客分类:
  • iOS
阅读更多

Encryption.h文件

 

//  
//  Encryption.h  
//  DownloadFile  
//  
//  Created by zhoumin on 12-1-16.  
//  Copyright (c) 2012年 __MyCompanyName__. All rights reserved.  
//  
  
#import <Foundation/Foundation.h>  
  
@class NSString;  
  
@interface NSData (Encryption)  
  
- (NSData *)AES256EncryptWithKey:(NSString *)key;   //加密  
- (NSData *)AES256DecryptWithKey:(NSString *)key;   //解密  
- (NSString *)newStringInBase64FromData;            //追加64编码  
+ (NSString*)base64encode:(NSString*)str;           //同上64编码  
  
@end  
 

 

Encryption.m文件

 

//  
//  Encryption.m  
//  DownloadFile  
//  
//  Created by  on 12-1-16.  
//  Copyright (c) 2012年 __MyCompanyName__. All rights reserved.  
//  
  
#import "Encryption.h"  
#import <CommonCrypto/CommonCryptor.h>  
  
  
static char base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";  
  
@implementation NSData (Encryption)  
  
- (NSData *)AES256EncryptWithKey:(NSString *)key   //加密  
{  
    char keyPtr[kCCKeySizeAES256+1];  
    bzero(keyPtr, sizeof(keyPtr));  
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];  
    NSUInteger dataLength = [self length];  
    size_t bufferSize = dataLength + kCCBlockSizeAES128;  
    void *buffer = malloc(bufferSize);  
    size_t numBytesEncrypted = 0;  
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128,  
                                          kCCOptionPKCS7Padding | kCCOptionECBMode,  
                                          keyPtr, kCCBlockSizeAES128,  
                                          NULL,  
                                          [self bytes], dataLength,  
                                          buffer, bufferSize,  
                                          &numBytesEncrypted);  
    if (cryptStatus == kCCSuccess) {  
        return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];  
    }  
    free(buffer);  
    return nil;  
}  
  
  
- (NSData *)AES256DecryptWithKey:(NSString *)key   //解密  
{  
    char keyPtr[kCCKeySizeAES256+1];  
    bzero(keyPtr, sizeof(keyPtr));  
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];  
    NSUInteger dataLength = [self length];  
    size_t bufferSize = dataLength + kCCBlockSizeAES128;  
    void *buffer = malloc(bufferSize);  
    size_t numBytesDecrypted = 0;  
    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128,  
                                          kCCOptionPKCS7Padding | kCCOptionECBMode,  
                                          keyPtr, kCCBlockSizeAES128,  
                                          NULL,  
                                          [self bytes], dataLength,  
                                          buffer, bufferSize,  
                                          &numBytesDecrypted);  
    if (cryptStatus == kCCSuccess) {  
        return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];  
    }  
    free(buffer);  
    return nil;  
}  
  
  
- (NSString *)newStringInBase64FromData            //追加64编码  
{  
    NSMutableString *dest = [[NSMutableString alloc] initWithString:@""];  
    unsigned char * working = (unsigned char *)[self bytes];  
    int srcLen = [self length];  
    for (int i=0; i<srcLen; i += 3) {  
        for (int nib=0; nib<4; nib++) {  
            int byt = (nib == 0)?0:nib-1;  
            int ix = (nib+1)*2;  
            if (i+byt >= srcLen) break;  
            unsigned char curr = ((working[i+byt] << (8-ix)) & 0x3F);  
            if (i+nib < srcLen) curr |= ((working[i+nib] >> ix) & 0x3F);  
            [dest appendFormat:@"%c", base64[curr]];  
        }  
    }  
    return dest;  
}  
  
+ (NSString*)base64encode:(NSString*)str  
{  
    if ([str length] == 0)  
        return @"";  
    const char *source = [str UTF8String];  
    int strlength  = strlen(source);  
    char *characters = malloc(((strlength + 2) / 3) * 4);  
    if (characters == NULL)  
        return nil;  
    NSUInteger length = 0;  
    NSUInteger i = 0;  
    while (i < strlength) {  
        char buffer[3] = {0,0,0};  
        short bufferLength = 0;  
        while (bufferLength < 3 && i < strlength)  
            buffer[bufferLength++] = source[i++];  
        characters[length++] = base64[(buffer[0] & 0xFC) >> 2];  
        characters[length++] = base64[((buffer[0] & 0x03) << 4) | ((buffer[1] & 0xF0) >> 4)];  
        if (bufferLength > 1)  
            characters[length++] = base64[((buffer[1] & 0x0F) << 2) | ((buffer[2] & 0xC0) >> 6)];  
        else characters[length++] = '=';  
        if (bufferLength > 2)  
            characters[length++] = base64[buffer[2] & 0x3F];  
        else characters[length++] = '=';  
    }  
    NSString *g = [[[NSString alloc] initWithBytesNoCopy:characters length:length encoding:NSASCIIStringEncoding freeWhenDone:YES] autorelease];  
    return g;  
}  
  
  
@end

 

 

测试

 

NSString *key = @"my password";  
NSString *secret = @"text to encrypt";  
//加密  
NSData *plain = [secret dataUsingEncoding:NSUTF8StringEncoding];  
NSData *cipher = [plain AES256EncryptWithKey:key];  
NSLog(@"%@",[[cipher newStringInBase64FromData] autorelease]);  
printf("%s\n", [[cipher description] UTF8String]);  
NSLog(@"%@", [[[NSString alloc] initWithData:cipher encoding:NSUTF8StringEncoding] autorelease]);//打印出null,这是因为没有解密。  
//解密  
plain = [cipher AES256DecryptWithKey:key];  
printf("%s\n", [[plain description] UTF8String]);  
NSLog(@"%@", [[[NSString alloc] initWithData:plain encoding:NSUTF8StringEncoding] autorelease]);  
//打印出secret的内容,用密码解密过了。如果使用错误的密码,则打印null  

 

 

demo下载:http://download.csdn.net/detail/z251257144/4820200

0
0
分享到:
评论

相关推荐

    iOS AES加密解密

    在iOS中,苹果提供了一个名为CommonCrypto的框架,它包含了AES加密的实现。在Objective-C项目中,我们需要添加`#import &lt;CommonCrypto/CommonCrypto.h&gt;`来使用这些功能。 接着,我们定义加密和解密的函数。加密通常...

    AES加密解密算法 iOS和Android完美实现

    在iOS和Android平台上实现AES加密解密是开发者经常遇到的任务,尤其对于需要跨平台传输和存储敏感信息的场景。本篇文章将详细探讨AES加密解密算法在iOS和Android平台上的实现原理以及具体步骤。 首先,AES算法基于...

    iOS实现AES加密

    在项目"AesTest"中,你可以找到一个简单的AES加密测试示例,它演示了如何在iOS应用中实现AES加密和解密的功能。通过这个例子,你可以更好地理解如何将AES加密应用到实际的iOS项目中,从而保护用户的隐私数据,确保...

    ios AES加密解密

    本篇将详细介绍如何在iOS应用中实现AES加密解密。 一、AES加密原理 AES加密基于替换和置换操作,通过128位的块进行加密,密钥长度可以是128、192或256位。在加密过程中,原始数据会被分成128位的块,然后通过一系列...

    iOS AES加密 PHP解密

    在iOS中,我们可以使用CommonCrypto库来实现AES加密。这个库提供了C语言接口,可以方便地集成到Objective-C或Swift项目中。以下是一个简单的AES加密示例: ```objc #import - (NSData *)AES256EncryptWithKey:...

    android ios 通用 AES加密

    本篇文章将深入探讨AES加密在Java、Android、iOS以及C#中的应用,以及如何实现这些平台之间的通用加密方式。 AES,即高级加密标准,是一种块密码,采用128位的块大小进行操作,并支持128、192和256位的密钥长度。其...

    iOS AES128加密解密

    本教程将详细介绍如何在iOS平台上实现AES128的加密与解密。 ### 一、AES128加密原理 AES128使用128位(16字节)的密钥对数据进行加密,其工作模式包括ECB(Electronic Codebook)、CBC(Cipher Block Chaining)、...

    iOS与Android通用AES加密

    在实现AES加密时,需要注意以下几点: 1. 密钥管理:密钥应该安全存储,避免明文暴露。在Android上,可以考虑使用Keystore System;在iOS上,可以使用Keychain。 2. IV(初始化向量):在CBC等模式下,每次加密都...

    java、Android、javaScript、ios 通用 AES加密、解密 已实际使用

    java、Android、javaScript(可以改成vue)、ios AES加密通用,可在服务端加密,客户端解密,也可在客户端加密,服务端解密;由于csdn会自动把积分改到50,可以发邮件到1622007541@qq.com 免费送

    iOS AES加密代码

    本主题将深入探讨如何在iOS环境下使用AES加密技术,以及如何在实际应用中实现数据存储和传输的加密。 AES加密的基本原理是通过一系列的替换、混淆和扩展操作,将明文数据转化为密文,以防止未经授权的访问。它支持...

    简单AES加密demo

    - **iOS**:在iOS中,可以使用CommonCrypto库来实现AES加密,这个库包含在Security框架中。 - **.NET**:.NET Framework和.NET Core都提供了System.Security.Cryptography命名空间,用于加密操作,包括AES。 压缩包...

    AES ecb 加密 ios

    本篇文章将深入探讨AES ECB加密在iOS开发中的应用、原理以及如何实现。 AES是一种分组密码,将明文数据分为固定大小的块进行加密。标准的AES有128、192和256位的密钥长度,其中128位是最常用的选择。在ECB模式下,...

    AESEncryption,如何在android和ios中实现aes加密的演示.zip

    在这个开源项目中,我们将探讨如何在Android和iOS平台上实现AES加密。以下是对这个项目的详细讲解。 1. **AES加密原理**: AES是基于块密码,每个加密块大小为128位。它使用128、192或256位的密钥来加密128位的...

    ios-AES 加密.zip

    在这个项目中,开发者wyxlh提供了Objective-C实现的AES加密和解密功能,便于iOS开发者集成到自己的应用程序中。 AES加密是一种块密码,它基于替换和置换操作,使用相同的密钥进行加密和解密。AES有三个主要参数:...

    AES加密 – Java与android、iOS、js的同步实现

    文件"js aes.txt"可能是JavaScript实现AES加密的示例代码,而"AES加密 – iOS与Java的同步实现"可能是介绍如何在iOS和Java之间实现同步加密的教程或代码示例。通过学习这些内容,开发者可以掌握如何在不同平台上实现...

    IOS - AES:ECB:PKCS7Padding加密、解

    在iOS中,我们可以通过扩展`NSData`类来实现AES的加密和解密操作。文件`NSData+AES256.h`和`NSData+AES256.m`很可能包含了这样的扩展方法。通常,这些方法会包含以下步骤: 1. **密钥准备**:首先需要一个AES密钥,...

    AES_iOS 加密源代码 iOS版本

    本篇将深入探讨AES加密在iOS开发中的应用,以及如何在实际项目中实现AES加密源代码。 首先,AES是一种块密码,它对数据进行128位的块处理。它支持三种不同的密钥长度:128位、192位和256位,其中128位是最常用的...

    IOS AES加密(修改后含有.net代码)

    在本案例中,我们讨论的是一个针对iOS平台的AES加密实现,特别是针对.NET代码的修改。 原始代码可能在进行BASE64编码时遇到了问题,因为BASE64编码中包含的'='和'/'字符在URL中可能会引起解析问题。在URL中,某些...

Global site tag (gtag.js) - Google Analytics