簡體   English   中英

pidcrypt和openssl_encrypt的兼容性問題

[英]Compatibility issues with pidcrypt and openssl_encrypt

我正在設計一個應用程序,允許最終用戶從其瀏覽器進行測驗。 要求的一部分是,當測驗開始時間臨近時,該問題應立即顯示給每個參與者。 這使得從服務器向最終用戶提供問題變得不太合理,因為這將導致請求突然激增,因此我打算在他們連接后立即向他們提供問題,並且不到2小時即可開始測驗。 問題在於,由於這是一場比賽,因此在開始時間之前不應該看到問題,因此需要對其進行加密。

我決定分兩個階段進行加密,第一階段使用非對稱RSA加密進行密鑰交換,這是我成功完成的。 此密鑰將用於加密將在服務器和客戶端之間發送的任何其他數據。

現在的問題是對稱加密部分。 我正在嘗試使用openssl_encrypt方法在服務器端進行加密,並嘗試在客戶端使用pidcrypt(JavaScript加密/解密庫)進行解密。 原來pidcrypt要求您的iv(初始化向量)的長度為8個字節,但是使用AES-256-CBC模式的openssl_encrypt不允許8個字節,而是一直堅持16個字節。 我沒有運氣就做了很多排列和實驗。 pidcrypt的文檔中說它與openssl兼容,所以我的問題是-我做錯了什么? 以下是使用PHP在服務器端加密的代碼

        $iv_len = openssl_cipher_iv_length("AES-256-CBC");
            $key='My very secret key.......';
    $iv = openssl_random_pseudo_bytes($iv_len);
    $enc = openssl_encrypt('Hello', "AES-256-CBC", $key, 0, $iv);
    $encryptedMessage = base64_encode("Salted__".bin2hex($iv).$enc);
    echo json_encode(array('key'=>$key, 'encrypt'=>$encryptedMessage,));

請有一種方法可以使$ iv_len 8個字節長,而不是此代碼不斷返回的16個字節,我是否以正確的方式處理了整個安裝過程。 謝謝

pidcrypt不使用8字節的IV,而是使用8字節的鹽。 IV和鹽是不同的概念,即使它們有許多相似之處。

pidcrypt ,隨機鹽與密碼和MD5一起使用以生成密鑰和IV。 然后將鹽預先添加到密文中(就像openssl一樣)。 服務器應該使用相同的方法 ,使用預先添加的鹽值和共享密碼來生成密鑰和IV 當前,您正在直接嘗試使用密鑰和IV,這是不正確的。

無論使用哪種庫,用於解密任何CBC模式的IV都應與基礎密碼的塊大小相同。 此處的基礎塊密碼是AES,這意味着IV始終為16個字節。

您應該仔細閱讀關於未openssl_encrypt方法的用戶注釋,然后可能在PHP中找到另一個openssl兼容庫,或者找到/實現OpenSSL密鑰派生方法( EVP_BytesToKey

請注意,以下輸出是由openssl命令行實用程序產生的:

00000000  53 61 6c 74 65 64 5f 5f  44 a2 2f ee ac ee 94 fd  |Salted__D./.....|
00000010  6f 93 17 24 44 12 88 66  e7 fe 5c d5 7d 81 fe d9  |o..$D..f..\.}...|
00000020

因此,這是一個包含Salted__的ASCII字符串,后跟8字節的隨機鹽(不是IV)和16字節的密文(一個完整的塊)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM