使用golang AES加密 java解密遇到的问题

本文探讨了在Golang中使用AES加密的数据在Java中解密时遇到的乱码问题。问题源于byte到String转换的不可逆性以及UTF-8编码导致的长度变化。解决方案是通过Base64编码桥接加密内容。文章详细分析了Golang和Java在处理加密数据上的差异,并提供了修正后的Java代码以实现正确解密。
摘要由CSDN通过智能技术生成

前两天,准备写一个文件打标程序,设想的是使用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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值