CCCrypt(Objective-C) で暗号化したデータを Crypt::OpenSSL::AES(perl) で復号化する

iPhone/iPad/iPod で暗号化(AES256 を使用)したデータをサーバ側で復号化するのに半日ハマったのでメモ。

まず、ObjC 側。CCCrypt の解説は方々に存在しているので割愛。IV に NULL を指定しているので 0x00 が 16 Byte という事になる。

CCCrypt(
  kCCEncrypt,
  kCCAlgorithmAES128,
  kCCOptionPKCS7Padding,
  key, keySize,
  NULL,
  data, dataSize,
  buffer, bufferSize,
  &bufferBytes
);

次に、Perl 側。

Crypt::CBC->new(
    -key         => $key,
    -literal_key => 1,
    -cipher      => 'Crypt::OpenSSL::AES',
    -header      => 'none',
    -iv          => pack('C*', map {0x00} (1..16)),
)->decrypt($data);

ポイントは下記の通り。

  • Crypt::CBC を使う
  • literal_key に true を指定しないと key に指定した値の MD5 が KEY として使用される
  • header を none にして IV を明示的に指定する
  • CCCrypt(ObjC)側で IV を NULL にしたなら 0x00 が 16Byte なバイナリ列を指定する