猿问

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

当我的表单被提交时,它会首先向这个控制器动作发出请求以获取服务器的公钥:


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.


慕盖茨4494581
浏览 169回答 1
1回答

慕村225694

AES-256 密钥只不过是 32 个随机字节。因此,您可以使用加密安全的随机数生成器来创建密钥。但是,RSA PKCS#1 v1.5 和 AES-CBC 都容易受到填充预言机攻击。因此,攻击者不仅可以更改消息,而且消息也不会保密。换句话说,您可以随心所欲地使用 256 位密钥,但您不应该创建自己的传输协议,因为感知的安全性并不存在。你可以对密文进行签名,但这也有问题——通常我们先签名然后加密。使用 TLS。
随时随地看视频慕课网APP
我要回答