簡體   English   中英

如何在iPhone中使用DES加密NSString值?

[英]How to encrypt the NSString value using DES in iPhone?

我使用以下代碼用Key加密NSString值,

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); 

但我得到(null)就是結果。 有什么問題嗎? 如何加密NSString值?

這是AES的一種方式,可能對於DES會類似,看看這適用於我...在NSData上創建一個新的類別AES
對於NSData + AES.h

#import <Foundation/Foundation.h>
#import <CommonCrypto/CommonCryptor.h>

@interface NSData (AES)

- (NSData*) EncryptAES: (NSString *) key;
- (NSData *) DecryptAES: (NSString *) key;

@end

對於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

用法:導入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

最后我完成了以下代碼,現在它的工作正常。

- (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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM