首页 > 解决方案 > 跨平台 AES CryptLib

问题描述

我正在尝试在 js 中转换 Crypt Lib的逻辑我有现有的 android 应用程序并且 API 是 c 语言,我想转换加密和解密逻辑。

我尝试了多种变体,您可以检查代码:尝试过的代码

我有一个要解密的示例数据,数据是:

{"Data":"bvtkHfZiTsY0CX6QmHhCboBwXeY9RZVPpdhhdIy6aSwCTVI7YiEGha1aXTIKY4BocGdNIbWkreQHZcTk4WE6F2tQLoVyWERYCGZotbDzxxs=","IV":"Vmr-uU5mA2_Zr_13"}

在这里,我在 Data 和 IV 中有加密数据,所以当我尝试解密这些数据时,我找不到任何解决方案。所有的加密和解密功能都在 csharp 和 android 代码中。但我想在 golang 中转换相同的逻辑。

Node中的逻辑

我试过这段代码:

    iv := []byte("Vmr-uU5mA2_Zr_13")
    key := []byte("<Secret_Key")

    text := []byte("bvtkHfZiTsY0CX6QmHhCboBwXeY9RZVPpdhhdIy6aSwCTVI7YiEGha1aXTIKY4BocGdNIbWkreQHZcTk4WE6F2tQLoVyWERYCGZotbDzxxs=")

    cipherBlock, err := aes.NewCipher(key)
    if err != nil {
        log.Fatal(err)
    }

    cipher.NewCBCDecrypter(cipherBlock, iv).CryptBlocks(text, text)
    fmt.Println(string(text))

代码的完整链接,我收到错误:

crypto/aes: invalid key size 64

标签: goencryption

解决方案


看起来您需要将您的keytext字符串正确解码为字节切片,而不仅仅是转换它们。下面的代码有效,虽然我不确定解码后的消息应该是什么样子......

package main

import (
    "encoding/hex"
    "encoding/base64"
    "crypto/cipher"
    "crypto/sha256"
    "crypto/aes"
)

func main() {
    iv := "Vmr-uU5mA2_Zr_13"
    key := "<Secret_Key>"
    ciphertext := "bvtkHfZiTsY0CX6QmHhCboBwXeY9RZVPpdhhdIy6aSwCTVI7YiEGha1aXTIKY4BocGdNIbWkreQHZcTk4WE6F2tQLoVyWERYCGZotbDzxxs="
    
    hash := sha256.Sum256([]byte(key))
    key = hex.EncodeToString(hash[:])[:32]
    
    btext, err := base64.StdEncoding.DecodeString(ciphertext)
    if err != nil {
        println("Error decoding cipertext: ", err.Error())
        return
    }

    aesCipher, err := aes.NewCipher([]byte(key))
    if err != nil {
        println("Error creating cipher: ", err.Error())
        return
    }

    cipher.NewCBCDecrypter(aesCipher, []byte(iv)).
        CryptBlocks(btext, btext)
    
    println("Result: ", string(btext))
}

推荐阅读