dart加密解密AES示例

问题描述 投票:2回答:2

嗨,我想用Dart进行AES加密和解密的例子。我在Dart看到有一个图书馆密码

https://www.dartdocs.org/documentation/cipher/0.3.0/cipher.api/cipher.api-library.html

这有助于做到这一点。但我这里有两个问题:

  • 加密字符串并解密它以获取初始字符串的简单示例。
  • 我需要它与其他AES库一起工作,假设它们都遵循标准。特别是我在Cart中使用Dart和后端,我计划使用加密++来达到这个目的。关键在于crypto ++,所需的输入是密钥和初始化向量(IV),而在Dart / cipher中,它似乎不需要IV。我想知道输入要求是否不同,它们无法一起工作。

结论,如果有人可以帮助一个使用Dart与任何库(密码/加密)的例子,它可以加密/解密带有2个输入Key和IV的字符串,这将令我惊讶。

谢谢你们

c++ encryption dart aes
2个回答
3
投票

我不打算提供完整的示例代码,但是如果你想使用Dart加密,你应该使用计数器模式(CTR)加密,因为这似乎是Dart实现的唯一实际的AES密码模式。

CTR也称为SIC模式,可以找到here的实现。它有助于使用ParametersWithIV。如果你要使用一个非随机化的nonce,你应该把它放在高位(最左边,从字节索引0开始,因为CTR模式通常是大端)的IV结束。


2
投票

我终于得到了我的加密解密示例工作,所以我回答了我的问题。最简单的方法是使用Salsa20算法,然后在序列化并发送之前将所有内容转换为十六进制字符串。

  • 加密数据
  • 编码IV到十六进制字符串
  • 将加密数据编码为hex String
  • 序列化所有并通过网络发送
  • 网络的另一端解码十六进制字符串以获取IV和加密数据。
  • 然后使用相同的IV,相同的密钥(隐式设置为相同)来解密数据

下面是代码加密/解密而不通过网络发送。

import "dart:typed_data";
import 'dart:convert';
import "package:cipher/cipher.dart";
import "package:cipher/impl/base.dart";

Uint8List StringToUint8List( String s ) {
  var ret = new Uint8List(s.length);
  for( var i=0 ; i<s.length ; i++ ) {
    ret[i] = s.codeUnitAt(i);
  }
  return ret;
}

/// UTF16 Decoding
String Uint8ListToString( Uint8List ui ) {
  String s = new String.fromCharCodes(ui);
  return s;
}

void main() {
    initCipher();
    final testStr = "Hello, i am a very very very very very very very very long string, please encrypte me";
    final ivStr  = "2urPAr4H"; // Need to have size 8
    final keyStr = "QuJuesMhcssE4e8Q4Kt1XCJW3tcpzcEI"; // Need to have size 32

    final _ivEncoded = UTF8.encode(ivStr);
    final _keyEncoded = UTF8.encode(keyStr);
    final _key = new KeyParameter(_keyEncoded);
    final params = new ParametersWithIV(_key,_ivEncoded);

    var cipher = new StreamCipher( "Salsa20" );
    cipher..reset()..init( true, params );
    var encryptedEncodedData = cipher.process( StringToUint8List(testStr) );
     var encryptedDataStr = Uint8ListToString(encryptedEncodedData);

    cipher..reset()..init( false, params );
    var dencryptedEncodedData = cipher.process( StringToUint8List(encryptedDataStr) );
    var dencryptedDataStr = Uint8ListToString(dencryptedEncodedData);
    //expect(testStr, dencryptedDataStr);
}
© www.soinside.com 2019 - 2024. All rights reserved.