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

Posted

技术标签:

【中文标题】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:如何使用 DES 和 CBC 加密 5 个字符长的纯文本?的主要内容,如果未能解决你的问题,请参考以下文章

DES--------Golang对称加密之模式问题实战

如何在 Ruby 中使用('DES/CBC/PKCS5Padding'模式)实现 DES 加密?

如何使用 DES 实现 CBC-MAC?

openssl 中调用哪个函数实现16字节des密钥cbc方式加密数据?

go加密算法:CBC对称加密--3DES/AES

OC的DES加密,使与java的Cipher类用DES/CBC/PKCS5Padding方式的加密结果同样