1

Edit2 This problem have been solved.The answer is about my other question.And thanks for Hot Licks.

------- Edit separate------------------------------------------------

Edit1: I am sure my ciphertext and my key is correct. Because my workmate decrypt it with C++ and get no problem.By the way, it is ECB mode.

I work very hard on this problem for a week,but I still can't solve it.I really do not know what to do now.

I am developing a cocoa Application,and My server return a ciphertext that encrypt by AES to me.I must decrypt this ciphertext for some information to go next step.

My ciphertext is:

NSString *aesString = @"8DFE2F9A9384573FA0FFAE17C3BEF4CC2BA056CC5CBBFAB57AC78C83AF4EF8A48EA1728D904E87613845377821E01E07CC6C9DEA35516DC595421E0FFC7CAA7A19671E713BB74D84D1DD4FB2C972DD8FACF5D74AD32662E992EA13D2417ABCAEE4137098322394BA76BADBAF4C1DB344704BBF9ED8A1513FF4B2E766526C98A2808B7AE67D1866CB9B489764E70662B1499D8D467A8817D1304AAB8F92EBDDD3E871CC1374CAE96A1428F0C2AFCB3F43E705CDD7649BDE5A363D59125980D0ACBBE32879B96AB15E93F74C08D435B787A8EE734E2773E16AE8F4CB4A5DDAD989F92CF1C609F0F8B81FEDB67F974AE583548B13C86B6FE1925A33A47CBDA8ED54C20F2D8020650BA7FABBF8CBAC00493B6DE423880EF1A1AF8CDDC457C064CD6150AA30D34456E422EA707C313C7FBB428CE1C4E534EA8EDD8C21B62D526522606E6944C4058E631DAFC6F9A539F9A4DFD8AFECCEF51A8A4904A3EFA0A76F3CA55AB56C726B0787D9EBB261CA91F5ABBF985096B327A6269399AC11A23CAFB0B3A6B3FB4AA357FC1644C89B7DEE396C51AF734738E598B765B2384EB8931F4B65D9F4B6C73EE3F1F6C5AA17871D14335153E4058AB9BC0FCAD35DBDB924D00B0A71B985E20CDF530FA5479E2DD8F14D269CE59DA365BAC03FCCB037963E7E3F175A09DD7EFC66E450DF5A16E7233EA55009E4891EF238D003D5837F077C12167428AD19D3DA45D569AA252D5FFD736E134AD3B5654FD82506822BE9B78731C9CA5EE56685153E657E8B385013FF14BBE5A1F5938801E94FE498495C2D94C84A937E1C36A4667A16DFECED471C3902B4B3D1DAA9F2C72A09AF736EF51EBE39F0006667D60DDC9EC20C5C29CC8933E5FB9E293560DB6B152DF4864BD9CF02B0D40D5B24D0326F1D7E251A0CBC692B68FA37212A57F34588D18D6F4F7E59D997A8C4B5E452FE883645B90BD7EE3A4B38754616CA7A9D430620036DBEAD2EC03BEBB5C69E92F9A33951C22E83E68DD85350C7";

and my key is:

NSString *key = @"810B16E3541EF7A4";

I use nicerobot'answer to decrypt my ciphertext and try many other ways. I hope somebody can tell me what to do next.

Community
  • 1
  • 1
Crazy Catcher
  • 110
  • 10
  • Show us what you tried (the most successful attempt you did) – AsTeR Aug 07 '12 at 13:59
  • 1
    At least by my understanding, the ciphertext output by most AES algorithms is pure binary, not at all textual, and what you're doing is attempting to decrypt a string, instead of the actual binary output – Dan F Aug 07 '12 at 14:03
  • i think your aesString isnt correct encrypted. you should check the decryption with: http://www.cryptool-online.org/index.php?Itemid=135 . Maybe the aesString is base64 encoded? – CarlJ Aug 07 '12 at 14:08
  • Hint: If you're "cutting your teeth" on encryption, first get an end-to-end encrypt/decrypt working within a single program, before you try to decrypt something from a different source. – Hot Licks Aug 07 '12 at 15:20

3 Answers3

0

Convert your encrypted string text to an NSData object using the following code.

NSData* stringData = [encryptedStringText dataUsingEncoding:NSUTF8StringEncoding];

Create the category shown below for NSData and then use it to AES decrypt the NSData content.

NSData* unencryptedData = [stringData AES256DecryptWithKey:keyText];

Convert your NSData object to an NSString.

NSString* unencryptedStringText = [NSString stringWithUTF8String:[unencryptedData bytes]];

#pragma mark -
#pragma mark NSData Encryption Category

// ---------------------------------------------------------
// NSData Category to add Encryption
// ---------------------------------------------------------

@interface NSData (NSDataAESEncryption)
- (NSData *)AES256EncryptWithKey:(NSString *)key;
- (NSData *)AES256DecryptWithKey:(NSString *)key;
@end



@implementation NSData (NSDataAESEncryption)

- (NSData *)AES256EncryptWithKey:(NSString *)key {

    char keyPtr[kCCKeySizeAES256+1]; 

    bzero(keyPtr, sizeof(keyPtr)); 

    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

    NSInteger dataLength = [self length];

    size_t bufferSize = dataLength + kCCBlockSizeAES128;
    void *buffer = malloc(bufferSize);

    size_t numBytesEncrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
                                          keyPtr, kCCKeySizeAES256,
                                          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];

    NSInteger dataLength = [self length];

    size_t bufferSize = dataLength + kCCBlockSizeAES128;
    void *buffer = malloc(bufferSize);

    size_t numBytesDecrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
                                          keyPtr, kCCKeySizeAES256,
                                          NULL ,
                                          [self bytes], dataLength, 
                                          buffer, bufferSize, 
                                          &numBytesDecrypted);

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

    free(buffer);

    return nil;
}


@end
Jim Range
  • 523
  • 2
  • 9
0

AES accepts an initialization vector. What are you using for that?

If the data is in Hex or Base64, I don't see enough bits in your key for AES-128 (the shortest kind). If the key is the Ascii text of the hex string, that would be 128 bits but that seems a bit hokey. Such things happen but it would not be my first choice.

AES encrypts in multiple, not completely compatible modes, CBC and ECB are two I have worked with.

Anyway, I monkeyed around with this for fifteen minutes and I can’t get anything out of that but trash. I have to agree with HotLicks who suggested that you start with an encrypt/decrypt that runs within the same program.

Good luck, /Bob Bryan

Bob Bryan
  • 417
  • 4
  • 2
-1

Try this

+ (NSData *)doCipher:(NSData *)dataIn
              iv:(NSData *)iv
             key:(NSData *)symmetricKey
         context:(CCOperation)encryptOrDecrypt // kCCEncrypt or kCCDecrypt
           error:(NSError **)error
{
    CCCryptorStatus ccStatus   = kCCSuccess;
    size_t          cryptBytes = 0;
    NSMutableData  *dataOut    = [NSMutableData dataWithLength:dataIn.length + kCCBlockSizeAES128];

    ccStatus = CCCrypt( encryptOrDecrypt,
                   kCCAlgorithmAES128,
                   0, //kCCOptionPKCS7Padding,
                   symmetricKey.bytes,
                   kCCKeySizeAES128,
                   iv.bytes,
                   dataIn.bytes,
                   dataIn.length,
                   dataOut.mutableBytes,
                   dataOut.length,
                   &cryptBytes);

    if (ccStatus == kCCSuccess) {
        dataOut.length = cryptBytes;
    }
    else {
        if (error) {
            *error = [NSError errorWithDomain:@"kEncryptionError"
                                     code:ccStatus
                                 userInfo:nil];
        }
        dataOut = nil;
    }

return dataOut;
}
Ghulam Rasool
  • 3,996
  • 2
  • 27
  • 40
  • This is a character for character copy of [this SO answer](http://stackoverflow.com/a/24459924/451475) except for a `0` for the padding with **no attribution**. – zaph Jan 12 '16 at 13:56