stdlib5.legsup [win & linux] : gen1~4 구세대 데이터 형식 호환 계층.
<go-exp>
common:
func G3mold() -> byte[]
# gen3kpic에 사용되는 기본 주형 사진. (png binary)
func G3zip() -> byte[]
# gen3kzip에 사용되는 아이콘 사진. (png binary)
func G3kf() -> byte[]
# gen3kaes의 기본키파일.
func G3pic() -> byte[]
# gen3kaes에 사용되는 아이콘 사진. (png binary)
func G4kf() -> byte[]
# gen4kaes의 기본키파일.
func G4pic() -> byte[]
# gen4kaes에 사용되는 아이콘 사진. (png binary)
func Genkf(str path) -> byte[]
# 경로의 파일을 모두 읽어 반환, 오류 시 nil 반환.
gen1:
struct G1enc
func Init()
# 구조체 내부 필드를 초기화.
func Encrypt() -> error
# 구조체 내부 데이터를 참고하여 암호화.
func Decrypt() -> error
# 구조체 내부 데이터를 참고하여 복호화.
func View() -> error
# 구조체 내부 데이터를 참고하여 암호화된 파일 정보 해석.
.Path str # 암호화/복호화/해석 대상 파일 경로.
.Pw str # 비밀번호.
.Hint str # 비밀번호 힌트.
gen2:
struct G2enc
func Init()
# 구조체 내부 필드를 초기화.
func Encrypt() -> (str, error)
# 구조체 내부 데이터를 참고하여 암호화. 암호화 결과 경로 반환.
func Decrypt() -> error
# 구조체 내부 데이터를 참고하여 복호화.
func View() -> error
# 구조체 내부 데이터를 참고하여 암호화된 파일 정보 해석.
.Path str # 암호화/복호화/해석 대상 파일 경로.
.Pw str # 비밀번호.
.Hint str # 비밀번호 힌트.
.Hidename bool # 암호화 시 파일명 숨김 옵션. True일 경우 파일명 숨김.
gen3:
struct G3data
func Init()
# gen3kdb 항목 하나를 이루는 데이터 노드를 초기화.
func Append(G3data* tgt)
# 데이터 노드의 가장 끝에 데이터 노드 추가. (리스트 형식 데이터 등에 사용)
func Length() -> int
# 현재 노드를 시작으로 끝 노드까지의 길이.
func Locate(int pos) -> G3data*
# 현재 노드를 기준으로 pos번째 노드 반환.
func Print(bool zipstr, bool zipexp) -> str
# 노드 문자열 출력. zipstr/zipexp는 문자열/표현형식 단축 여부.
.Next *G3data # 다음 데이터 노드 포인터. 없을 경우 nil.
.Vtype rune # 데이터 노드의 값 종류. ('i', 'f', 's', 'n')
.IntV int # 정수 값 저장 위치.
.FloatV float # 실수 값 저장 위치.
.StrV str # 문자열 값 저장 위치.
struct G3node
func Read(str[] frag, rune[] trait) -> error
# gen3kdb의 kobj 하나에 해당하는 구문을 파싱 후 저장.
func Write(int indent, bool zipstr, bool zipexp) -> str
# indent만큼 공백 들여쓰기, 문자열/표현형식 압축 여부에 따라 텍스트 생성.
func Locate(str name) -> G3node*
# 현재 레벨에서 name 이름을 가진 하위 노드 반환. 존재하지 않으면 nil 반환.
func Revise(G3data* tgt) -> error
# 이 노드의 데이터를 tgt로 수정.
.Name str # 이 kobj/node의 이름.
.Data G3data* # 데이터 노드. 객체 역할인 경우 nil.
.Child G3node[] # 자식 노드들. 데이터 역할인 경우 nil.
struct G3kdb
func Read(str raw) -> error
# gen3kdb 문자열을 입력받아 해석, 내부 데이터 저장.
func Write() -> str
# 내부 데이터를 gen3kdb 문자열로 출력.
func Locate(str name) -> G3node*
# "#"으로 구분된 주소를 가진 노드 반환. 존재하지 않으면 nil 반환.
.Zipstr bool # 문자열 압축 여부. 압축 시 공백/줄바꿈이 #표현으로 바뀜.
.Zipexp bool # 표현형식 압축 여부. 압축 시 들여쓰기와 텍스트 구조에 공백/줄바꿈이 사라짐.
.Node G3node* # 내부 노드. 이 노드를 설정하여 임의 데이터 구조 생성 가능.
struct G3kzip
func Init()
# 패키징에 필요한 내부 데이터 설정.
func Packf(str[] tgt, str path) -> error
# 파일들 패키징. tgt 항목을 패키징해 path에 생성.
func Packd(str tgt, str path) -> error
# 폴더 패키징. tgt 폴더를 패키징해 path에 생성.
func View(str tgt) -> error
# 패키징된 파일 정보 해석. CRC32 값 검사.
func Unpack(str tgt) -> error
# 패키징된 tgt 파일 풀기. "./temp261/" 폴더에 생성됨.
.Prehead byte[] # 사진 위장 헤더. (1024nB)
.Header byte[] # 메인헤더 (18B)
.Chunkpos int[] # 청크 시작 위치. subhead + data가 한 청크.
.Subhead byte[][] # 각 청크의 subhead.
.Winsign bool # 폴더 표시를 위해 백슬래시 사용. (윈도우 전용 구형 코드와 호환성)
struct G3kaesall
func Init(int core, int chunk)
# 전체모드 암호화에 필요한 내부 데이터 설정. (0, 0)으로 기본 모드(32, 128k).
func Encrypt(str path, str pw, byte[] kf) -> error
# path 파일을 암호화.
func Decrypt(str path, str pw, byte[] kf) -> error
# path 파일을 복호화.
func View(str path) -> error
# 암호화된 path 파일의 정보 해석.
.Prehead byte[] # 사진 위장 헤더. (1024nB)
.Metadata byte[] # 메타데이터 (18B)
.Mainhead byte[] # 메인헤더
.Subhead byte[] # 보조헤더 (현재 사용하지 않음)
.Hidename bool # 이름 숨기기 여부. True일 경우 무작위 숫자 파일명으로 생성됨.
.Hint str # 비밀번호 힌트.
.Respath str # 암호화/복호화 결과 파일 경로.
struct G3kaesfunc
func Encrypt(str before, str after, byte[] akey) -> error
# 32B akey로 파일 암호화. (32, 128k) 모드 고정.
func Decrypt(str before, str after, byte[] akey) -> error
# 32B akey로 파일 복호화. (core, chunk)는 암호화 파일에 따름.
.Metadata byte[] # 메타데이터 (18B), 사진위장과 보조헤더는 사용하지 않음.
.Mainhead byte[] # 메인헤더
struct G3kv3
func Encrypt(str pw, byte[] kf, str path) -> error
# path 폴더를 func+kv3 모드로 암호화.
func Decrypt(str pw, byte[] kf, str path) -> error
# path 폴더를 func+kv3 모드로 복호화.
func View(str path) -> error
# 암호화된 폴더의 정보 해석.
.Hint str # kv3 암호화의 비밀번호 힌트.
struct G3kpic
func Init(str path, int row, int col) -> error
# 주형 사진 설정. 빈 문자열로 기본주형사진 사용.
# 가로세로 크기는 모두 4의 배수 혹은 -1로 사진크기 그대로 설정. png만 사용 가능.
func Detect(str path) -> (str, int, error)
# 폴더 안에 gen3kpic 파일을 감지, 이름과 개수 반환. png 모드만 사용함.
func Pack(str tgt, str exdir) -> (str, int)
# tgt 파일을 패키징해 exdir 폴더 내부에 사진들 생성. 사진 이름과 개수 반환.
func Unpack(str path, str tgtdir, str name, int num)
# tgtdir 폴더에서 name, num 데이터로 gen3kpic 사진들을 path 파일로 복구.
.Pcover bool # 사진 위장 사용 여부. True면 2배수 모드, False면 1배수 모드.
func G3picre(byte[] pic, str[] files, str path) -> error
# files 파일들을 pic 위장사진헤더를 가진 zip으로 path 경로에 압축시킴.
gen4:
struct G4enc
func Encrypt(str[] files, byte[] pw) -> (str, error)
# 파일들 암호화, 첫 번째 암호화 대상 파일과 같은 폴더에 암호화된 파일 생성, 해당 경로 반환됨.
func Decrypt(str path, byte[] pw) -> error
# 암호파일과 같은 폴더에 원본 파일 복구.
func View(str path) -> error
# 암호화된 파일의 정보 해석.
.Hint str # gen4enc (KAESL-OTE1) 비밀번호 힌트.
func G4DBread(str raw) -> (G4data content)[str name]
# gen4kdb 텍스트를 읽고 이름-데이터 쌍의 해시맵을 반환.
func G4DBwrite((G4data content)[str name] data) -> str
# 이름-데이터 쌍의 해시맵에서 gen4kdb 텍스트 생성.
struct G4data
func Set(interface data) -> error
# 바이트열/문자열/정수/실수 값으로 데이터 설정.
.ByteV byte[] # 바이트 값 저장 위치
.StrV str # 문자열 값 저장 위치
.IntV int # 정수 값 저장 위치
.FloatV float # 실수 값 저장 위치
.Dtype rune # 데이터 값 종류. ('b', 's', 'i', 'f', 'n')
struct G4io
func OpenB(byte[] raw, bool isreader)
# raw를 내부 버퍼로 하는 B모드 읽기/쓰기 구조체 설정.
func OpenF(str path, bool isreader) -> error
# path 경로로 F모드 읽기/쓰기 구조체 설정.
func CloseB() -> byte[]
# B모드 읽기/쓰기를 종료하고 내부 버퍼 반환.
func CloseF()
# F모드 내부 파일 포인터를 닫음.
func Size() -> int
# 버퍼/파일의 크기 반환.
func Seek(int pos)
# 버퍼/파일의 읽기 기준위치 설정.
func Read(int size) -> byte[]
# size 크기만큼 읽고 바이트열 반환.
# 만약 읽기 데이터가 부족하다면 size보다 작은 크기로 반환.
# 읽기 기준위치는 같은 크기만큼 뒤로 이동.
func Write(byte[] chunk)
# 바이트열을 버퍼에 이어붙임/파일에 쓰기.
.IsBin bool # 바이너리 모드 여부. True면 binary, False면 file 모드.
.IsReader # 읽기 용도인지 여부. True면 읽기만 가능, False면 쓰기만 가능.
struct G4kaesall
func EnBin(byte[] pw, byte[] kf, byte[] data) -> (byte[], error)
# 바이트열 암호화. 암호화 결과물 반환. (사진 위장헤더 포함)
func EnFile(byte[] pw, byte[] kf, str path) -> (str, error)
# 파일 암호화. 암호화 대상 파일과 같은 위치에 새 파일 생성. 암호파일 경로 반환.
func DeBin(byte[] pw, byte[] kf, byte[] data) -> (byte[], error)
# 바이트열 복호화. 복호화 결과물 반환. (원본이름 복구기능 없음)
func DeFile(byte[] pw, byte[] kf, str path) -> (str, error)
# 파일 복호화. 복호화 대상 파일과 같은 위치에 새 파일 생성. 원본파일 경로 반환.
func ViewBin(byte[] data) -> error
# 암호화 바이트열의 정보 해석.
func ViewFile(str path) -> error
# 암호화 파일의 정보 해석.
.Hint byte[] # 비밀번호 힌트.
struct G4kaesfunc
func Encrypt(byte[] mkey) -> error
# 48B mkey로 암호화.
func Decrypt(byte[] mkey) -> error
# 48B mkey로 복호화.
.Inbuf G4io # 입력버퍼 (읽기전용), Open/Close 작업은 모듈 사용자가 처리해야 함.
.Exbuf G4io # 출력버퍼 (쓰기전용), Open/Close 작업은 모듈 사용자가 처리해야 함.
func InitKV4(str path) -> g4kv4*
# 클러스터 경로로 path를 설정하고 내부 필드를 초기화한 구조체 반환.
struct g4kv4
func View() -> error
# 암호화된 클러스터 정보 해석.
func Read(byte[] pw, byte[] kf, str newpath) -> error
# 암호화된 클러스터를 newpath 폴더 아래에 복호화. bin/main 폴더가 생성됨.
func Write(byte[] pw, byte[] kf, str tgtpath) -> error
# 일반 폴더 tgtpath에서 암호화 클러스터 생성. 클러스터 main 안에 tgtpath가 있는 구조로 생성됨.
.Path str # 클러스터 경로. (클러스터 읽기/쓰기 모두)
.Hint byte[] # 클러스터 비밀번호 힌트.
이 라이브러리는 오래된 데이터 형식의 읽고쓰기를 지원하기 위해 만들어졌으며,
시험 버전이기에 충분한 테스트를 거치지 않았습니다.
사용 시 원본 python 코드를 기준으로 하십시오.
(원본 py코드가 잘못 짜인 오류까지도 따라서 구현함)
!!! 폴더 자동초기화 주의. G3kzip.Unpack: "./temp261/", G3picre: "./temp365/" !!!
!! G2enc 패딩, G3kaes 보조 키 생성 과정의 원본 python 코드가 잘못 구현되어 있음. !!
G1ENC {
magicnum : 4B; .kos // 버전 식별자.
salt : 40B // salt 바이트.
pwhash : 32B // 비밀번호 해시.
hint : 324B // 최대 324B 길이 비밀번호 힌트.
data : nB // 암호화 데이터의 길이는 원본과 같음.
}
G2ENC {
magicnum : 4B; kos2 // 버전 식별자.
salt : 80B // salt 바이트.
pwhash : 64B // 비밀번호 해시.
hint : 600B // 최대 600B 길이 비밀번호 힌트.
encname : 256B // 암호화된 파일명. 0x00으로 패딩됨.
namelen : 2B // 원본파일명 길이.
namemode : 2B // 이름숨김 모드에 따라 hi 또는 op.
header md5 : 16B // 앞 7개 항목의 md5 해시값.
data : 16nB // 암호화 데이터는 16배수로 패딩됨.
// 파이썬 버전은 원본길이가 16배수인 경우 0x16이 아닌 0x00을 16개 패딩하는 오류가 존재.
}
G3KDB {
유니코드 기반 구조적 데이터 형식.
[이름] {값}. 중괄호 안에 다른 구조체가 포함될 수 있음.
값으로는 정수, 실수, 문자열, 리스트가 가능.
이름에 # 포함 시 주석. 문자열 포메팅은 ## : #, #" : ", #s : 공백, #n : 줄바꿈
[x0]{[x1]{123}[x2]{45.6000}[x3]{"가나다abc"}[y0]{[y1]{128,"###"#s#n"}}}
}
G3KZIP {
prehead : 1024nB // 위장용 사진 헤더.
mainhead : 18B {
magicnum : 4B; KTS2 // 버전 식별자.
reserved : 2B // 예약됨. (현재 사용하지 않음)
chunknum : 3B // 청크 개수.
typelen : 1B // type 길이.
sizelen : 1B // size 길이.
namelen : 3B // name 길이.
crc32data : 4B // 모든 subheader을 이어붙인 것의 CRC32 값.
}
chunk *N {
subheader : (type + size + name)B // S (폴더 구조 정보), F (파일 바이너리).
data : nB // F 모드는 파일 데이터.
// S 모드는 내부 폴더를 리스트로 나열함. [folders]{[data]{"x0","x0/x1"}}
}
trash : nB // 모든 청크 종료 후에 오는 값은 쓰레기값.
}
G3KAES {
prehead : 1024nB // 위장용 사진 헤더.
metadata : 18B {
magicnum : 4B; KES3 // 버전 식별자.
reserved : 2B // 예약됨. (현재 사용하지 않음)
mhsize : 4B // mainhead 크기.
shsize : 4B // subhead 크기.
crc32data : 4B // mainhead + subhead의 CRC32 값.
}
mainhead : nB // 병렬처리와 파일이름에 대한 데이터가 존재.
// all-mode : (core, chunksize, ckeydt, salt, pwhash, hint, tkeydt, enctitle)
// func-mode : (core, chunksize, iv, ckeydt)
subhead : nB // 현재 사용하지 않는 보조헤더.
data : 16nB // 데이터는 chunksize 크기로 분할되며, 한번에 core개 만큼 병렬처리됨.
// chunksize는 16의 배수로 설정되기에, padding은 마지막 청크에 한해 계산됨.
}
G3KPIC {
사진 바이너리에 데이터를 분할하여 숨김.
1x 모드는 원본 사진과 무관하게 사진 1 바이트당 데이터 1 바이트 할당.
2x 모드는 원본 사진의 하위 4비트를 이용해 사진 2 바이트당 데이터 1 바이트 할당.
RGB 256 값 중 16으로 나눈 몫은 유지하고 나머지를 이용해 인코딩.
데이터를 16으로 나눈 몫과 나머지를 순서대로 (빅엔디안) 사진과 결합.
사진 파일은 가로세로가 모두 4의 배수여야 하며, 색이 24비트여야 함.
이때 2x 모드는 사진 한 장당 row * col * 3 / 2 만큼 저장 가능.
데이터가 사진 저장 크기와 맞지 않는 경우에는 뒤에 0 패딩을 하기에 kzip같은 방식과 조합하여야 함.
}
G3PICRE {
앞에 일반 사진 파일이 오게 하고, 뒤에 zip 파일을 위치시킴.
zip 헤더를 적절히 조절하여 사진과 압축파일 모두로 작동할 수 있게 함.
zip {
chunk *N {
local file head
compressed file data
}
central head *N // 각 local file head의 시작 오프셋이 존재.
zip mainhead *1 // central head의 시작 오프셋이 존재.
}
앞에 사진파일을 추가하며 zip mainhead, central head의 오프셋을 수정하는 원리.
}
G4ENC {
magicnum : 4B; OTE1 // 버전 식별자.
hintlen : 2B // 힌트 길이.
hint : nB // 힌트 바이트열.
salt : 32B // 비밀번호 salt.
pwhash : 32B // 비밀번호 hash.
cketdata : 128B // encrypted content key.
iv : 16B // plain iv 바이트열.
data : 16nB // G3KAES와 비슷하게 병렬처리됨. (core, chunk)는 (32, 128k)로 고정.
}
G4KDB {
바이트열, 문자열, 정수, 실수의 간단한 텍스트 형식 기록.
모두 대문자로 기록되며, 식별자가 모두 대문자. 각 항목 사이 구분은 줄바꿈 문자.
바이트열/문자열은 hex 출력값을, 정수/실수는 그대로 문자열화한 값을 적음.
형식 : name(type)data\n
DATA0(BYTES)16C3\nDATA1(STR)414243\nDATA2(INT)42\nDATA3(FLOAT)0.123
}
G4KAES {
prehead : 128nB // 위장용 사진 헤더.
magicnum : 5B; KAES4 // 버전 식별자.
mhsize : 3B // mainhead 길이.
mainhead : nB // bin/file 여부, all/func 모드에 따라 포함된 필드가 다름.
// all-mode-bin : (MODE, SALT, PWH, CKDT, HINT), all-mode-file : (TKDT, NMDT) 추가됨.
// func-mode : (MODE, CKDT)
data : 16nB // G3KAES와 비슷하게 병렬처리됨. (core, chunk)는 (32, 128k)로 고정.
}
G4KV4 {
header {
magicnum : 4B; KV4H // 버전 식별자.
mhsize : 8B // mainhead 크기.
mainhead : nB // 6개 필드를 가진 mainhead.
fssize : 8B // filesys 크기.
filesys : 16nB // filesys 크기.
fksize : 8B // filekey 크기.
filekey : 16nB // filekey 크기.
}
mainhead {
MODE, SALT, PWH, AKDT, TKDT, HINT 필드를 가짐.
akey로 filekey가 암호화되고, tkey로 filesys가 암호화됨.
}
filesys {
가상 파일 시스템은 휴지통 역할의 bin과 저장소 역할의 main으로 나눠 구현됨.
각 폴더는 하위 폴더와 파일을 가질 수 있으며, 더 하위일수록 "깊이"가 깊어짐.
이 관계는 파일과 폴더 각 항목을 줄바꿈 문자로 구분하는 이진 파일 형태로 저장됨.
형식 : 깊이 + 식별자 + 이름 + 추가데이터
식별자는 폴더는 #, 일반파일은 $, G3KZIP 처리된 폴더파일은 &.
폴더는 추가데이터가 없으며, 파일형의 경우 슬래시 + fptr이 붙음.
0#bin
1#trashdir
1&trashfile/............
0#main
1#upfolder
2#midfolder
3#downfolder
3$data/............
2$data/............
}
filekey {
모든 파일은 고유한 fptr : 12B과 fkey : 48B를 가짐.
fptr을 오름차순 정렬되는 순서로 fptr + fkey : 60B씩 이어붙여
filekey 바이너리를 생성함. (즉 filekey의 길이는 60 * 파일 수)
}
클러스터란 헤더, 청크(암호화된 파일들이 모여있는 폴더)가 모여있는 폴더를 말함.
각 청크 안의 파일 개수는 maxnum에 의해 결정됨.
모든 클러스터 안의 파일은 대응되는 fptr을 가지며,
폴더는 filesys에 적힌 가상의 관계도에 의해 생성됨.
}