解密不稳定,有时会得到密码:消息身份验证失败

时间:2019-10-24 08:15:42

标签: go encryption

我正在尝试为我的软件创建E2E加密,但是解密非常不稳定,有时可以成功解密,有时得到cipher: message authentication failed,这是我的加密和解密代码

func Encrypt(data []byte, passphrase string) ([]byte, error) {
    // create aes.NewCipher from hashed md5 passphrase
    block, _ := aes.NewCipher([]byte(createHash(passphrase)))
    //  NewGCM returns the given 128-bit, block cipher wrapped in
    // Galois Counter Mode with the standard nonce length.
    gcm, err := cipher.NewGCM(block)
    if err != nil {
        return nil, err
    }
    // initialize slice with length of nonce that must be passed to Seal and Open.
    nonce := make([]byte, gcm.NonceSize())
    if _, err = io.ReadFull(rand.Reader, nonce); err != nil {
        return nil, err
    }

    ciphertext := gcm.Seal(nonce, nonce, data, nil)
    return ciphertext, nil
}

func Decrypt(data []byte, passphrase string) ([]byte, error) {
    // create md5 byte slice
    key := []byte(createHash(passphrase))
    // just `reverse` algorithm with passphrase until return
    block, err := aes.NewCipher(key)
    if err != nil {
        return nil, err
    }
    gcm, err := cipher.NewGCM(block)
    if err != nil {
        return nil, err
    }
    nonceSize := gcm.NonceSize()
    nonce, ciphertext := data[:nonceSize], data[nonceSize:]
    plaintext, err := gcm.Open(nil, nonce, ciphertext, nil)
    if err != nil {
        return nil, err
    }
    return plaintext, nil
}

加密的二进制值通过http传输:

body, err := ioutil.ReadAll(resp.Body)
if err != nil {
    return nil, err
}

decrypt, err := Decrypt(body, r.Passphrase)

我已经尝试检查的内容,ioutil.ReadAll是否正确读取内容,或者解密器出现问题

1 个答案:

答案 0 :(得分:2)

对不起,问题不在于加密/解密,而是在用于传输芯片文本的http服务器中,并且现在已经解决了https://github.com/codenoid/GoTral-Server/commit/493c7f654753cae36f074c1c5f382953e227d295