golang 创建随机密钥字符串

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang 创建随机密钥字符串相关的知识,希望对你有一定的参考价值。

import (
	"crypto/rand"
)

func NewRandomKey() []byte {
	key := make([]byte, 32)
	if _, err := rand.Read(key); err != nil {
		// really, what are you gonna do if randomness failed?
		panic(err)
	}

	return key
}

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 使用Golang生成随机字符串

golang笔记-区块链密码学01

golang 在Golang中生成给定长度的随机字符串

golang [用转到快速产生一个随机字符串]

golang 生成随机数

如果我用随机密钥加密字符串,如何解密它