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