How to encrypt the NSString value using DES in iPhone?

匿名 (未验证) 提交于 2019-12-03 02:56:01

问题:

I used following code to encrypt the NSString value with Key,

NSString *token = @"encryptValue"; NSString *key = @"encryptKey";  NSData * keyData = [key dataUsingEncoding: NSUTF8StringEncoding]; NSData * plainData = [token dataUsingEncoding: NSUTF8StringEncoding]; NSMutableData * encData = [NSMutableData dataWithLength: plainData.length + 256]; size_t bytesWritten = 0; CCCryptorStatus ccStatus = CCCrypt (kCCEncrypt,                     kCCAlgorithmDES,                     kCCOptionPKCS7Padding,                     [keyData bytes],                      kCCKeySizeDES,                     NULL,                     [plainData bytes],                     [plainData length],                     encData.mutableBytes,                     encData.length,                     &bytesWritten); encData.length = bytesWritten;     NSString *encrypted = [[NSString alloc]  initWithBytes:[encData bytes] length:[encData length] encoding: NSUTF8StringEncoding];   NSLog(@"ENCRYPT : %@",encrypted);  

But I'm getting (null) is the result. Is anything wrong? How to encrypt the NSString value?

回答1:

Here is a way for AES, probably for DES would be similar, take a look this works with me... Make a new category AES on NSData
For NSData+AES.h

#import <Foundation/Foundation.h> #import <CommonCrypto/CommonCryptor.h>  @interface NSData (AES)  - (NSData*) EncryptAES: (NSString *) key; - (NSData *) DecryptAES: (NSString *) key;  @end 

For NSData+AES.m

    #import "NSData+AES.h"     @implementation NSData(AES)      - (NSData*) EncryptAES: (NSString *) key     {         char keyPtr[kCCKeySizeAES256+1];         bzero( keyPtr, sizeof(keyPtr) );          [key getCString: keyPtr maxLength: sizeof(keyPtr) encoding: NSUTF16StringEncoding];         size_t numBytesEncrypted = 0;          NSUInteger dataLength = [self length];          size_t bufferSize = dataLength + kCCBlockSizeAES128;         void *buffer = malloc(bufferSize);          CCCryptorStatus result = CCCrypt( kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,                                          keyPtr, kCCKeySizeAES256,                                          NULL,                                          [self bytes], [self length],                                          buffer, bufferSize,                                          &numBytesEncrypted );          if( result == kCCSuccess )             return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];          return nil;     }      - (NSData *) DecryptAES: (NSString *) key     {         char  keyPtr[kCCKeySizeAES256+1];         bzero( keyPtr, sizeof(keyPtr) );          [key getCString: keyPtr maxLength: sizeof(keyPtr) encoding: NSUTF16StringEncoding];          size_t numBytesEncrypted = 0;          NSUInteger dataLength = [self length];          size_t bufferSize = dataLength + kCCBlockSizeAES128;         void *buffer_decrypt = malloc(bufferSize);              CCCryptorStatus result = CCCrypt( kCCDecrypt , kCCAlgorithmAES128, kCCOptionPKCS7Padding,                                          keyPtr, kCCKeySizeAES256,                                          NULL,                                          [self bytes], [self length],                                          buffer_decrypt, bufferSize,                                          &numBytesEncrypted );          if( result == kCCSuccess )         return [NSData dataWithBytesNoCopy:buffer_decrypt length:numBytesEncrypted];          return nil;     }      @end 

Usage: Import NSData+AES.h

//Encryption NSString *myString = @"This is the content"; NSString *key = @"my secret key"; NSData *data = [myString dataUsingEncoding:NSUTF8StringEncoding]; NSData *encryptedData = [data EncryptAES:key];  //Decryption NSString *decryptedString = [[[NSString alloc] initWithData:[encryptedData DecryptAES:key] encoding:NSUTF8StringEncoding] autorelease]; // remove autorelease if using ARC 


回答2:

Finally I done with following code and now its working fine.

- (NSString*) doCipher:(NSString*)encryptValue {      const void *vplainText;     size_t plainTextBufferSize = [encryptValue length];     vplainText = (const void *) [encryptValue UTF8String];         CCCryptorStatus ccStatus;     uint8_t *bufferPtr = NULL;     size_t bufferPtrSize = 0;     size_t movedBytes = 0;      bufferPtrSize = (plainTextBufferSize + kCCBlockSizeDES) & ~(kCCBlockSizeDES - 1);     bufferPtr = malloc( bufferPtrSize * sizeof(uint8_t));     memset((void *)bufferPtr, 0x0, bufferPtrSize);      Byte iv [] = {0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef};      NSString *key = @"encryptKey";     const void *vkey = (const void *) [key UTF8String];      ccStatus = CCCrypt(kCCEncrypt,                        kCCAlgorithmDES,                        kCCOptionPKCS7Padding,                        vkey,                         kCCKeySizeDES,                        iv,                        vplainText,                        plainTextBufferSize,                        (void *)bufferPtr,                        bufferPtrSize,                        &movedBytes);      NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes];     NSString *result = [myData base64Encoding];      return result; } 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!