首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将AES解密函数从Java转换为Flutter

将AES解密函数从Java转换为Flutter
EN

Stack Overflow用户
提问于 2022-07-11 22:15:33
回答 1查看 162关注 0票数 0

我一直试图将AES解密函数从Java转换为Dart

它使用AES with,IV和。不执行填充操作。

这是代码:

代码语言:javascript
运行
复制
    public byte[] Decrypt(byte[] Data, String Password) throws InvalidKeyException, InvalidAlgorithmParameterException, InvalidKeySpecException, NoSuchAlgorithmException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException {
        byte[] salt = new byte[8];
        byte[] iv = new byte[16];
        System.arraycopy(Data, 0, salt, 0, 8);
        System.arraycopy(Data, 8    , iv, 0, 16);
        SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
        KeySpec keySpec =
                new PBEKeySpec(Password.toCharArray(),salt, 1024, 128);
        SecretKey tmp = factory.generateSecret(keySpec);
        SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");
        Cipher d = Cipher.getInstance("AES/CBC/PKCS5Padding");
        d.init(Cipher.DECRYPT_MODE, secret, new IvParameterSpec(iv));
        byte[] t = new byte[Data.length - 24];
        System.arraycopy(Data, 24, t, 0, t.length);
        
        return d.doFinal(t);
    }

这是我的Dart的尝试:

代码语言:javascript
运行
复制
 static Uint8List? decrypt(String ciphertext, String password) {
    Uint8List rawCipher = base64.decode(ciphertext);
    var salt = rawCipher.sublist(0, 0 + 8);
    var iv = rawCipher.sublist(8, 8 + 16);
    var encrypted = rawCipher.sublist(8 + 16);

    Uint8List key = generateKey(password, salt);
    print('key => $key');
    CBCBlockCipher cipher = CBCBlockCipher(AESEngine());


    ParametersWithIV<KeyParameter> params =
    ParametersWithIV<KeyParameter>(KeyParameter(key), iv);
    PaddedBlockCipherParameters<ParametersWithIV<KeyParameter>, Null>
    paddingParams =
    PaddedBlockCipherParameters<ParametersWithIV<KeyParameter>, Null>(
        params, null);
    PaddedBlockCipherImpl paddingCipher =
    PaddedBlockCipherImpl(PKCS7Padding(), cipher);
    paddingCipher.init(false, paddingParams);

    var val = paddingCipher.process(encrypted);

    String res = String.fromCharCodes(val);

    print('res => $res');

    return val;
  }



  static Uint8List generateKey(String passphrase, Uint8List salt) {
    Uint8List passphraseInt8List = Uint8List.fromList(passphrase.codeUnits);

    KeyDerivator derivator = PBKDF2KeyDerivator(HMac(SHA1Digest(), 32));
    Pbkdf2Parameters params = Pbkdf2Parameters(salt, 1024, 16);
    derivator.init(params);
    return derivator.process(passphraseInt8List);
  }

base64加密字符串

代码语言:javascript
运行
复制
7MT6+nT/grYuh6vAwMGtt/2YXddNbdPY2uijM3HrHQ4q5Iv8Q8zm2emMuuXtaMdHHDId23hNYdrs
rhK2pUXfvRE7S/evuQa2UwjV9PsSMicSFxT8LZgOYsjL73zGuUGGhCTqk3NwtXGSzNsPMMAMsjOO
bbrl5N42TAouLvsaOmiMqjDYPItE3l0GfVYtdIf3vDN5hc7wUDI0Kq4WuXLDaSEK1IyO90KY4+LC
fc/9hwRv1iW96UK71wEYeWL1UV6ij3ACRNTR4uM=

密码

代码语言:javascript
运行
复制
fafafafa

Dart代码产生一个异常:

代码语言:javascript
运行
复制
Unhandled exception:
Invalid argument(s): Invalid or corrupted pad block

,我怀疑这是因为在Dart代码中,我使用了PKCS7Padding,而在代码中没有对数据执行填充。

我有点迷茫,在使用salt时,我无法找到一种处理数据的方法。

如果我跳过PaddedBlockCipherImpl和普通调用

代码语言:javascript
运行
复制
  CBCBlockCipher cipher = CBCBlockCipher(AESEngine());


    ParametersWithIV<KeyParameter> params =
    ParametersWithIV<KeyParameter>(KeyParameter(key), iv);

    cipher.init(false, params);


    var val = cipher.process(encrypted);
    String res = String.fromCharCodes(val);

    print('res => $res');

我得到了垃圾值。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-12 00:27:58

您在HMAC中使用了错误的块大小--应该是64字节。将generateKey更改为:

代码语言:javascript
运行
复制
Uint8List generateKey(String passphrase, Uint8List salt) {
  final derivator = PBKDF2KeyDerivator(HMac(SHA1Digest(), 64))
    ..init(Pbkdf2Parameters(salt, 1024, 16));
  return derivator.process(utf8.encode(passphrase) as Uint8List);
}

用这样的几行代码创建密码就更整洁了:

代码语言:javascript
运行
复制
  final cipher = PaddedBlockCipherImpl(
    PKCS7Padding(),
    CBCBlockCipher(AESEngine()),
  )..init(
    false,
    PaddedBlockCipherParameters(
      ParametersWithIV(KeyParameter(key), iv),
      null,
    ),
  );

  final pt = cipher.process(encrypted);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72945189

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档