Skip to content

Commit

Permalink
Merge pull request #5 from ozaki-physics/develop
Browse files Browse the repository at this point in the history
Develop
  • Loading branch information
ozaki-physics authored Sep 12, 2021
2 parents ef1f9d9 + e0ae03e commit 244fa84
Show file tree
Hide file tree
Showing 9 changed files with 246 additions and 67 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
fileCrypto/json/*
!fileCrypto/json/filepath.json
fileCrypto/cipher/*
!fileCrypto/cipher/cipherText.md
fileCrypto/plain/*
Expand Down
4 changes: 2 additions & 2 deletions fileCrypto/cipher/cipherText.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
213dba24bcd9a3759cb0ae8e7b28eb594c92c3ce8a643f4ef0ef878cdc
b88c2a2f75c5cf668cb7ab50756dfc20ce0d17f93644443ba825742553
b93651a46f348142b1e8ff7f46240e373f45969b068bb80c7647cb1bc0
ebec40a8ec446b7803d22013c8153091c4a03fdce8aa690db936a02a3a
29 changes: 14 additions & 15 deletions fileCrypto/doc.go
Original file line number Diff line number Diff line change
@@ -1,21 +1,20 @@
// ファイルの中身を暗号化してファイルに出力するツール
/*
*/
// Use Case
// 5ファイル
// - 暗号化と復号に使う key ファイル(sample: fileCrypto/key/AES-CTR.key)
// - 暗号化したい内容が書かれたファイル(sample: fileCrypto/plain/plainText.md)
// - 暗号化した結果を書き出すファイル(sample: fileCrypto/cipher/cipherText.md)
// - 復号した結果を書き出すファイル(sample: fileCrypto/decode/decodeText.md)
// - 上記の4ファイルのパスを書いた JSON ファイル(sample: fileCrypto/json/filepath.json)
//
// RunFileEnCrypto() 暗号化
// RunFileDeCrypto() 復号
//
// 実行するときに コマンド引数で JSON ファイルのパスを渡すか
// 実行したあとに 標準入力で JSON ファイルのパスを渡す
package fileCrypto

/*
要件:
暗号化したいファイルを用意する
暗号化されたファイルが生成される
復号もできるようにする
ターミナル引数からパスワード等を入力する
.gitignore で 鍵を除外する
鍵や path は外部ファイルにしたいな
暗号化と復号はできたから ファイル書き出しにしたい
1行ごとにランダムな値とかにしたらセキュリティ的に強いのかな?
コードまで抜かれたらだめだけど笑
計算量問題があるから ここからここまでしか暗号化実施しないとかできないかな
key size を2進数にしないとダメっぽい
あれ セキュリティ弱いとかあった気がするから ドキュメント見直さないとな
key の大きさを公表しないようにしたい
*/
11 changes: 11 additions & 0 deletions fileCrypto/json/filepath.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"encode": {
"read": "fileCrypto/plain/plainText.md",
"write": "fileCrypto/cipher/cipherText.md"
},
"decode": {
"read": "fileCrypto/cipher/cipherText.md",
"write": "fileCrypto/decode/decodeText.md"
},
"key": "fileCrypto/key/AES-CTR.key"
}
2 changes: 1 addition & 1 deletion fileCrypto/key/AES-CTR.key
Original file line number Diff line number Diff line change
@@ -1 +1 @@
Passw0rdPassw0rd
Passw0rdPassw0rdPassw0rdPassw0rd
166 changes: 119 additions & 47 deletions fileCrypto/use.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,42 +6,74 @@ import (
"crypto/cipher"
"crypto/rand"
"encoding/hex"
"encoding/json"
"errors"
"flag"
"fmt"
"github.com/ozaki-physics/go-training-composition/trainingIo"
"github.com/ozaki-physics/go-training-composition/utils"
"io"
"io/fs" // file system に特化
"os"
"strings"
)

// crypto 暗号化や復号で使う json の入れ物
type crypto struct {
readpath string
writepath string
Encode filepath
Decode filepath
Key string
}

// RunFileEnCrypt ファイルの中身を暗号化する
func RunFileEnCrypt() {
// filepath encode または decode のときに使う ファイルの path
type filepath struct {
Read string
Write string
}

// getPathCrypto JSON から 構造体に変換する
func getPathCrypto(path string) crypto {
// path := "fileCrypto/json/filepath.json"
// path := "fileCrypto/json/filepath_product.json"
// ファイルが存在するか確認
trainingIo.SearchFile(path)
bytes, err01 := os.ReadFile(path)
utils.ErrCheck(err01)

var cp crypto
err02 := json.Unmarshal(bytes, &cp)
utils.ErrCheck(err02)

return cp
}

// RunFileEnCrypto ファイルの中身を暗号化する
func RunFileEnCrypto() {
utils.InitLog("[ファイルの中身を暗号化]")
utils.StartLog()

cp := getReadWriteEnCrypt()
key := getKey()
cp := getPathCrypto(terminalArgs())
// ファイルが存在するか確認
trainingIo.SearchFile(cp.Encode.Read)
fp := cp.Encode
key := getKey(cp.Key)

fr, err := os.Open(cp.readpath)
fr, err := os.Open(fp.Read)
utils.ErrCheck(err)
defer fr.Close()

fw, err := os.Create(cp.writepath)
fw, err := os.Create(fp.Write)
utils.ErrCheck(err)
defer fw.Close()

s := bufio.NewScanner(fr)
for i := 1; s.Scan(); i++ {
oneLine := s.Text()
// 暗号化
cipherByte := enCrypt(oneLine, key)
cipherByte := enCrypto(oneLine, key)
// byte を 16進数へ
cipherString := hex.EncodeToString(cipherByte)
fmt.Printf("暗号文(16進数) %03d行目: %s\n", i, cipherString)
// fmt.Printf("暗号文(16進数) %03d行目: %s\n", i, cipherString)
// 書き出す
_, err := fmt.Fprintln(fw, cipherString)
utils.ErrCheck(err)
Expand All @@ -50,19 +82,22 @@ func RunFileEnCrypt() {
utils.EndLog()
}

// RunFileDeCrypt ファイルから復号する
func RunFileDeCrypt() {
// RunFileDeCrypto ファイルから復号する
func RunFileDeCrypto() {
utils.InitLog("[ファイルの中身を復号]")
utils.StartLog()

cp := getReadWriteDnCrypt()
key := getKey()
cp := getPathCrypto(terminalArgs())
// ファイルが存在するか確認
trainingIo.SearchFile(cp.Decode.Read)
fp := cp.Decode
key := getKey(cp.Key)

fr, err := os.Open(cp.readpath)
fr, err := os.Open(fp.Read)
utils.ErrCheck(err)
defer fr.Close()

fw, err := os.Create(cp.writepath)
fw, err := os.Create(fp.Write)
utils.ErrCheck(err)
defer fw.Close()

Expand All @@ -73,8 +108,8 @@ func RunFileDeCrypt() {
plainByte, err01 := hex.DecodeString(oneLine)
utils.ErrCheck(err01)
// 復号
plainText := deCrypt(plainByte, key)
fmt.Printf("復号文(string) %03d行目: %s\n", i, plainText)
plainText := deCrypto(plainByte, key)
// fmt.Printf("復号文(string) %03d行目: %s\n", i, plainText)
// 書き出す
_, err02 := fmt.Fprintln(fw, plainText)
utils.ErrCheck(err02)
Expand All @@ -84,39 +119,16 @@ func RunFileDeCrypt() {
utils.EndLog()
}

// getReadWriteEnCrypt 暗号化用の読み込みファイルと書き込みファイルの struct を作る
func getReadWriteEnCrypt() crypto {
readfile := "fileCrypto/plain/plainText.md"
// ファイルが存在するか確認
trainingIo.SearchFile(readfile)
writefile := "fileCrypto/cipher/cipherText.md"
cp := crypto{readpath: readfile, writepath: writefile}

return cp
}

// getReadWriteDnCrypt 復号用の読み込みファイルと書き込みファイルの struct を作る
func getReadWriteDnCrypt() crypto {
readfile := "fileCrypto/cipher/cipherText.md"
// ファイルが存在するか確認
trainingIo.SearchFile(readfile)
writefile := "fileCrypto/decode/decodeText.md"
cp := crypto{readpath: readfile, writepath: writefile}

return cp
}

// getKey 外部ファイルから key を取得する
func getKey() []byte {
keyfile := "fileCrypto/key/AES-CTR.key"
func getKey(keyfile string) []byte {
// ファイルが存在するか確認
trainingIo.SearchFile(keyfile)

file, err01 := os.Open(keyfile)
utils.ErrCheck(err01)
defer file.Close()

content := make([]byte, 16)
content := make([]byte, 32)
_, err02 := file.Read(content)

if err02 == io.EOF {
Expand All @@ -128,8 +140,8 @@ func getKey() []byte {
return content
}

// enCrypt 暗号化
func enCrypt(plainText string, key []byte) []byte {
// enCrypto 暗号化
func enCrypto(plainText string, key []byte) []byte {
// cipher.Block を実装している AES 暗号化オブジェクトを生成する
block, err01 := aes.NewCipher(key)
utils.ErrCheck(err01)
Expand All @@ -152,8 +164,8 @@ func enCrypt(plainText string, key []byte) []byte {
return cipherByte
}

// deCrypt 復号
func deCrypt(cipherByte []byte, key []byte) string {
// deCrypto 復号
func deCrypto(cipherByte []byte, key []byte) string {
// cipher.Block を実装している AES 暗号化オブジェクトを生成する
block, err01 := aes.NewCipher(key)
utils.ErrCheck(err01)
Expand All @@ -169,3 +181,63 @@ func deCrypt(cipherByte []byte, key []byte) string {

return string(decryptedText)
}

// terminalArgs 実行時にコマンド引数から JSON ファイルのパスを受け取る
func terminalArgs() string {
flag.Parse()
args := flag.Args()

var filepath string
if len(args) > 0 {
// コマンド引数の1個目を取得
filepath = args[0]
// ファイルが存在するか確認
trainingIo.SearchFile(filepath)
} else {
// 標準入力で JSON の filapath を受け取る
fmt.Println("JSON ファイルのパスが 実行時に渡されませんでした")
filepath = terminalInput()
}

fmt.Printf("%s で暗号化や復号をします\n", filepath)
return filepath
}

// terminalInput ターミナルの標準入力で JSON ファイルパスを受け取る
func terminalInput() string {
r := bufio.NewReader(os.Stdin)
loop:
fmt.Print("JSON ファイルパス, n(終了), test(実験用の filepath.json) のいずれかを入力してください > ")

input, err := r.ReadString('\n')
utils.ErrCheck(err)
// 標準入力の \n を削除して 全部小文字にする
input = strings.ToLower(strings.Trim(input, "\n"))

var filepath string
switch input {
case "":
fmt.Println("何も入力されていません")
fmt.Println("再度入力してください")
goto loop
case "n":
fmt.Println("終了します")
case "test":
fmt.Println("実験用の fileCrypto/json/filepath.json を使用します")
filepath = "fileCrypto/json/filepath.json"
default:
fmt.Printf("%s が存在するか確認します\n", input)
_, err := os.Stat(input)
if errors.Is(err, fs.ErrNotExist) {
fmt.Println("ファイルが存在しません")
goto loop
} else {
// ファイルが存在しない以外のエラー
utils.ErrCheck(err)
}
fmt.Println("ファイルの存在が確認できました")
filepath = input
}

return filepath
}
20 changes: 18 additions & 2 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"github.com/ozaki-physics/go-training-composition/package02"
"github.com/ozaki-physics/go-training-composition/trainingCrypto"
"github.com/ozaki-physics/go-training-composition/trainingIo"
"github.com/ozaki-physics/go-training-composition/trainingJson"
"github.com/ozaki-physics/go-training-composition/trainingTimeZone"
"github.com/ozaki-physics/go-training-composition/utils"
"log"
Expand All @@ -23,8 +24,8 @@ func main() {
// mainCrypto()
// ioFileVersion()
// ioTerminalVersion()
fileCrypto.RunFileEnCrypt()
fileCrypto.RunFileDeCrypt()
mainFileCrypto()
// mainJson()
}

// mainPkg ディレクトリ構成を試す
Expand Down Expand Up @@ -107,3 +108,18 @@ func mainCrypto() {
trainingCrypto.Example10()
utils.EndLog()
}

// mainFileCrypto ファイルの中身を暗号化するツール
func mainFileCrypto() {
fileCrypto.RunFileEnCrypto()
fileCrypto.RunFileDeCrypto()
}

// mainJson JSON 読み込みの勉強
func mainJson() {
utils.InitLog("[JSONの実験]")
utils.StartLog()
trainingJson.Example()
trainingJson.ReadJson01()
utils.EndLog()
}
16 changes: 16 additions & 0 deletions trainingJson/filepath01.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"out01": {
"in01": "out01in01",
"in02": 102,
"in03": [
"out01in03core01"
]
},
"out02": {
"in01": "out02in01",
"in02": 202,
"in03": [
"out02in03core01"
]
}
}
Loading

0 comments on commit 244fa84

Please sign in to comment.