Crypto js aes-128-cbc php openssl
时间: 2024-09-15 18:06:57 浏览: 85
CryptoJS是一个JavaScript库,专门用于加密处理,支持多种加密算法,包括AES (高级加密标准)。AES-128-CBC是一种对称加密模式,其中128位密钥用于加密,CBC(Cipher Block Chaining,密码块链接)模式下每次加密都会使用前一次的密文作为新的初始化向量。
在PHP中,你可以使用openssl extension来进行同样的AES-128-CBC加密。`openssl_encrypt()` 和 `openssl_decrypt()` 函数可以分别用于加密和解密数据,需要提供密钥、初始化向量(IV),以及选择AES-128-CBC作为加密算法。例如:
```php
$key = 'your_16_byte_key';
$iv = openssl_random_pseudo_bytes(16); // 生成随机初始化向量
$ciphertext = openssl_encrypt($plaintext, "AES-128-CBC", $key, OPENSSL_RAW_DATA, $iv);
```
要解密,使用相同的密钥和初始化向量:
```php
$decrypted_text = openssl_decrypt($ciphertext, "AES-128-CBC", $key, OPENSSL_RAW_DATA, $iv);
```
相关问题
用 php 服务器 和 flutter app 通信, 文本用 AES-256-CBC 加密算法加密,该如何写?
要实现 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 服务器知道。另外,初始化向量应该是随机生成的,并且每次加密的时候都应该使用不同的初始化向量。
aes openssl java_如何用 Java 读取 openssl genrsa -aes256 生成的密钥
可以以下代码来读取 OpenSSL 生成的 AES 256 密钥:
```java
import java.io.BufferedReader;
import java.io.FileReader;
import java.security.Key;
import java.security.KeyFactory;
import java.security.spec.PKCS8EncodedKeySpec;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
public class ReadOpenSSLPrivateKey {
public static void main(String[] args) throws Exception {
// 读取私钥文件
BufferedReader br = new BufferedReader(new FileReader("private_key.pem"));
String line;
StringBuilder sb = new StringBuilder();
while ((line = br.readLine()) != null) {
if (line.startsWith("-----BEGIN ") || line.startsWith("-----END ")) {
continue;
}
sb.append(line);
}
br.close();
// 解码 Base64 格式的密钥
byte[] keyBytes = Base64.getDecoder().decode(sb.toString());
// 获取密码
String password = "your_password";
// 生成 AES 密钥
byte[] ivBytes = new byte[16];
byte[] saltBytes = Arrays.copyOfRange(keyBytes, 8, 16);
byte[] keyBytesWithoutSalt = Arrays.copyOfRange(keyBytes, 16, keyBytes.length);
IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);
SecretKeySpec keySpec = new SecretKeySpec(getAESKey(password, saltBytes), "AES");
// 解密私钥
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
byte[] decryptedBytes = cipher.doFinal(keyBytesWithoutSalt);
// 转换成 Key 对象
PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(decryptedBytes);
KeyFactory kf = KeyFactory.getInstance("RSA");
Key privateKey = kf.generatePrivate(spec);
System.out.println(privateKey);
}
public static byte[] getAESKey(String password, byte[] saltBytes) throws Exception {
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
KeySpec spec = new PBEKeySpec(password.toCharArray(), saltBytes, 65536, 256);
SecretKey tmp = factory.generateSecret(spec);
return tmp.getEncoded();
}
}
```
其中 `private_key.pem` 是 OpenSSL 生成的密钥文件,`your_password` 是生成密钥时设置的密码。这段代码会读取密钥文件,解码 Base64 格式的密钥,生成 AES 密钥,解密私钥,并将其转换成 Java 的 `Key` 对象。
阅读全文