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

时间:2012-06-20 13:07:20

标签: php encryption openssl aes openedge

这是我在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密钥。

有人可以帮帮我吗?

3 个答案:

答案 0 :(得分:2)

评论太长了。有几点需要注意:

  1. openssl_decrypt的第四个参数应为true或者第一个参数应保留为base64编码。除非是双base64编码:)

  2. 密钥base64是编码还是原始密钥?

  3. 从OpenEdge开始,不清楚PBES1 (pbkdf1)PBES2 (pbkdf2)是否应用于密钥,但默认设置使用sha1作为哈希算法,没有盐和{ {1}}作为迭代计数。您可以在线找到示例PHP实现。

  4. 摆弄你的榜样我无法让它发挥作用,但上述应该引导你朝着正确的方向前进;顺便说一句,当我尝试在PHP中执行编码步骤时,它导致了一个更短的加密字符串......我不知道该怎么想:)

答案 1 :(得分:0)

您是否有安全政策:PBE-HASH算法和安全政策:PBE-KEY-ROUNDS定义在哪里?:

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

答案 2 :(得分:0)

好的,所以我终于放弃了。问题显然是OpenEdge中的哈希函数,我无法在PHP中重现。解决方案是从哈希函数中获取哈希键,并通过第二个通道将它以HEX方式移动到PHP,并在那里使用它来解密。

它不是非常安全,它不优雅,但它有效,我们的安全问题不是代码方面,而是数据库存储方面。您的要求可能会有所不同,因此只有在您确定可以使用时才使用此方法。