跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • Aes 加密 CBC 模式的 Nopadding 填充在 GO 里怎么实现啊
未分類
3 10 月 2020

Aes 加密 CBC 模式的 Nopadding 填充在 GO 里怎么实现啊

Aes 加密 CBC 模式的 Nopadding 填充在 GO 里怎么实现啊

資深大佬 : chengxiao 6

对接某商户系,被这个签名搞的头大,这个 NoPadding 似乎是个 java 里的方法,没查到相关信息

业务参数加密步骤:
1 )将业务参数转换成 json 格式字符串

2 )用 AES 算法加密,秘钥为 appSecret 重复两遍,偏移量为 appSecret 重复两遍(16 位秘钥不用重复),加密模式 CBC,填充模式; NoPadding

3 )加密后字符即为公共参数 requestBody 的值

业务参数示例:
{
“number”:”123″,
“string”:”测试”,
“double”:1.0,
“boolean”:true
}

开发者秘钥为:12345678

AES 加密结果:
Vq2Kj4Z8C+hFf7VdFPbCoY3LmJgf2LM7B2a3klFxGWMlL1BAxx7v/ZZdkxqdMPXqRPjy3k0tVKgx
KMTTAlbE0PGhp2LtqzouDWZaH1g9ttQ=

大佬有話說 (9)

  • 資深大佬 : kingiis

    公用 c 库可能会好点

  • 資深大佬 : songjiaxin2008

    可以参考一下这个实现 https://github.com/wumansgy/goEncrypt 引用的包都是标准库的

  • 資深大佬 : songjiaxin2008

    NoPadding = ZeroPadding

  • 資深大佬 : songjiaxin2008

    Aes 加密 CBC 模式的 Nopadding 填充在 GO 里怎么实现啊 网页上跑了下应该没啥问题

  • 資深大佬 : geelaw

    为了数据安全最好还是不要对接这个系统,使用非伪随机的密钥以及使用密钥相关的 IV,都会破坏 AES 所有的安全保证。

  • 資深大佬 : teawithlife

    其实就是后面补 0x00
    play.golang.org/p/MxstiahPDa3

  • 資深大佬 : dafsic

    我对接过,跟 java 版本有关,问问 java 是什么版本,最好要到加密部分的 java 代码看看

  • 資深大佬 : TypeErrorNone

    之前写的,可以参考下

    “`
    package xaes

    import (
    “bytes”
    “crypto/aes”
    “crypto/cipher”
    “crypto/rand”
    “crypto/sha256”
    “encoding/base64”
    “github.com/pkg/errors”
    )

    type Aes struct {
    key []byte
    }

    func NewAes(key string) (*Aes) {
    if key == “” {
    panic(“aes key empty”)
    }
    sum := sha256.Sum256([]byte(key))
    return &Aes{
    key:sum[:],
    }
    }

    func (a *Aes) Encrypt(encodeBytes []byte) (val string, err error) {
    block, err := aes.NewCipher(a.key)
    if err != nil {
    return
    }
    blockSize := block.BlockSize()
    encodeBytes = a.pkCS5Padding(encodeBytes, blockSize)

    iv := make([]byte, blockSize)
    _,err = rand.Read(iv)
    if err != nil {
    return
    }

    blockMode := cipher.NewCBCEncrypter(block, iv)
    crypted := make([]byte, len(encodeBytes))
    blockMode.CryptBlocks(crypted, encodeBytes)

    iv = append(iv,crypted…)
    val = base64.StdEncoding.EncodeToString(iv)
    return
    }

    func (a *Aes) pkCS5Padding(ciphertext []byte, blockSize int) []byte {
    padding := blockSize – len(ciphertext)%blockSize
    padtext := bytes.Repeat([]byte{byte(padding)}, padding)
    return append(ciphertext, padtext…)
    }

    func (a *Aes) Decrypt(decodeStr string) (origData []byte,err error) {
    decodeBytes, err := base64.StdEncoding.DecodeString(decodeStr)
    if err != nil {
    return
    }
    block, err := aes.NewCipher(a.key)
    if err != nil {
    return nil, err
    }
    if len(decodeBytes) < block.BlockSize() {
    err = errors.New(“decodeBytes 长度不足”)
    return
    }
    iv := decodeBytes[:block.BlockSize()]
    decodeBytes = decodeBytes[block.BlockSize():]

    blockMode := cipher.NewCBCDecrypter(block, iv)
    origData = make([]byte, len(decodeBytes))
    blockMode.CryptBlocks(origData, decodeBytes)
    origData = a.pkCS5UnPadding(origData)
    return
    }

    func (a *Aes) pkCS5UnPadding(origData []byte) []byte {
    length := len(origData)
    unpadding := int(origData[length-1])
    return origData[:(length – unpadding)]
    }
    “`

  • 主 資深大佬 : chengxiao

    @TypeErrorNone
    @teawithlife
    @songjiaxin2008
    谢谢几位老哥 就是被这个 NoPadding 怎么补位搞蒙了 原来 ZeroPadding 就可以

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具