前两天,准备写一个文件打标程序,设想的是使用golang在文件的末尾添加一串加密的内容,然后使用java读取文件中加密的内容并解密,为了安全使用的是AES加密。
代码部分golang:加密解密
package util
import (
"crypto/aes"
"crypto/cipher"
"encoding/hex"
"fmt"
)
// 加密
func Encrypt(text string, key []byte) (string, error) {
//密钥key只能为16位、24位或32位,分别对应AES-128, AES-192和 AES-256
var iv = key[:aes.BlockSize]
encryptd := make([]byte, len(text))
block, err := aes.NewCipher(key)
if err != nil {
return "", err
}
encrypter := cipher.NewCFBEncrypter(block, iv)
encrypter.XORKeyStream(encryptd, []byte(text))
fmt.Println(encryptd)
return hex.EncodeToString(encryptd), nil
}
//解密
func Decrypt(encrypted string, key []byte) (string, error) {
src, err := hex.DecodeString(encrypted)
if err != nil {
return "", err
}
//密钥key只能为16位、24位或32位,分别对应AES-128, AES-192和 AES-256
var iv = key[:aes.BlockSize]
decrypted := make([]byte, len(src))
var block cipher.Block
block, err = aes.NewCipher([]byte(key))
if err != nil {
return "", err
}
decrypter := cipher.NewCFBDecrypter(block, iv)
decrypter.XORKeyStream(decrypted, src)
return string(decrypted), nil
}
读取文件列表部分:
package util
import (
"io/ioutil"
"os"
)
func ReadDir(path string) ([]os.FileInfo,error) {
fileInfos, e := ioutil.ReadDir(path)
if e != nil {
return nil,e
}
return fileInfos,nil
}
给文本添加标记、读取标记、删除标记部分:
package util
import (
"io"
"os"
)
const defaultkey = "abcdefghijklmnop"
const keySize = 16
const LEVEL_HIGH = "hig"
const LEVEL_MID = "mid"
const LEVEL_LOW = "low"
const FLAG = "bannana"
const FLAGOFFSET = 20
const LEVELOFFSET = 8
func AddFlag(fileName string, level string) (bool, error) {
openFile, err := os.OpenFile(fileName, os.O_RDWR|os.O_APPEND, 0777)
if err != nil {
log.Println("open file err", err)
return false, err
}
readFlag, readLevel, err := ReadFlag(fileName)
if readFlag {
log.Println("file is already add flag,level is", readLevel)
return true, nil
}
var readbuf [keySize]byte
defer openFile.Close()
readAt, err := openFile.ReadAt(readbuf[:], 0)
if err != nil {
log.Println("read file err", err)
return false, err
}
var encrypt string
if readAt < keySize {
encrypt, err = Encrypt(level, []byte(defaultkey))
log.Println("default result", encry