首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Go中正确编写JVM AES/CFB8 8加密

如何在Go中正确编写JVM AES/CFB8 8加密
EN

Stack Overflow用户
提问于 2019-08-17 22:27:50
回答 1查看 609关注 0票数 2

我用Kotlin编写了一个小测试,使用密码实例加密一些文本"Hello“,其算法为”AES/CFB8 8/NoPadding“。(我的经验之谈)

我现在正试图在Go中做同样的事情,但是我无法产生同样的结果。我尝试过的所有不同的方法总是产生不同的东西。

为了达到这个目的,下面是我已经看过的线程/示例。

  1. How to use rsa key pair for AES encryption and decryprion in golang
  2. https://play.golang.org/p/77fRvrDa4A
  3. Decrypt in Golang what was encrypted in Python AES CFB
  4. https://gist.github.com/temoto/5052503
  5. AES Encryption in Golang and Decryption in Java
  6. Different Results in Go and Pycrypto when using AES-CFB

Kotlin代码:

代码语言:javascript
复制
enum class Mode(val mode: Int)
{

    ENCRYPT(Cipher.ENCRYPT_MODE),
    DECRYPT(Cipher.DECRYPT_MODE),
}

fun createSecret(data: String): SecretKey
{
    return SecretKeySpec(data.toByteArray(), "AES")
}

fun newCipher(mode: Mode): Cipher
{
    val secret = createSecret("qwdhyte62kjneThg")
    val cipher = Cipher.getInstance("AES/CFB8/NoPadding")
    cipher.init(mode.mode, secret, IvParameterSpec(secret.encoded))

    return cipher
}

fun runCipher(data: ByteArray, cipher: Cipher): ByteArray
{
    val output = ByteArray(data.size)

    cipher.update(data, 0, data.size, output)

    return output
}


fun main()
{
    val encrypter = newCipher(Mode.ENCRYPT)
    val decrypter = newCipher(Mode.DECRYPT)

    val iText = "Hello"
    val eText = runCipher(iText.toByteArray(), encrypter)
    val dText = runCipher(eText, decrypter)
    val oText = String(dText)


    println(iText)
    println(Arrays.toString(eText))
    println(Arrays.toString(dText))
    println(oText)
}

Go代码:

代码语言:javascript
复制
func TestCipher(t *testing.T) {

    secret := newSecret("qwdhyte62kjneThg")

    encrypter := newCipher(secret, ENCRYPT)
    decrypter := newCipher(secret, DECRYPT)

    iText := "Hello"
    eText := encrypter.run([]byte(iText))
    dText := decrypter.run(eText)
    oText := string(dText)

    fmt.Printf("%s\n%v\n%v\n%s\n", iText, eText, dText, oText)
}

type Mode int

const (
    ENCRYPT Mode = iota
    DECRYPT
)

type secret struct {
    Data []byte
}

type cipherInst struct {
    Data cipher2.Block
    Make cipher2.Stream
}

func newSecret(text string) *secret {
    return &secret{Data: []byte(text)}
}

func newCipher(data *secret, mode Mode) *cipherInst {
    cip, err := aes.NewCipher(data.Data)
    if err != nil {
        panic(err)
    }

    var stream cipher2.Stream

    if mode == ENCRYPT {
        stream = cipher2.NewCFBEncrypter(cip, data.Data)
    } else {
        stream = cipher2.NewCFBDecrypter(cip, data.Data)
    }

    return &cipherInst{Data: cip, Make: stream}
}

func (cipher *cipherInst) run(dataI []byte) []byte {

    out := make([]byte, len(dataI))
    cipher.Make.XORKeyStream(out, dataI)

    return out
}

Kotlin代码生成输出:

代码语言:javascript
复制
Hello
[68, -97, 26, -50, 126]
[72, 101, 108, 108, 111]
Hello

但是,Go代码生成输出:

代码语言:javascript
复制
Hello
[68 97 242 158 187]
[72 101 108 108 111]
Hello

在这一点上,这个问题已经在很大程度上停止了我正在研究的项目的进展。任何关于我错过了什么或者做错了什么的信息都会有帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-15 01:31:06

解决方案是手动实现CFB8,因为内置实现默认为CFB128。

由克斯特亚创建并由Ilmari (here)修复的实现。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57540370

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档