Dart 套接字不发送低于 31 的 utf-8 字符
Dart socket doesn't send utf-8 chars below 31
所以,我和 2 个朋友目前正在做一个项目。其中一个是服务器编程,另一个是网站,我是一个应用程序。首先,我们的程序应该在没有加密的情况下相互通信。这也很有效。但现在我们想使用 AES 256 CBC 加密消息。那就是问题开始的时候。起初,加密本身不能正常工作,但现在可以了。
但是,在发送加密邮件时,有些字符没有发送。显然,32 以下的字符,即根据 UTF8 table 仅具有值“control”的所有值。但是,我不知道如何解决这个问题。我们也测试了是不是服务器的问题,但是网站和一个快速编写的Java程序都没有这个问题。因此我们假设错误在我这边。
这是我用来加密的代码:
String encrypt(String pKey, pIV, msg){
final key = Key.fromUtf8(pKey);
final iv = IV.fromUtf8(pIV);
final encrypter = Encrypter(AES(key, mode: AESMode.cbc));
final encrypted = encrypter.encrypt(msg, iv: iv);
String utf8Msg = "";
for(int i = 0;i<encrypted.bytes.length;i++ ){
utf8Msg += String.fromCharCode(encrypted.bytes[i]);
}
print("###AES encrypted text: ${utf8Msg}") ;
return utf8Msg;
这是我用来发送消息的代码:
Future<void> run(String ip, int port, String request, key, iv) async {
i = 0;
String _request = request;
Completer<String> _completer = new Completer<String>();
print("Request: $_request");
_errorData = "Server_Error";
if (_request != null) {
print("Request has data");
socket = await Socket.connect(ip, port);
socket.encoding = utf8;
socket.listen((data) {
//code for the received messages
},
onError: ((error, StackTrace trace) {
_secureResponse = _errorData;
print("(2) $_secureResponse");
_completer.completeError(_secureResponse);
}),
onDone: () {
print("finish");
_completer.complete(_secureResponse);
socket.destroy();
},
cancelOnError: false);
print("Socket sends data");
socket.write(encrypt(key, iv, msg))
} else {
_secureResponse = _errorData;
print("(4) $_secureResponse");
}
return _completer.future;
}
您应该使用不是 UTF-8 字符串的数据类型,而是相当于缓冲区的 dart,我认为可能是 ByteBuffer?
所以,我和 2 个朋友目前正在做一个项目。其中一个是服务器编程,另一个是网站,我是一个应用程序。首先,我们的程序应该在没有加密的情况下相互通信。这也很有效。但现在我们想使用 AES 256 CBC 加密消息。那就是问题开始的时候。起初,加密本身不能正常工作,但现在可以了。
但是,在发送加密邮件时,有些字符没有发送。显然,32 以下的字符,即根据 UTF8 table 仅具有值“control”的所有值。但是,我不知道如何解决这个问题。我们也测试了是不是服务器的问题,但是网站和一个快速编写的Java程序都没有这个问题。因此我们假设错误在我这边。
这是我用来加密的代码:
String encrypt(String pKey, pIV, msg){
final key = Key.fromUtf8(pKey);
final iv = IV.fromUtf8(pIV);
final encrypter = Encrypter(AES(key, mode: AESMode.cbc));
final encrypted = encrypter.encrypt(msg, iv: iv);
String utf8Msg = "";
for(int i = 0;i<encrypted.bytes.length;i++ ){
utf8Msg += String.fromCharCode(encrypted.bytes[i]);
}
print("###AES encrypted text: ${utf8Msg}") ;
return utf8Msg;
这是我用来发送消息的代码:
Future<void> run(String ip, int port, String request, key, iv) async {
i = 0;
String _request = request;
Completer<String> _completer = new Completer<String>();
print("Request: $_request");
_errorData = "Server_Error";
if (_request != null) {
print("Request has data");
socket = await Socket.connect(ip, port);
socket.encoding = utf8;
socket.listen((data) {
//code for the received messages
},
onError: ((error, StackTrace trace) {
_secureResponse = _errorData;
print("(2) $_secureResponse");
_completer.completeError(_secureResponse);
}),
onDone: () {
print("finish");
_completer.complete(_secureResponse);
socket.destroy();
},
cancelOnError: false);
print("Socket sends data");
socket.write(encrypt(key, iv, msg))
} else {
_secureResponse = _errorData;
print("(4) $_secureResponse");
}
return _completer.future;
}
您应该使用不是 UTF-8 字符串的数据类型,而是相当于缓冲区的 dart,我认为可能是 ByteBuffer?