3

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

3 回答 3

2

评论太长了。有几件事要看:

  1. 的第四个参数openssl_decrypt应该是trueOR 第一个参数应该是 base64 编码。除非它是双 base64 编码的:)

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

  3. PBES1 (pbkdf1)从 OpenEdge 来看,是否PBES2 (pbkdf2)应用于密钥并不完全清楚,但默认设置sha1用作散列算法,没有盐和1000迭代计数。您可以在线找到示例 PHP 实现。

摆弄了您的示例后,我无法使其正常工作,但是以上内容应该会引导您朝着正确的方向前进;顺便说一句,当我尝试在 PHP 中执行编码步骤时,它导致了一个更短的加密字符串......我不知道该怎么想:)

于 2012-06-21T13:20:49.870 回答
0

好的,所以我最终放弃了。问题显然是我未能在 PHP 中重现的 OpenEdge 中的哈希函数。解决方案是从散列函数中获取散列密钥,并通过第二个通道将其以 HEX 格式移动到 PHP,以便在那里使用它进行解密。

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

于 2012-06-27T11:29:23.767 回答
0

您是否在任何地方定义了 SECURITY-POLICY:PBE-HASH-ALGORITHM 和 SECURITY-POLICY:PBE-KEY-ROUNDS?:

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

于 2012-06-23T16:27:45.490 回答