为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 AES-256 加密特殊字符或数字?

如何使用 AES-256 加密特殊字符或数字?

Go
繁花如伊 2022-09-05 09:45:33
我想使用 AES-256 在 Go 中加密字符串,无需任何 GCM 处理,以与 MQL4 进行比较。当我尝试加密特殊字符或数字时遇到问题。我应该以某种方式预处理我的明文吗?我是Go的新手,所以任何帮助将不胜感激;我的代码在这个解释下面。如果我加密明文“这是一个秘密”,然后解密密文(编码为十六进制),我得到相同的结果(即“这是一个秘密”)。pt 是以下代码中明文的变量名称。如果我试图加密“这是一个秘密;1234“,密文末尾有一组零,当我解密时,我只得到”这是一个秘密”。MQL4 中的类似密文末尾没有零,并且可以正确解密。如果我尝试仅加密“1234”,则会出现构建错误,源于“crypto/aes.(*aesCipherAsm).Encrypt(0xc0000c43c0, 0xc0000ac058, 0x4, 0x4, 0xc0000ac070, 0x4, 0x8) C:/Program Files/Go/src/crypto/aes/cipher_asm.go:60 +0x125”这是我的代码:    package main    import (        "crypto/aes"        "encoding/hex"        "fmt"    )    func main() {        // cipher key        key := "thisis32bitlongpassphraseimusing"        // plaintext        pt := "This is a secret"        //  pt := "This is a secret; 1234" // zeroes in ciphertext        //  pt := "1234" // doesn't build        c := EncryptAES([]byte(key), pt)        // plaintext        fmt.Println(pt)        // ciphertext        fmt.Println(c)        // decrypt        DecryptAES([]byte(key), c)    }    func EncryptAES(key []byte, plaintext string) string {        c, err := aes.NewCipher(key)        CheckError(err)        out := make([]byte, len(plaintext))        c.Encrypt(out, []byte(plaintext))        return hex.EncodeToString(out)    }    func DecryptAES(key []byte, ct string) {              ciphertext, _ := hex.DecodeString(ct)        c, err := aes.NewCipher(key)        CheckError(err)        pt := make([]byte, len(ciphertext))        c.Decrypt(pt, ciphertext)        s := string(pt[:])        fmt.Println("DECRYPTED:", s)    }    func CheckError(err error) {        if err != nil {            panic(err)        }    }
查看完整描述

2 回答

?
开满天机

TA贡献1786条经验 获得超13个赞

MQL4 仅支持非常具体的 AES 加密实现,除非您在其他代码中使用正确的设置,否则您将无法实现两个平台之间的兼容性。

具体而言,您需要确保实现以下内容:

  • 填充模式:零

  • 密码模式:欧洲央行(所以没有IV)

  • 密钥大小:256

  • 块大小: 128

在 MQL4 中,您还需要记住,加密/解密是一个两阶段的过程(到 AES256 再到 BASE64)。

您可以尝试使用在线AES加密/解密工具来验证此处提供的结果:在线工具箱


查看完整回答
反对 回复 2022-09-05
?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

您正在此处创建原始 AES 加密器。AES只能精确加密16字节的明文,产生16字节的密文。您的第一个示例正好是 16 个字节长,因此它按预期工作。您的第二个示例太长。只有前 16 个字节正在加密。第三个例子太短,你可能会遇到未初始化的内存。"This is a secret"

文本中的特定字符无关紧要。加密是在原始字节上执行的,而不是对字母执行的。

为了加密更大(或更小)的文本块,您需要在AES之上使用块密码模式。常见的模式是GCM,CBC和CTR,但还有很多其他模式。在大多数情况下,当有人说“AES”时,没有任何限定词,他们的意思是AES-CBC。(GCM正变得越来越流行,这是一个很棒的模式,但它还没有那么受欢迎,以至于它还没有被假设。

我对 MQL4 一无所知,但我假设您正在尝试重新实现 CryptEncode?我没有看到任何关于他们如何进行加密的文档。您需要知道他们使用什么模式,他们如何派生他们的密钥,他们如何生成(并可能编码)他们的IV,他们是否包括HMAC或其他身份验证,等等。您需要确切地知道他们如何实现他们所说的“CRYPT_AES256”的含义。对此没有一个标准的答案。


查看完整回答
反对 回复 2022-09-05
  • 2 回答
  • 0 关注
  • 286 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信