gpt4 book ai didi

javascript - Dart "encrypt"库在加密后给出不可读的字符串

转载 作者:行者123 更新时间:2023-12-04 07:14:37 29 4
gpt4 key购买 nike

我正在从 React Native 转向 Flutter/Dart。
我有来自 React Native 的 typescript 的以下代码片段:

import CryptoJS from 'crypto-js';

export const decryptSessionKey = (randomKey: string, cipher: string) => {
const iv = randomKey ? randomKey.slice(0, 16) : '';
const decrypted = CryptoJS.AES.decrypt(
cipher,
CryptoJS.enc.Utf8.parse(randomKey),
{
iv: CryptoJS.enc.Utf8.parse(iv),
mode: CryptoJS.mode.CTR,
padding: CryptoJS.pad.NoPadding,
},
);
return decrypted.toString(CryptoJS.enc.Utf8);
};
我将这些代码移到 flutter/dart 中:
import 'dart:math';
import 'package:encrypt/encrypt.dart';

String decryptSessionKey(String randomKey, String cipher) {
final encrypter = Encrypter(AES(Key.fromUtf8(randomKey), mode: AESMode.ctr, padding: null));
var iv = randomKey.substring(0, 16);
final decrypted =
encrypter.decrypt(Encrypted.fromUtf8(cipher), iv: IV.fromUtf8(iv));
return decrypted.toString();
}
给定随 secret 钥为 0QaOUmxpugtnRUTZ6yOSxQeZq47Akiqf , 密码为 piMgUF2ISUl/g7ns2/gZyaWQm6Rdv7x500GD7lMLYxhy14Tg+Bizibvz .我会在 Typescript 中解密为 54387c3b38150d2a7a1c545167736e701629382648 .
但是,在 Flutter 中,我得到了一个不可读的字符串,例如 ��ʋ�ͻh�0�M��R�Z���YInCXTI*��!�\��-S�f��/�SU��'有什么我想念的吗?先感谢您!

最佳答案

在 Dart 代码中,密文必须是 Base64 解码而不是 UTF8 编码:

final decrypted = encrypter.decrypt(Encrypted.from64(cipher), iv: IV.fromUtf8(iv)); // fromBase64() works also
这在 JavaScript 代码中不是必需的,其中 CryptoJS.AES.decrypt()将 Base64 编码的密文隐式转换为 CipherParams目的。
如果这是固定的,解密工作!
请注意以下漏洞:在两个代码中,32 字节 key 的前 16 字节也用作 IV。如果多次应用相同的 key ,这将自动导致 key /IV 对的重复。特别是对于 CRT,这是不安全的,参见 Why must IV/key-pairs not be reused in CTR mode?
通常为每个加密生成一个随机 IV。 IV 不是 secret 的,它与密文一起发送(通常是串联的)。在解密方面,IV 被剥离并用于解密。

关于javascript - Dart "encrypt"库在加密后给出不可读的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68849820/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com