JS中的AES加密,PHP中的解密?

时间:2019-07-14 08:12:41

标签: javascript php laravel encryption

提交表单后,它将首先向此控制器操作发出请求以获取服务器的公钥:

public function preprocessPayment(Request $request) {
    // Get public key
    $publicKey = $this->EncryptionService->getPublicKey();

    // Generate iv
    $method = 'aes-256-cbc';
    $ivlen = openssl_cipher_iv_length($method);
    $iv = openssl_random_pseudo_bytes($ivlen);

    return response()->json([
        'success' => true, 
        'data' => [
            'public_key' => $publicKey,
            'iv' => $iv
        ]
    ]);
}

在那之后,在我的客户端中,我将通过CryptoJS使用AES生成一个秘密密钥,稍后将使用public_key对其进行加密。

然后,将使用AES密钥在AES中对表单数据进行加密,然后将以下有效负载提交给服务器:

{
    secret_key: xxx,
    iv: xxx,
    form_data: {...}
}

将在此处处理AES加密数据:

public function storePayment(Request $request) {
    // Decrypt AES secret key (that was encrypted with the RSA public key),
        // using RSA private key
    // Decrypt AES client data with secret key
    // Store data in database
}

我的问题是,如何使用CryptoJS在客户端进行AES密钥生成和加密?似乎找不到关于它的任何好的文档。我应该如何格式化数据,以便服务器将其接受以进行解密?

我一直坚持用PHP解密AES,因为它需要$tag,而且当一切都来自客户端时,我也不知道该从哪里获得。

$originalData = openssl_decrypt($data, 'aes-128-gcm', $secretKey, $options=0, $iv, $tag);

我找到了此链接:http://cryptojs.altervista.org/js-php/,但是由于不确定在哪里找到所需的脚本,我不确定如何使它起作用。

编辑:

我犯了一个错误,因为在服务器上解密时,我使用的是aes-128-gcm而不是aes-256-cbc。更正后,无需$tag就可以解密。

1 个答案:

答案 0 :(得分:1)

AES-256密钥不过是32个随机字节。因此,您可以使用加密安全的随机数生成器来创建密钥。

但是,RSA PKCS#1 v1.5和AES-CBC都容易受到填充Oracle攻击。因此,不仅对手可以更改消息,而且消息也不会保密。换句话说,您可以随意使用256位密钥,但是您不应该创建自己的传输协议,因为 perceptable 安全性不存在。

您可以对密文进行签名,但这也有问题-通常我们先签名然后进行加密。

使用TLS。