2

JavaScript を使用して encfs ファイルシステムから読み取ろうとしていますが、正しく使用できません。CryptoJSライブラリを使用します。

標準設定とパスワード 123456 の .ecnfs6.xml:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE boost_serialization>
<boost_serialization signature="serialization::archive" version="9">
<cfg class_id="0" tracking_level="0" version="20">
  <version>20100713</version>
  <creator>EncFS 1.7.4</creator>
  <cipherAlg class_id="1" tracking_level="0" version="0">
    <name>ssl/aes</name>
    <major>3</major>
    <minor>0</minor>
  </cipherAlg>
  <nameAlg>
    <name>nameio/block</name>
    <major>3</major>
    <minor>0</minor>
  </nameAlg>
  <keySize>192</keySize>
  <blockSize>1024</blockSize>
  <uniqueIV>1</uniqueIV>
  <chainedNameIV>1</chainedNameIV>
  <externalIVChaining>0</externalIVChaining>
  <blockMACBytes>0</blockMACBytes>
  <blockMACRandBytes>0</blockMACRandBytes>
  <allowHoles>1</allowHoles>
  <encodedKeySize>44</encodedKeySize>
  <encodedKeyData>
A2MxizkB27kOot67DqX/ftXoAiO0P8ORF4BqbKnbMeHuIusJl5y36Qy8o8w=
  </encodedKeyData>
  <saltLen>20</saltLen>
  <saltData>
z59o4aHs2QaKGdoEMEigtqSkXyw=
  </saltData>
  <kdfIterations>97742</kdfIterations>
  <desiredKDFDuration>500</desiredKDFDuration>
</cfg>
</boost_serialization>

名前とコンテンツが「test」のファイルを作成し、それを復号化しようとしましたが、成功しませんでした:

var data = "Q75cZB2ok,JdXDqvWh8HbwHI";  // filename
var key = "123456";
var salt = "z59o4aHs2QaKGdoEMEigtqSkXyw=";

data = CryptoJS.enc.Base64.parse(data);
salt = CryptoJS.enc.Base64.parse(salt);

var cipher = CryptoJS.AES.decrypt(data, key, {keySize: 192/32});
4

2 に答える 2

4

EncFS が機能する方法は、ボリューム キー (構成に応じて 192 ビット) を作成し、ユーザーのパスワードから派生した別のキーを使用してボリューム キーを暗号化することです (パスワード キーを派生させるために使用されるアルゴリズムは PBKDF2 - パスワード ベースと呼ばれます)。鍵導出関数)。

その構成ファイルを考えると、あなたがしなければならないことは次のとおりです。

  • ユーザーのパスワードを取得し、PBKDF2 計算にソルトと反復回数 (両方とも構成ファイルに存在) を入力して、パスワード キーを取得します。
  • パスワード キーを使用して、config の encodedKeyData フィールドからボリューム キーを復号化します (AES ストリーム復号化)。

ボリューム キーを取得したら、それを使用してファイル名とファイルの内容を復号化できます。

これがどのように行われるかの例については、私が Java で書いた次のライブラリをご覧ください: https://github.com/mrpdaemon/encfs-java

于 2012-08-01T06:37:08.120 に答える
2

現在の JavaScript の実装は、PBKDF2 を生成するには遅すぎるため、1000 - 2000(顕著に遅れることはない) から 10000(顕著に遅れること) までの繰り返しがあります。あなたの例のような反復カウントは、97742完了するまでに数時間かかります...

更新: どうやら CryptoJS を使用している場合のみ: PBKDF2 の JSPerfとJSFiddleを参照してください。

于 2013-01-19T18:55:27.953 に答える