这是我在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密钥。
有人可以帮帮我吗?
答案 0 :(得分:2)
评论太长了。有几点需要注意:
openssl_decrypt
的第四个参数应为true
或者第一个参数应保留为base64编码。除非是双base64编码:)
密钥base64是编码还是原始密钥?
从OpenEdge开始,不清楚PBES1 (pbkdf1)
或PBES2 (pbkdf2)
是否应用于密钥,但默认设置使用sha1
作为哈希算法,没有盐和{ {1}}作为迭代计数。您可以在线找到示例PHP实现。
摆弄你的榜样我无法让它发挥作用,但上述应该引导你朝着正确的方向前进;顺便说一句,当我尝试在PHP中执行编码步骤时,它导致了一个更短的加密字符串......我不知道该怎么想:)
答案 1 :(得分:0)
您是否有安全政策:PBE-HASH算法和安全政策:PBE-KEY-ROUNDS定义在哪里?:
http://documentation.progress.com/output/OpenEdge102b/pdfs/dvpin/dvpin.pdf#page=173
答案 2 :(得分:0)
它不是非常安全,它不优雅,但它有效,我们的安全问题不是代码方面,而是数据库存储方面。您的要求可能会有所不同,因此只有在您确定可以使用时才使用此方法。