用 php 服务器 和 flutter app 通信, 文本用 AES-256-CBC 加密算法加密,该如何写?
时间: 2024-03-01 16:56:15 浏览: 191
AES(ECB、CBC、CFB、CTR)128/192/256加密算法C语言实现
要实现 Flutter App 和 PHP 服务器之间的通信,可以使用 HTTP 协议和 POST 请求,然后在 PHP 服务器端使用 AES-256-CBC 加密算法对请求的数据进行加密,再将加密后的数据返回给 Flutter App。Flutter App 在收到数据后,再使用相同的 AES-256-CBC 加密算法对数据进行解密。
以下是一个示例代码,用于在 Flutter App 中发送加密后的数据到 PHP 服务器:
```dart
import 'dart:convert';
import 'package:http/http.dart' as http;
import 'package:crypto/crypto.dart';
import 'package:pointycastle/block/aes.dart';
import 'package:pointycastle/block/modes/cbc.dart';
import 'package:pointycastle/padded_block_cipher/padded_block_cipher_impl.dart';
import 'dart:math';
import 'dart:typed_data';
Future<String> sendEncryptedData(String data) async {
// Generate a random initialization vector
final random = Random.secure();
final iv = Uint8List.fromList(List.generate(16, (_) => random.nextInt(256)));
// Encrypt the data using AES-256-CBC
final key = utf8.encode('your_secret_key_here');
final cipher = PaddedBlockCipherImpl(
PKCS7Padding(),
CBCBlockCipher(AESFastEngine()),
);
cipher.init(true, PaddedBlockCipherParameters<CipherParameters, CipherParameters>(
ParametersWithIV<KeyParameter>(KeyParameter(key), iv),
null,
));
final encryptedData = cipher.process(utf8.encode(data));
// Send the encrypted data and initialization vector to the PHP server
final response = await http.post(
Uri.parse('http://your_php_server_url_here'),
body: {
'data': base64.encode(encryptedData),
'iv': base64.encode(iv),
},
);
// Return the response from the PHP server
return response.body;
}
```
在 PHP 服务器端,可以使用以下代码对请求的数据进行解密:
```php
<?php
// Get the encrypted data and initialization vector from the POST request
$data = base64_decode($_POST['data']);
$iv = base64_decode($_POST['iv']);
// Decrypt the data using AES-256-CBC
$key = 'your_secret_key_here';
$decryptedData = openssl_decrypt($data, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv);
// Return the decrypted data to the Flutter App
echo $decryptedData;
?>
```
需要注意的是,为了确保数据的安全性,密钥应该保密,并且只有 Flutter App 和 PHP 服务器知道。另外,初始化向量应该是随机生成的,并且每次加密的时候都应该使用不同的初始化向量。
阅读全文