go - 跨平台 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
解决方案
看起来您需要将您的key
和text
字符串正确解码为字节切片,而不仅仅是转换它们。下面的代码有效,虽然我不确定解码后的消息应该是什么样子......
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))
}
推荐阅读
- angular - 创建一个只从数据库读取数据(从不写入)的网站有哪些选择?
- linux - 使用 SED 命令将数字转换为它们的名称(1=一个等)
- linkedin - 通过 API 发布到 LinkedIn 的破碎视频 - 视频未在页面上播放,但链接有效
- reporting-services - 报告预览与部署时的 SSRS 小计不同
- java - 如何在 JSON 对象中发布此类数据
- wpf - 将 WPF UI 元素添加到 Winform 网格控制面板时如何解决 InvalidOperationException?
- android - 如何获得多个底部表,一个在另一个之上正常工作?
- javascript - 在 webpack config 中定义多个 babel 预设配置
- docker - Docker 服务没有响应
- python - NameError:未定义名称“命令”