嗨, 我想用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加密/解密字符串,这将非常有帮助。
谢谢大家
答案 0 :(得分:3)
我不打算提供完整的示例代码,但如果你想要使用Dart加密,你应该使用计数器模式(CTR)加密,因为这似乎是只有Dart实现的实际AES密码模式。
CTR也称为SIC模式,可以找到here的实现。它有用地使用ParametersWithIV
。如果你要使用一个非随机化的随机数,你应该把它放在高位(最左边,从字节索引0开始,因为CTR模式通常是大端)的结尾。
答案 1 :(得分:2)
我终于得到了我的加密解密示例,所以我回答了我的问题。最简单的方法是使用Salsa20算法,然后在序列化并发送之前将所有内容转换为十六进制字符串。
以下是代码加密/解密而不通过网络发送。
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>
这可以解决之前可能发生的输入问题。