2012-07-21 122 views
2

首先,我要感谢大家在阅读本网站时获得的帮助。非常感谢你。AES在Objective-C中进行加密并在ColdFusion中进行解密

我面临的问题是我必须使用objective-c(Iphone)对字符串进行加密,并在Web服务器中使用ColdFusion将其解密。我想使用的算法是AES-128。

目前,我设法加密/解密在这两个网站,但分开。我在objective-c中加密的所有内容都可以在objective-c中解密,但不能在ColdFusion中解密。基本上,加密的结果是不一样的。

我有代码尽可能简单和干净,因为我可以在这里发布它。

我的目标c输出是这样的一种:

加密的数据:BHmXSHXWOH6McXsttNTgpL5EQmfPCebjVShkZOeHBC8 =

我的ColdFusion输出是这样的一种:

加密的数据:G + tdEOfQTtVCQGxW3N5uzlu0mGabRKNxuIdAXArQE8​​0 =

正如你可以看到他们不同:( 我认为这个问题可能在Objective-C代码中,因为ColdFusion很简单。但是,我现在有点失落了,诚实地说。任何帮助将非常感激。


这里是我使用的代码的副本:

Objective-C代码:

// Starting point of the application. 
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; 
    NSString *strData = @"This is a plain string."; 
    NSString *strKey = @"12345678123456781234567812345678"; 
    NSString *strIv = @"1234567812345678"; 

    NSData *data = [NSData dataWithData:[strData dataUsingEncoding:NSUTF8StringEncoding]]; 
    NSData *iv = [NSData dataWithData:[strIv dataUsingEncoding:NSUTF8StringEncoding]]; 
    NSData *key = [NSData dataWithData:[strKey dataUsingEncoding:NSUTF8StringEncoding]]; 

    NSData *encryptedData = [self doCipher:data iv:iv key:key context:kCCEncrypt]; 
    NSLog(@"Encrypted data: %@",[self base64forData:encryptedData]); 
} 

// Method to encrypt/decrypt data 
- (NSData *)doCipher:(NSData *)dataIn 
        iv:(NSData *)iv 
       key:(NSData *)symmetricKey 
      context:(CCOperation)encryptOrDecrypt 
{ 
    CCCryptorStatus ccStatus = kCCSuccess; 
    size_t   cryptBytes = 0; // Number of bytes moved to buffer. 
    NSMutableData *dataOut = [NSMutableData dataWithLength:dataIn.length + kCCBlockSizeAES128]; 

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

    if (ccStatus != kCCSuccess) { 
     NSLog(@"CCCrypt status: %d", ccStatus); 
    } 

    dataOut.length = cryptBytes; 

    return dataOut; 
} 

// Method to base64 encode data 
- (NSString*)base64forData:(NSData*)theData { 

    const uint8_t* input = (const uint8_t*)[theData bytes]; 
    NSInteger length = [theData length]; 

    static char table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/="; 

    NSMutableData* data = [NSMutableData dataWithLength:((length + 2)/3) * 4]; 
    uint8_t* output = (uint8_t*)data.mutableBytes; 

    NSInteger i; 
    for (i=0; i < length; i += 3) { 
     NSInteger value = 0; 
     NSInteger j; 
     for (j = i; j < (i + 3); j++) { 
      value <<= 8; 

      if (j < length) { 
       value |= (0xFF & input[j]); 
      } 
     } 

     NSInteger theIndex = (i/3) * 4; 
     output[theIndex + 0] =     table[(value >> 18) & 0x3F]; 
     output[theIndex + 1] =     table[(value >> 12) & 0x3F]; 
     output[theIndex + 2] = (i + 1) < length ? table[(value >> 6) & 0x3F] : '='; 
     output[theIndex + 3] = (i + 2) < length ? table[(value >> 0) & 0x3F] : '='; 
    } 

    return [[[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding] autorelease]; 
} 

ColdFusion代码。我是从here

<cfcontent type="text/html; charset=utf-8"> 
<cfset thePlainData = "This is a plain string." /> 
<cfset theKey = toBase64("12345678123456781234567812345678") /> 
<cfset theAlgorithm = "AES/CBC/PKCS5Padding" /> 
<cfset theEncoding = "base64" /> 
<cfset theIV = "1234567812345678" /> 

<cfset encryptedString = encrypt(thePlainData, theKey, theAlgorithm, theEncoding, theIV) /> 

<cfoutput>Encrypted data: #encryptedString#</cfoutput> 

回答

6

如果这是你实际使用的关键,它看起来是错误的大小。这是AES 256,128没有这个密钥产生的CF相同的结果:

<cfset theKey = toBase64("1234567812345678")> 

结果:

BHmXSHXWOH6McXsttNTgpL5EQmfPCebjVShkZOeHBC8= 
+0

的关键尺寸肯定问题的原因。非常感谢Leigh。 – Desdoyer 2012-07-22 09:58:28

相关问题