在PHP中解密OpenEdge加密的字符串(AES-128)

hkmswyz6  于 2023-05-27  发布在  PHP
关注(0)|答案(4)|浏览(158)

这是我在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密钥。
有人能帮帮我吗?

5f0d552i

5f0d552i1#

这是一个评论太长。有几件事要看:

  1. openssl_decrypt的第四个参数应该是true,或者第一个参数应该是左base64编码。除非是双base64编码:)
    1.密钥base64是编码的还是原始密钥?
    1.在OpenEdge中,并不完全清楚是PBES1 (pbkdf1)还是PBES2 (pbkdf2)应用于密钥,但默认设置使用sha1作为哈希算法,没有salt,1000作为迭代计数。你可以在网上找到PHP实现的例子。
    我对你的例子进行了修改,但我不能让它起作用,但上面的内容应该会引导你走上正确的方向;顺便说一句,当我尝试在PHP中进行编码步骤时,它导致了一个更短的加密字符串...我不知道该怎么想:)
fnvucqvd

fnvucqvd2#

您是否在任何地方定义了SECURITY-POLICY:PBE-HASH-ALGORITHM和SECURITY-POLICY:PBE-KEY-ROUNDS?:
http://documentation.progress.com/output/OpenEdge102b/pdfs/dvpin/dvpin.pdf#page=173

btxsgosb

btxsgosb3#

好吧,我终于放弃了。问题显然是OpenEdge中的散列函数,我未能在PHP中重现。解决方案是从散列函数中获取散列密钥,并通过第二个通道将其以十六进制形式移动到PHP中,以便在那里使用它进行解密。
它并不完全安全,也不优雅,但它有效,我们的安全问题不是代码端,而是数据库存储端。您的需求可能会有所不同,因此只有在确定可用时才使用此方法。

4urapxun

4urapxun4#

在openedge代码中,您应该将rKey = GENERATE-PBE-KEY(cEncKey)更改为rKey = MESSAGE-DIGEST('SHA-256',cEncKey)。
在PHP代码中,你应该使用$key= substr(hash('sha 256',$cEncKey,true),0,32);
你会让它工作的。

相关问题