【安全編】iOSではAES 256を使って対称的に暗号化する

6470 ワード

AES(The Advanced Ecryption Standard)
AESは、電子データを暗号化するための米国標準技術研究所の仕様です.金融、電気通信、政府のデジタル情報を含めた暗号化の方法が期待されます.
AESは、128、192、256ビットの鍵を使用して、128ビット(16バイト)のパケットでデータを暗号化し、解読する反復鍵パケットの暗号である.共通鍵暗号の使用鍵ペアとは異なり、対称鍵暗号は同じ鍵を使ってデータを暗号化し、解読する.パケットパスワードで返された暗号化データのビット数は入力データと同じです.反復暗号化は1つの循環構造を使用して,このサイクルにおいて,データの入力を繰り返す置換と置換を行う.
現在ビジネスアプリで一番多く使われているのはRSAとAESの暗号化方式です.二つの暗号化の所長がいます.幸いにも接触したことがあります.
iOSでの使用
新しいMySecurityクラスをNSObjectに継承します.
hファイル
 
 

import

@interface MySecurity : NSObject

pragma mark -

-(instancetype) initWithKey:(NSString *) key;

pragma mark -

-(NSString *) AES256EncryptWithString:(NSString *) str;

pragma mark -

-(NSString *) AES256DecryptWithString:(NSString *) str;

pragma mark -

+(NSString*) getSecurityKey;

@end

.mファイル
 
 

import "MySecurity.h"

import "NSData+AES256.h"

import "NSString+MD5.h"

@interface MySecurity ()
@property(strong,nonatomic) NSString *key;

@end

@implementation MySecurity

pragma mark -

+(NSString*) getSecurityKey
{
return @" ";
}

pragma mark -

-(instancetype) initWithKey:(NSString *) key
{
self = [super init];
if (self)
{
self.key = key;
}
return self;
}

pragma mark -

-(NSString *) AES256EncryptWithString:(NSString *) str
{
NSData *dt1 = [str dataUsingEncoding:NSUTF8StringEncoding];

NSData *dt2 = [dt1 AES256EncryptWithKey:[self.key MD5]];

 NSString *str2 = [dt2 base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
return str2;
)
pragmamamamark-
-(NSString*)AES 256 DecryptwithString:(NSString*)str{NSData*dt 3=[NSData alloc]init WithBasec 64 EntocdedString:str options:NSData Base 64 DecodingIgnown Charcters]
NSData *dt4 = [dt3 AES256DecryptWithKey:[self.key MD5]];

NSString *str4 = [[NSString alloc] initWithData:dt4 encoding:NSUTF8StringEncoding];
return str4;
)
@end
するNSData+AES 256 とNSString+MD 5
 
 

//---------------NSData (AES256) ------------

import

@interface NSData (AES256)

/*

(NSString*)key 32
NSData
*/

  • (NSData)AES256EncryptWithKey:(NSString)key ;

/*

(NSString*)key 32
NSData
*/

  • (NSData)AES256DecryptWithKey:(NSString)key ;

@end

//---------------NSData (AES256) ------------

import "NSData+AES256.h"

import

@implementation NSData (AES256)

  • (NSData)AES256EncryptWithKey:(NSString)key {

    char keyPtr[kCCKeySizeAES256 +1]; // room for terminator (unused)
    bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding)

    [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,
    kCCKeySizeAES256,
    NULL /* initialization vector (optional) /,
    [self bytes],
    dataLength, /
    input /
    buffer,
    bufferSize, /
    output */
    &numBytesEncrypted);

if (cryptStatus == kCCSuccess) {
    return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
}

free(buffer);
return nil;
)
  • (NSData)AE S 256 DecryptwithKey:(NSString)key Ptr[kCCKeySizeAE S 256+1]//room for terminator bzo(keyPtr,sized)//fill with zroes
    // fetch key data
    [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,
                                          kCCKeySizeAES256,
                                          NULL /* initialization vector (optional) */,
                                          [self bytes],
                                          dataLength, /* input */
                                          buffer,
                                          bufferSize, /* output */
                                          &numBytesDecrypted);
    
    if (cryptStatus == kCCSuccess) {
        return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
    }
    
    free(buffer); //free the buffer;
    return nil;
    
    )
    @end
    //---------NSString(MD 5)ヘッダファイル------
    import
    @interface NSString(MD 5)/* のMD 5 を すると、32ビットMD 5 /-(NSString)MD 5が される.
    @end
    //-------NSString(MD 5) ファイル------
    import「NSString+MD 5.5 h」
    import
    @implemention NSString(MD 5)
    pragmamamark-MD 5
    -(NSString*)MD 5{const char*cStrValue=[self UTF 8 String];unsigned char the Result[CCudiGESTugTH];
    CC_MD5(cStrValue, (CC_LONG)strlen(cStrValue), theResult);
    return [NSString stringWithFormat:@"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
            theResult[0], theResult[1], theResult[2], theResult[3],
            theResult[4], theResult[5], theResult[6], theResult[7],
            theResult[8], theResult[9], theResult[10], theResult[11],
            theResult[12], theResult[13], theResult[14], theResult[15]];
    
    )
    @end

    //
    MySecurity *security = [[MySecurity alloc] initWithKey:[MySecurity getSecurityKey]];
    //
    NSString * str1 = [security AES256EncryptWithString:@" "];

    //
    NSString * str2 = [security AES256DecryptWithString:@" "];

    じて えば、 うのはやはりとても で、みんなを けることができることを みます.
    end