3 回答
TA贡献1883条经验 获得超3个赞
最短的答案可能是:正如@GradyPlayer 所建议的,您使用密码的方式有误。您必须将其交给加密器,而不是将其应用于所有字节。模式看起来像这样:
ciphertext = make([]byte, len(plaintext))
cbc := cipher.NewCBCEncrypter(cipher, iv)
cbc.CryptBlocks(ciphertext, plaintext)
也就是说,在这里您仍然需要将初始化向量放在密文前面(至少这是通常放置它的地方,解密器可能希望它位于此处),您仍然需要考虑填充(如果你像我一样使用 CBC)。
因此,虽然它没有直接解决问题,但我认为它会帮助您获得更多代码以更好地理解。这是我刚刚创建的要点。免责声明:我主要是从其他地方组装代码片段。所以我只是把你在这里看到的碎片放在一起,并在路上获得了一些理解。
TA贡献1789条经验 获得超10个赞
根据以下评论进行编辑(以便正确使用随机数):
接受的答案,尤其是来自 Topaco 的评论,帮助我找到了这个解决方案,我在这里发布给可能遇到这个问题的任何人:
var key = make([]byte, 32)
func encryptToken(t token) string {
original := t.ID // ID is string member of token
var nonce = make([]byte, 12)
// read random bytes into nonce
_, err := rand.Read(nonce)
if err != nil {
log.Println("Error reading random bytes into nonce:", err)
}
block, err := aes.NewCipher(key)
if err != nil {
log.Println("Error creating cipher during encrypt:", err)
}
aesgcm, err := cipher.NewGCM(block)
if err != nil {
log.Println("Error creating GCM during encrypt:", err)
}
ciphertext := aesgcm.Seal(nil, nonce, []byte(original), nil)
// prepend the ciphertext with the nonce
out := append(nonce, ciphertext...)
return hex.EncodeToString(out)
}
func decryptToken(s string) string {
// read hex string describing nonce and ciphertext
enc, err := hex.DecodeString(s)
if err != nil {
log.Println("Error decoding string from hex:", err)
}
// separate ciphertext from nonce
nonce := enc[0:12]
ciphertext := enc[12:]
block, err := aes.NewCipher(key)
if err != nil {
log.Println("Error creating cipher during decrypt:", err)
}
aesgcm, err := cipher.NewGCM(block)
if err != nil {
log.Println("Error creating GCM during decrypt:", err)
}
original, err := aesgcm.Open(nil, nonce, ciphertext, nil)
if err != nil {
log.Println("Error decrypting to string:", err)
}
originalAsString := string(original)
return originalAsString
}
参考: https: //pkg.go.dev/crypto/cipher#example-NewGCM-Encrypt
- 3 回答
- 0 关注
- 162 浏览
添加回答
举报