开发者

Cocoa AES Encryption NSData and Bytearrays

I'm using the following code to encrypt files in cocoa:

- (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 [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
   }

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

And wrote this for the connection to the file:

    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"foo" ofType:@"rtf"];
    NSData *data = [NSData dataWithContentsOfFile:filePath];
    NSString *key = [withFileKey stringValue开发者_开发百科];
    NSString *newStr = [[NSString alloc] initWithData:data     encoding:NSUTF8StringEncoding];

    NSString *encrypted = [newStr AES256EncryptWithKey:key];

    NSLog(@"File encryption:%@", encrypted);

    [filePathName setStringValue:filePath];


    if (!data) {

        NSLog(@"Unable to read file");

}

Basically what I did was first of all get the filepath of the file the user wants. Then convert the data in the file to a string. Then encrypt that string with the AES256EncryptWithKey: method. However, when I decrypt a plain text file for example, it returns a bunch of garbage like fonts and all that stuff, then the few lines I wrote. Something like this:

\ansicpg1252\cocoartf1138\cocoasubrtf100 {\fonttbl\f0\fswiss\fcharset0 Helvetica;\f1\fnil\fcharset0 Menlo-Bold;} {\colortbl;\red255\green255\blue255;} \margl1440\margr1440\vieww10800\viewh8400\viewkind0 \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural

\f0\fs24 \cf0 Hello my name is bobby bob\ \ \pard\tx560\pardeftab560\pardirnatural

\f1\b\fs22 \cf0 \CocoaLigature0 YAY!\ and I am awesome!!}

Shouldn't I be taking the data and then encrypting that (conversion to bytes), then convert the encrypted data and convert it to a string to display? I tried something like that but it didn't work. :(

Something like:

NSData *encryptedData = [data AES256EncryptWithKey:yourkey];

And then:

NSString *convertData = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

? Your help is greatly appreciated. Thanks!


Your code appears hard-coded to load foo.rtf. This looks like an RTF file. Where is the "plain text file" you're talking about?

EDIT We had a lot of discussion on this, so I wrote up a blog post about how to correctly use CCCrypt().

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜