Golang和Flutter之间的AES加解密

b4lqfgs4  于 2022-12-07  发布在  Go
关注(0)|答案(1)|浏览(403)

我有一个golang代码,它可以对给定的数据进行AES加密,并为它服务。
“地下室,开始"

func encrypt(key []byte, text string) string {

    plaintext := []byte(text)

    block, err := aes.NewCipher(key)
    if err != nil {
        panic(err)
    }

    ciphertext := make([]byte, aes.BlockSize+len(plaintext))
    iv := ciphertext[:aes.BlockSize]
    if _, err := io.ReadFull(rand.Reader, iv); err != nil {
        panic(err)
    }

    stream := cipher.NewCFBEncrypter(block, iv)
    stream.XORKeyStream(ciphertext[aes.BlockSize:], plaintext)

    return base64.URLEncoding.EncodeToString(ciphertext)
}

func decrypt(key []byte, cryptoText string) string {
    ciphertext, _ := base64.URLEncoding.DecodeString(cryptoText)

    block, err := aes.NewCipher(key)
    if err != nil {
        panic(err)
    }

    if len(ciphertext) < aes.BlockSize {
        panic("ciphertext too short")
    }
    iv := ciphertext[:aes.BlockSize]
    ciphertext = ciphertext[aes.BlockSize:]

    stream := cipher.NewCFBDecrypter(block, iv)
    stream.XORKeyStream(ciphertext, ciphertext)

    return string(ciphertext)
}

我需要在Flutter中处理相同的解密和加密。我尝试了下面的代码使用flutter加密包。

地穴镖

import 'package:encrypt/encrypt.dart';
String encryption(String plainText) {
     
     final key = Key.fromBase64(ENCRYPTION_KEY);
     final iv = IV.fromBase64(ENCRYPTION_IV);

     final encrypter = Encrypter(AES(key, mode: AESMode.cfb64, padding: null));
     final encrypted = encrypter.encrypt(plainText, iv: iv);

 return encrypted.base64;   
}

String decryption(String plainText) {

   final key = Key.fromBase64(ENCRYPTION_KEY);
   final iv = IV.fromBase64(ENCRYPTION_IV);

   final encrypter = Encrypter(AES(key, mode: AESMode.cfb64, padding: null));
   final decrypted = encrypter.decrypt(Encrypted.from64(plainText), iv: iv);

  return decrypted;   
 }

但我得到错误,并没有工作。我错过了什么?这是如何才能实现Flutter结束。
先谢了

mrphzbgm

mrphzbgm1#

乍一看,你的iv(初始化向量)似乎不匹配,在Go语言中加密时,你随机生成它,并将它“放在”加密文本的前面,这很好,在Go语言中解密时,你从那里取它。
在Dart中(我还不太习惯这种语言),就好像你从ENCRYPTION_IV中取一个静态iv,这个iv与Go语言中随机生成的iv不匹配。
假设iv是某种谱号。它解释了如何处理加密的密钥。通常它不是秘密的,但应该是随机的。因此,用适当的随机数发生器生成它并告诉加密文本的接收者它是好的。一种常见的方法是把它放在它的前面-因为它的大小在AES中是固定的aes.BlockSize(16字节),可以清楚地看到IV的结束位置和真实的加密文本的开始位置。
所以,在Dart中,你应该读取前16个字节,从Go语言加密的密文中得到iv。同时,我建议你在Dart加密方法中也使用随机iv。

相关问题