【问题标题】:CrytoJs.AES encrypt/decrypt in golang [closed]CryptoJs.AES在golang中加密/解密[关闭]
【发布时间】:2021-04-26 16:13:47
【问题描述】:
var CryptoJS = require("crypto-js");
 
var data = [{id: 1}, {id: 2}]
 
// Encrypt
var ciphertext = CryptoJS.AES.encrypt(JSON.stringify(data), 'secret key 123').toString();
 
// Decrypt
var bytes  = CryptoJS.AES.decrypt(ciphertext, 'secret key 123');
var decryptedData = JSON.parse(bytes.toString(CryptoJS.enc.Utf8));
 
console.log(decryptedData); // [{id: 1}, {id: 2}]

如何在兼容 CryptoJS.AES 的 Golang 中加密/解密?

【问题讨论】:

标签: go encryption aes cryptojs


【解决方案1】:

加密策略的设计通常与平台无关。您看到的加密 AES 加密是在 JS 中实现 AES Encryption。 Go 在加密包下提供它。 Go 的文档是开始寻找 crypto 代码的好地方。

为了加快速度,这里有一个例子:
加密:

func encrypt(key []byte, text []byte) []byte {
    c, _ := aes.NewCipher(key)
    gcm, _ := cipher.NewGCM(c)

    nonce := make([]byte, gcm.NonceSize())
    if _, err := io.ReadFull(rand.Reader, nonce); err != nil {
        panic(err.Error())
    }

    result := gcm.Seal(nonce, nonce, text, nil)

    return result
}

解密:

func decrypt(key []byte, ciphertext []byte) string {
    c, _ := aes.NewCipher(key)
    gcm, _ := cipher.NewGCM(c)

    nonceSize := gcm.NonceSize()
    if len(ciphertext) < nonceSize {
        panic("ciphertext size is less than nonceSize")
    }

    nonce, ciphertext := ciphertext[:nonceSize], ciphertext[nonceSize:]
    plaintext, _ := gcm.Open(nil, nonce, ciphertext, nil)

    return string(plaintext)
}

用法:

func main() {
    text := []byte("TEXT TO ENCRYPT AND DECRYPT")

    key := []byte("5v8y/B?E(G+KbPeShVmYq3t6w9z$C&12")

    secret := encrypt(key, text)
    plainString := decrypt(key, secret)

    fmt.Println(plainString)
}

操场上的工作示例here
注意:请确保根据需要处理错误

【讨论】:

  • CryptoJS 代码隐式使用 CBC 和 OpenSSL 密钥派生函数 (KDF) EVP_BytesToKey()。您的代码中都没有考虑(尽管 GCM 是 CBC 的更安全的替代方案)。如果 OP 需要真正兼容的代码,尤其是 KDF 可能是这里更大的挑战。
  • 感谢您的见解。我只是指出加密与任何平台都无关。而且我总是试图在这里提供指导而不是提供生产能力的答案。
  • 唯一有效的代码是github.com/Luzifer/go-openssl,它可以解密来自crypto-js的加密数据。但是如果从go端加密的数据,crypto-js端是无法解密的。
  • 请参阅@Topaco 在评论中所说的内容。这可能会有所帮助,因为您想在双方都处理加密/解密。但我想知道你为什么需要这样的解决方案。
猜你喜欢
  • 2011-09-29
  • 1970-01-01
  • 2016-10-14
  • 2018-12-23
  • 2019-08-13
  • 1970-01-01
  • 2021-12-07
  • 2018-06-05
  • 2012-01-13
相关资源
最近更新 更多