JAVA⇔Objective-c間でAES256データの暗号/復号化方法
お世話になります。
現在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);