28062
お世話になります。  
現在Java[サーバ]とObjective-C[クライアント]で  
AES256/CBC/PKCS5Paddingで暗号化したデータの受け渡しを行い  
サーバとクライアントそれぞれで  
送信時に暗号化/受信時に復号化をしたいと考えているのですが  
Objective-C側での受信時の復号化がうまくできません。  
（復号化はsuccessになるが、文字列データが取れない）

下記コード上で修正が必要な箇所を指摘いただけると幸いです。  
よろしくお願いいたします。

```

    JAVA[暗号化側]
    
    String data = "ENCRYPTION DATA";
    String key  = "COMMON KEY";
    String iv   = "INITIAL VECTOR";
    
    byte[] binData = data.getBytes();
    byte[] binKey  = key.getBytes();
    byte[] binIv   = iv.getBytes();
    
    SecretKeySpec key  = new SecretKeySpec(binKey, "AES");
    IvParameterSpec iv = new IvParameterSpec(binIv);
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    cipher.init(Cipher.ENCRYPT_MODE, key, iv);
    
    String [暗号化済み文字列データ] = Hex.encodeHexString(cipher.doFinal(binData));
    
```

暗号化済み文字データは、HTTP通信のレスポンスでJSONとしてクライアント側へ送ります。  
{"encryptData":暗号化済み文字列データ}

```

    Objective-C[復号化側]
    
    NSString *data  = [暗号化済み文字列データ];
    NSData *encData = [data dataUsingEncoding:NSUTF8StringEncoding];
    NSString *key   = @“COMMON KEY";
    NSString *iv    = @“INITIAL VECTOR";
    
    char keyPtr[kCCKeySizeAES256+1];
    bzero(keyPtr, sizeof(keyPtr));
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
    
    size_t encryptdataSize = [encData length] + kCCBlockSizeAES128;
    void *encryptdata = malloc(encryptdataSize);
    
    size_t numBytesEncrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
                                      kCCAlgorithmAES128,
                                      kCCOptionPKCS7Padding,
                                      keyPtr,
                                      kCCKeySizeAES256,
                                      (const void*)[iv UTF8String],
                                      [encData bytes],
                                      [encData length],
                                      encryptdata,
                                      encryptdataSize,
                                      &numBytesEncrypted); 
    NSData *decData = nil;
    NSString [復号化済み文字列データ];
    if (cryptStatus == kCCSuccess) { // success扱いになる
    decData = [NSData dataWithBytesNoCopy:encryptdata length:numBytesEncrypted];
        [復号化済み文字列データ] = [[NSString alloc] initWithData: decData encoding:NSUTF8StringEncoding]; // データを取得できない。(エンコードに失敗している？)
    }
    
    free(encryptdata);
    
```
CC BY-SA 3.0
2016-08-03T22:12:52.763
28052
2016-08-04T11:41:14.050
12325
question
ios java objective-c
JAVA⇔Objective-c間でAES256データの暗号/復号化方法
AES256のデータ暗号化・復号化の処理は正しいと思います。  
バイト列の文字列化(Java)と、文字列のバイト列化(Objective-C)が違っているため、うまくうごかないようです。

例えば、Objective-Cの

```

    NSData *encData = [data dataUsingEncoding:NSUTF8StringEncoding];
    
```

の部分を

```

        unsigned char array[ [data length] / 2];
        for (int i=0;i<data.length;i+=2) {
            NSString *c = [data substringWithRange:NSMakeRange(i,2)];
            NSScanner *scanner = [NSScanner scannerWithString:c];
            unsigned int iValue;
            [scanner scanHexInt:&iValue];
            char b = (char) iValue;
            array[i/2] = b;
        }
        NSData *encData = [NSData dataWithBytes:array length: [data length] / 2];
    
```

のようにすれば、正しく復号化出来ます。
CC BY-SA 3.0
2016-08-04T11:41:14.050
28062
2016-08-04T11:41:14.050
8848
28052
answer