dart加密解密AES示例

时间:2017-12-08 10:56:51

标签: c++ encryption dart aes

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

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

可以帮助做到这一点。但我在这里有两个问题:

  • 加密字符串并解密以获取初始字符串的简单示例。

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

结论,如果有人可以帮助将Dart与任何库(密码/加密)一起使用的示例,该库可以使用2个输入Key和IV加密/解密字符串,这将非常有帮助。

谢谢大家

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

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

  • 加密数据
  • 将IV编码为十六进制字符串
  • 将加密数据编码为十六进制字符串
  • 序列化所有并通过网络发送
  • 网络的另一端解码十六进制字符串以获取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);
}

答案 2 :(得分:0)

对于现在来这里的任何人,我都基于PointyCastle编写了一个自定义程序包,并完全用Dart编写,可以为您大大简化AES。

https://pub.dev/packages/steel_crypt

看起来是这样实现的:

<script src="https://unpkg.com/immer/dist/immer.umd.js"></script>

这可以解决之前可能发生的输入问题。