Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

An encrypted archive file format that supports random access

Notifications You must be signed in to change notification settings

lshpku/quicktar

Folders and files

NameName
Last commit message
Last commit date

Latest commit

History

25 Commits

Repository files navigation

QuickTar

A random-access archive format with encrytion support.

Usage

Archive/Extract

WebDAV Server

文件格式

  • 一个QuickTar文件首先可以表示为如下结构体

    struct {
     header [32]byte
     data []byte // 大小必须为32的倍数
     meta []byte // 大小必须为32的倍数
    }
  • header是一个如下的结构体

    struct {
     magic [8]byte // 必须为"QuickTar"
     metaEnd int64 // meta段结尾的偏移量;
     // 这个值通常是QuickTar文件的大小,只是为了冗余而记录
     nonce [16]byte // AES CTR算法的nonce,为系统生成的随机数;
     // 只在QuickTar创建时生成一次,之后永不修改
    }
  • 关于加密

    • QuickTar文件可以使用AES-CTR加密,加密时datameta均会被加密
    • 偏移量为x字节的block的IV为nonce+x/16,也就是说不用减掉header的偏移量
    • QuickTar不记录AES的级别,需要用户在解压时指定
  • 关于Checksum

    • 为了简化meta设计,QuickTar没有内置Checksum功能
    • 如果用户有Checksum需求,可以以文件形式记录每个文件的Checksum

Meta

  • meta的最后是一个32B的结构体

    struct {
     size int64 // meta段的大小
     count int64 // 包含的文件数量
     random [8]byte // 系统生成的随机数,每次重写meta时重新生成
     zeros [8]byte // 必须全为0,用于校验密码格式
    }
  • 通过size定位到meta的开头,首先读出count个如下的32B大小的结构体,表示每个文件

    struct {
     offset int64 // 文件在整个QuickTar文件中的偏移量
     size int64
     mode uint32
     nsec uint32
     sec int64
    }
  • 然后紧接着是count个文件名,每个文件名后紧跟着一个'0円',所有文件名结束时用0补齐至32对齐

Data

  • data段的结尾用0补齐至32B对齐

  • 格式说明

    • 普通文件:根据offsetsize读取每个文件即可
    • 文件夹:没有实际数据,其offsetsize均为0
    • 软链接:可以像普通文件一样读,其内容为链接的目的地址

About

An encrypted archive file format that supports random access

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

AltStyle によって変換されたページ (->オリジナル) /