这是我在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密钥。
有人能帮帮我吗?
4条答案
按热度按时间5f0d552i1#
这是一个评论太长。有几件事要看:
openssl_decrypt
的第四个参数应该是true
,或者第一个参数应该是左base64编码。除非是双base64编码:)1.密钥base64是编码的还是原始密钥?
1.在OpenEdge中,并不完全清楚是
PBES1 (pbkdf1)
还是PBES2 (pbkdf2)
应用于密钥,但默认设置使用sha1
作为哈希算法,没有salt,1000
作为迭代计数。你可以在网上找到PHP实现的例子。我对你的例子进行了修改,但我不能让它起作用,但上面的内容应该会引导你走上正确的方向;顺便说一句,当我尝试在PHP中进行编码步骤时,它导致了一个更短的加密字符串...我不知道该怎么想:)
fnvucqvd2#
您是否在任何地方定义了SECURITY-POLICY:PBE-HASH-ALGORITHM和SECURITY-POLICY:PBE-KEY-ROUNDS?:
http://documentation.progress.com/output/OpenEdge102b/pdfs/dvpin/dvpin.pdf#page=173
btxsgosb3#
好吧,我终于放弃了。问题显然是OpenEdge中的散列函数,我未能在PHP中重现。解决方案是从散列函数中获取散列密钥,并通过第二个通道将其以十六进制形式移动到PHP中,以便在那里使用它进行解密。
它并不完全安全,也不优雅,但它有效,我们的安全问题不是代码端,而是数据库存储端。您的需求可能会有所不同,因此只有在确定可用时才使用此方法。
4urapxun4#
在openedge代码中,您应该将rKey = GENERATE-PBE-KEY(cEncKey)更改为rKey = MESSAGE-DIGEST('SHA-256',cEncKey)。
在PHP代码中,你应该使用$key= substr(hash('sha 256',$cEncKey,true),0,32);
你会让它工作的。