golang GoLang使用AES加密将字符串加密到base64,反之亦然。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang GoLang使用AES加密将字符串加密到base64,反之亦然。相关的知识,希望对你有一定的参考价值。

package main

import (
	"crypto/aes"
	"crypto/cipher"
	"crypto/rand"
	"encoding/base64"
	"fmt"
	"io"
)

func main() {
	originalText := "encrypt this golang"
	fmt.Println(originalText)

	key := []byte("example key 1234")

	// encrypt value to base64
	cryptoText := encrypt(key, originalText)
	fmt.Println(cryptoText)

	// encrypt base64 crypto to original value
	text := decrypt(key, cryptoText)
	fmt.Printf(text)
}

// encrypt string to base64 crypto using AES
func encrypt(key []byte, text string) string {
	// key := []byte(keyText)
	plaintext := []byte(text)

	block, err := aes.NewCipher(key)
	if err != nil {
		panic(err)
	}

	// The IV needs to be unique, but not secure. Therefore it's common to
	// include it at the beginning of the ciphertext.
	ciphertext := make([]byte, aes.BlockSize+len(plaintext))
	iv := ciphertext[:aes.BlockSize]
	if _, err := io.ReadFull(rand.Reader, iv); err != nil {
		panic(err)
	}

	stream := cipher.NewCFBEncrypter(block, iv)
	stream.XORKeyStream(ciphertext[aes.BlockSize:], plaintext)

	// convert to base64
	return base64.URLEncoding.EncodeToString(ciphertext)
}

// decrypt from base64 to decrypted string
func decrypt(key []byte, cryptoText string) string {
	ciphertext, _ := base64.URLEncoding.DecodeString(cryptoText)

	block, err := aes.NewCipher(key)
	if err != nil {
		panic(err)
	}

	// The IV needs to be unique, but not secure. Therefore it's common to
	// include it at the beginning of the ciphertext.
	if len(ciphertext) < aes.BlockSize {
		panic("ciphertext too short")
	}
	iv := ciphertext[:aes.BlockSize]
	ciphertext = ciphertext[aes.BlockSize:]

	stream := cipher.NewCFBDecrypter(block, iv)

	// XORKeyStream can work in-place if the two arguments are the same.
	stream.XORKeyStream(ciphertext, ciphertext)

	return fmt.Sprintf("%s", ciphertext)
}

Golang:如何使用 DES 和 CBC 加密 5 个字符长的纯文本?

【中文标题】Golang:如何使用 DES 和 CBC 加密 5 个字符长的纯文本?【英文标题】:Golang: How do I encrypt plain text that is 5 characters long with DES and CBC? 【发布时间】:2017-01-05 17:11:51 【问题描述】:

目前正在尝试将 5 个字符长的纯文本加密为 12 个字符的加密字符串。我希望能够指定唯一的 IV(不是随机生成的)、唯一的密钥并使用 DES。我当前的code 要求明文长度为 8 个字符(5 个字符名称加 3 个空格)。

【问题讨论】:

您或许可以使用 PKCS7 填充:play.golang.org/p/SpEUHSMR9e play.golang.org/p/wBF8iYBbeV @ralph 提出了一个很好的解决方案。 DES 适用于 64 位块,因此需要填充。 PKCS7 是一种解决方案。它将值为 n 的 n 个字节添加到明文的末尾,其中 n 是所需的填充量。如果你的数据正好是块大小,它需要一个额外的完整块来填充。 @ralph 也许你应该用那个+简短的解释来回答。 这是我发现的一些实现 pad 和 unpad 的代码:github.com/go-web/tokenizer/blob/master/pkcs7.go 【参考方案1】:

我已经遇到过这个问题。这是因为填充问题。你想要的代码是一个

Code link你可以在 go playground 测试一下。

  package main

  import (
    "crypto/cipher"
    "crypto/des"
    "encoding/base64"
    "fmt"
    "bytes"
  )

  func main() 
    originalText := "yolan"
    fmt.Println(originalText)

    key := []byte0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC

    // encrypt value to base64
    cryptoText := encrypt(key, originalText)
    fmt.Println(cryptoText)

  

  // encrypt string to base64 crypto using des
  func encrypt(key []byte, text string) string 
    plaintext := []byte(text)

    block, err := des.NewCipher(key)
    if err != nil 
        panic(err)
    

    iv := []byte0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC

    blockSize := block.BlockSize()
    origData := PKCS5Padding(plaintext, blockSize)
    blockMode := cipher.NewCBCEncrypter(block, iv)
    cryted := make([]byte, len(origData))
    blockMode.CryptBlocks(cryted, origData)

    return base64.URLEncoding.EncodeToString(cryted)
  

  func PKCS5Padding(src []byte, blockSize int) []byte 
    padding := blockSize - len(src)%blockSize
    padtext := bytes.Repeat([]bytebyte(padding), padding)
    return append(src, padtext...)
  

  func PKCS5UnPadding(src []byte) []byte 
    length := len(src)
    unpadding := int(src[length-1])
    return src[:(length - unpadding)]
  

【讨论】:

以上是关于golang GoLang使用AES加密将字符串加密到base64,反之亦然。的主要内容,如果未能解决你的问题,请参考以下文章

golang GoLang使用AES加密将字符串加密到base64,反之亦然。

golang 在golang中使用AES256 GCM加密文本

golang:AES加密解密

Golang里的AES加密解密

非对称加密的RSA算法如何通过golang来实现?

golang 加密解密