暗号化にCTRモードでAES128暗号を使用し、さまざまなクライアント(Android/JavaおよびiOS/ObjC)に実装しています。パケットの暗号化に使用される16バイトのIVは、次のようにフォーマットされます。
<11 byte nonce> | <4 byte packet counter> | 0
パケットカウンタ(送信されたパケットに含まれる)は、送信されるパケットごとに1つずつ増加します。最後のバイトはブロックカウンターとして使用されるため、256ブロック未満のパケットは常に一意のカウンター値を取得します。CTRモードでは、ブロックごとにカウンターを1ずつ増やし、最後の8バイトをビッグエンディアンの方法でカウンターとして使用するように指定されているか、少なくともこれがデファクトスタンダードであると想定していました。これは、Sun暗号化の実装にも当てはまるようです。
対応するiOS実装(CommonCryptor、iOS 5.1を使用)がパケットをデコードするときの最初のブロックを除いてすべてのブロックをデコードできなかったとき、私は少し驚いた。CommonCryptorは他の方法でカウンターを定義しているようです。CommonCryptorは、ビッグエンディアンモードとリトルエンディアンモードの両方で作成できますが、CommonCryptorコードのあいまいなコメントは、これが完全にはサポートされていない(または少なくともサポートされていない)ことを示しています。
http://www.opensource.apple.com/source/CommonCrypto/CommonCrypto-60026/Source/API/CommonCryptor.c
/* corecrypto only implements CTR_BE. No use of CTR_LE was found so we're marking
this as unimplemented for now. Also in Lion this was defined in reverse order.
See <rdar://problem/10306112> */
ブロックごとにデコードすることにより、上記のようにIVを設定するたびに、うまく機能します。
私の質問:一度に複数のブロックをデコードするときにCTR / IVモードを実装する「正しい」方法はありますか、それとも異なる暗号ライブラリを使用するときに相互運用性の問題になると予想できますか?CommonCryptoはこの点でバグがありますか、それともCTRモードを別の方法で実装するだけの問題ですか?