2016-09-12 9 views
0

鍵とivでAES128暗号化を行い、その後16進文字列に変換しようとしています。私の問題は、文字列をaes128に暗号化して16進数に変換すると、私はPHPでこれと同じことを試してみます。私は別の16進文字列を取得しています。私はphp 16進文字列を解読しようとすると、その解読に成功しました。しかし、PHPで私の16進文字列を解読しようとすると、それは私に特殊文字を与えます。AES 128暗号化で特殊な文字が得られる

NSString *str = @"hello"; 
NSString *key = @"1234abcd5678abcd1234abcd5678abcd"; 
NSString *IV = @"1234567812345678"; 

NSData* data = [str dataUsingEncoding:NSUTF8StringEncoding]; 
NSData* responseData = [data AES128EncryptedDataWithKey:key iv:IV]; 
NSLog(@"%@",[self hexRepresentationWithSpaces_AS:NO withdata:responseData]); 


- (NSData *)AES128Operation:(CCOperation)operation key:(NSString *)key iv:(NSString *)iv 
{ 
    char keyPtr[kCCKeySizeAES128 + 1]; 
    bzero(keyPtr, sizeof(keyPtr)); 
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; 

    char ivPtr[kCCBlockSizeAES128 + 1]; 
    bzero(ivPtr, sizeof(ivPtr)); 
    if (iv) { 
     [iv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding]; 
    } 

    NSUInteger dataLength = [self length]; 
    size_t bufferSize = dataLength + kCCBlockSizeAES128; 
    void *buffer = malloc(bufferSize); 

    size_t numBytesEncrypted = 0; 
    CCCryptorStatus cryptStatus = CCCrypt(operation, 
              kCCAlgorithmAES, 
              kCCOptionPKCS7Padding, 
              keyPtr, 
              kCCBlockSizeAES128, 
              ivPtr, 
              [self bytes], 
              dataLength, 
              buffer, 
              bufferSize, 
              &numBytesEncrypted); 
    if (cryptStatus == kCCSuccess) { 
     return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted]; 
    } 
    free(buffer); 
    return nil; 
} 

-(NSString*)hexRepresentationWithSpaces_AS:(BOOL)spaces withdata:(NSData*)data 
{ 
    const unsigned char* bytes = (const unsigned char*)[data bytes]; 
    NSUInteger nbBytes = [data length]; 
    //If spaces is true, insert a space every this many input bytes (twice this many output characters). 
    static const NSUInteger spaceEveryThisManyBytes = 4UL; 
    //If spaces is true, insert a line-break instead of a space every this many spaces. 
    static const NSUInteger lineBreakEveryThisManySpaces = 4UL; 
    const NSUInteger lineBreakEveryThisManyBytes = spaceEveryThisManyBytes * lineBreakEveryThisManySpaces; 
    NSUInteger strLen = 2*nbBytes + (spaces ? nbBytes/spaceEveryThisManyBytes : 0); 

    NSMutableString* hex = [[NSMutableString alloc] initWithCapacity:strLen]; 
    for(NSUInteger i=0; i<nbBytes;) { 
     [hex appendFormat:@"%02X", bytes[i]]; 
     //We need to increment here so that the every-n-bytes computations are right. 
     ++i; 

     if (spaces) { 
      if (i % lineBreakEveryThisManyBytes == 0) [hex appendString:@"\n"]; 
      else if (i % spaceEveryThisManyBytes == 0) [hex appendString:@" "]; 
     } 
    } 

    return hex ; 
} 

とPHPで私は

$td = mcrypt_module_open('rijndael-128', '', 'cbc', $iv); 
mcrypt_generic_init($td, $key, $iv); 
$encrypted = mcrypt_generic($td, $str); 
mcrypt_generic_deinit($td); 
// mcrypt_module_close($td); 


echo $hexdata = bin2hex($encrypted); 
echo "<br>"; 

$bindata = ''; 

for ($i = 0; $i < strlen($hexdata); $i += 2) { 
    $bindata .= chr(hexdec(substr($hexdata, $i, 2))); 
} 


echo $bindata; 
echo "<br>"; 

mcrypt_generic_init($td, $key, $iv); 
$decrypted = mdecrypt_generic($td,$encrypted); 
mcrypt_generic_deinit($td); 
echo "encrypted : ".$encrypted; 
echo "<br>"; 
echo "decrypted : ".$decrypted; 
+0

私はあなたがデクリメントの最後にこれらの特殊文字を取得すると仮定します[ted plaintext? –

+0

出力の例を示し、コードを適切にインデントするために少し時間を取ってください。 –

答えて

1

mcryptを使用していますも、あなたは明らかにあなたのiOSのコード内で使用している、PKCS#7互換性のパディングを実装していない非常に古いライブラリです。最後に、パディングの文字表現が残されます。これはおそらく置換文字に置き換えられます。

IVが間違っていると、16文字が間違って表示され、すべての文字の間違ったキーが間違って表示されます。また、0x7Fより上のコードポイントで文字を表示できるように、UTF-8エンコーディングと一致させることもできます。

関連する問題