我正在尝试加密数据库中的一些文本,以便在程序启动期间加载和解密。
我尝试了几种方法,包括第三方库 https://github.com/richard-lyman/lithcrypt 都无济于事。使用以下方法加密/解密 8⁄10 项,但似乎在加密/解密的某个时刻留下了一些填充残留物。就目前而言,我的代码是这样的:
package client
import (
"encoding/base64"
"crypto/aes"
"crypto/cipher"
"fmt"
)
var iv = []byte{34, 35, 35, 57, 68, 4, 35, 36, 7, 8, 35, 23, 35, 86, 35, 23}
func encodeBase64(b []byte) string {
return base64.StdEncoding.EncodeToString(b)
}
func decodeBase64(s string) []byte {
data, err := base64.StdEncoding.DecodeString(s)
if err != nil { panic(err) }
return data
}
func Encrypt(key, text string) string {
block, err := aes.NewCipher([]byte(key))
if err != nil { panic(err) }
plaintext := []byte(text)
cfb := cipher.NewCFBEncrypter(block, iv)
ciphertext := make([]byte, len(plaintext))
cfb.XORKeyStream(ciphertext, plaintext)
return encodeBase64(ciphertext)
}
func Decrypt(key, text string) string {
block, err := aes.NewCipher([]byte(key))
if err != nil { panic(err) }
ciphertext := decodeBase64(text)
cfb := cipher.NewCFBEncrypter(block, iv)
plaintext := make([]byte, len(ciphertext))
cfb.XORKeyStream(plaintext, ciphertext)
}
有人向我提到我可能需要填充字符串,但我必须填充流密码似乎很奇怪。
以下是此错误的示例: http ://play.golang.org/p/4FQBAeHgRs
原文由 jawr 发布,翻译遵循 CC BY-SA 4.0 许可协议
这是基于 NewCFBEncrypter / NewCFBDecrypter examples 并且似乎可以满足您的要求:
编辑:根据 Kluyg 关于 IV 创建的评论,我修改了示例代码以使用从密文创建 IV 的推荐方法,与从密文创建 IV的 链接 示例相同的方法。 (在生产代码中,IV 应该每次单独生成。感谢 RoundSparrow hilltx 指出这一点。)
我认为您遇到的问题是由于密钥长度无效,但我不是 100% 确定。
生产:
操场
希望这有助于查明问题所在。