簡體   English   中英

用PHP解密OpenEdge加密字符串(AES-128)

[英]Decrypt an OpenEdge-encrypted String (AES-128) in PHP

這是我在OpenEdge 10.1B中使用AES-128 OFB加密字符串的功能:

 DEFINE VAR cRes AS CHAR INITIAL ? NO-UNDO.
 DEFINE VAR rKey AS RAW NO-UNDO.
 DEFINE VAR rEnc AS RAW NO-UNDO

 rKey = GENERATE-PBE-KEY(cEncKey).

 eEnc = ENCRYPT(cData, rKey, ?, "AES_OFB_128").
 cRes = BASE64-ENCODE(rEnc) NO-ERROR.

 IF ERROR-STATUS::ERROR THEN cRes = ?.

 return cRes.

這個功能確實加密。

當我想用下面的PHP解密它時,它失敗了,例如它給了我一個不同於原始字符串的結果。

// decrypted: original string is supposed to have 33 characters
$encrypted = "YnRvNjIG1kj1QtUM9ZYuVYS3D4LBYCEsprjg2QCaD/eM";
$key = "27Zkp6Wq";

$method = 'aes-128-ofb';

# do decryption
echo "<pre>".openssl_decrypt(base64_decode($encrypted), $method, $key, false)."</pre>";

我知道這可能與GENERATE-PBE-KEY功能有關,但我沒有看到如何在PHP中生成PCKS#5密鑰。

有人可以幫幫我嗎?

這個評論太長了。 有幾點需要注意:

  1. openssl_decrypt的第四個參數應為true或第一個參數應保留為base64編碼。 除非它是雙base64編碼:)

  2. 密鑰base64是編碼還是原始密鑰?

  3. 從OpenEdge來看, PBES1 (pbkdf1)PBES2 (pbkdf2)是否應用於密鑰並不完全清楚,但默認設置使用sha1作為哈希算法,沒有鹽, 1000作為迭代計數。 您可以在線找到示例PHP實現。

擺弄你的榜樣我無法讓它發揮作用,但上述應該引導你朝着正確的方向前進; 順便說一句,當我嘗試在PHP中執行編碼步驟時,它導致了一個更短的加密字符串......我不知道該怎么想:)

你有安全 - 政策:PBE-HASH-ALGORITHM和SECURITY-POLICY:PBE-KEY-ROUNDS定義在哪里?:

http://documentation.progress.com/output/OpenEdge102b/pdfs/dvpin/dvpin.pdf#page=173

好的,所以我終於放棄了。 問題顯然是OpenEdge中的哈希函數,我無法在PHP中重現。 解決方案是從哈希函數中獲取哈希鍵並將其在HEX中通過第二個通道移動到PHP,並在那里使用它來解密。

它並不是非常安全,它不優雅,但它可以工作,我們的安全問題不是代碼方面,而是數據庫存儲方面。 您的要求可能不同,因此只有在您確定可用時才使用此方法。

暫無
暫無

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

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