2

もともと C で書かれたアプリの Java 実装を書いています。C バージョンを変更することはできず、Java バージョンは暗号化されたデータを C バージョンと共有する必要があります。

C 暗号化コードの関連部分は次のとおりです。

makekeys(password,&key1,&key2); /* turns password into two 8 byte arrays */
fill_iv(iv); /* bytes 8 bytes of randomness into iv */
des_key_sched(&key1,ks1);
des_key_sched(&key2,ks2);
des_ede2_ofb64_encrypt(hashed,ctext,hashedlen,ks1,ks2,
                       &iv,&num);

JCE に相当するものが次のようなものであることがわかります。

SecretKey key = new SecretKeySpec(keyBytes, "DESede");
IvParameterSpec iv = new IvParameterSpec(new byte[8]);
Cipher cipher = Cipher.getInstance("DESede/?????/?????"); // transformation spec?
cipher.init(Cipher.ENCRYPT_MODE, key, iv);
byte[] cipherTextBytes = cipher.doFinal(plaintext);

質問:

  • C コードは 2 つのキーを取り、JCE は 1 つを取ります。どうすればこれを調整できますか? 2つを1つの配列に追加するだけですか?どの順番で?
  • OpenSSL の des_ede2_ofb64_encrypt と同等の変換仕様 (もしあれば!) は? インターネットで見知らぬ人に尋ねる以外に、どうすればわかりますか? ;)
4

1 に答える 1

2

最後の質問への回答は、特定のアルゴリズム自体に関するドキュメントを読むことでわかります。通常、Sun のドキュメントは、読者がその内容に精通していることを前提としています。この場合、次のことがわかります。トリプル DES は、3 つの独立したキー付き DES ECB インスタンスを順番に適用したものです。これに対する最も一般的な方法は、DES ede と呼ばれるものです。つまり、1 番目と 3 番目の DES インスタンスは暗号化方向で実行されますが、2 番目の DES インスタンスは復号方向で実行されます。ede3 three は、各 DES インスタンスが個別にキー付けされることを意味し、ede2 は、1 番目と 3 番目のインスタンスが同じキーを使用することを意味します。OFB64 は 64 ビット出力フィードバック モードを意味します。

getInstance("DESede/OFB64/NoPadding") を使用し、key1 を DESede キーの最初の 8 バイト、key2 を 2 番目、key1 を 3 番目にすることで、同じ結果が得られるはずです。

于 2010-02-08T13:29:59.667 に答える