Go AES CFB 兼容性

我正在开发一个依赖于 AES CFB 的 Go 客户端应用程序。服务器端是用 C 编写的。我的问题是 Go 的 AES CFB 实现似乎与许多其他实现(包括 OpenSSL)不同。我写这个是为了测试我的理论:-


package main


import (

  "fmt"

  "encoding/hex"

  "crypto/cipher"

  "crypto/aes"

)


func encrypt_aes_cfb(plain, key, iv []byte) (encrypted []byte) {

  block, err := aes.NewCipher(key)

  if err != nil {

    panic(err)

  }

  encrypted = make([]byte, len(plain))

  stream := cipher.NewCFBEncrypter(block, iv)

  stream.XORKeyStream(encrypted, plain)

  return

}


func decrypt_aes_cfb(encrypted, key, iv []byte) (plain []byte) {

  block, err := aes.NewCipher(key)

  if err != nil {

    panic(err)

  }

  plain = make([]byte, len(encrypted))

  stream := cipher.NewCFBDecrypter(block, iv)

  stream.XORKeyStream(plain, encrypted)

  return

}


func main() {

  plain := []byte("Hello world.....")

  key := []byte("01234567890123456789012345678901")

  iv := []byte("0123456789012345")

  enc := encrypt_aes_cfb(plain, key, iv)

  dec := decrypt_aes_cfb(enc, key, iv)

  fmt.Println("Key: ", hex.EncodeToString(key))

  fmt.Println("IV:  ", hex.EncodeToString(iv))

  fmt.Println("Enc: ", hex.EncodeToString(enc))

  fmt.Println("In:  ", hex.EncodeToString(plain))

  fmt.Println("Out: ", hex.EncodeToString(dec))

}

当它运行时,它似乎工作得很好,但是,如果将加密的字节粘贴到另一个 AES 实现中并使用相同的密钥和 IV 解密,则明文会损坏(第一个字节除外)。 http://aes.online-domain-tools.com/提供了一种简单的测试方法。任何建议为什么会发生这种情况以及我如何解决它?


HUX布斯
浏览 254回答 2
2回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go