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 计算以及 salt 和迭代计数(都存在于配置文件中)以取回密码密钥。
  • 使用密码密钥,从配置的 encodedKeyData 字段中解密卷密钥(AES 流解密)

获得卷密钥后,您可以使用它来解密文件名和文件内容。

有关如何完成此操作的示例,您可以查看我用 Java 编写的以下库: https ://github.com/mrpdaemon/encfs-java

于 2012-08-01T06:37:08.120 回答
2

Current JavaScript implementations are far too slow to generate a PBKDF2 with more than 1000 - 2000 (not noticeably delayed) to 10000 (noticeable delay) iterations. An iteration count like in your example 97742 would take hours to finish...

Update: Only when using CryptoJS apparently: see JSPerf and JSFiddle for PBKDF2.

于 2013-01-19T18:55:27.953 回答