3

これは、OpenEdge10.1BでAES-128OFBを使用して文字列を暗号化するために使用する関数です。

 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. の4番目のパラメータはORであるopenssl_decrypt必要がありtrue、最初のパラメータはbase64でエンコードされたままにする必要があります。それがdoublebase64でエンコードされていない限り:)

  2. キーbase64はエンコードされていますか、それとも生のキーですか?

  3. OpenEdgeからは、キーに適用されるかどうPBES1 (pbkdf1)PBES2 (pbkdf2)は完全には明確ではありませんが、デフォルト設定sha1では、ハッシュアルゴリズムとして使用され、ソルトは使用されず1000、反復回数として使用されます。PHPの実装例はオンラインで見つけることができます。

あなたの例をいじったので、私はそれを機能させることができませんでしたが、上記はあなたを正しい方向に導くはずです。ところで、PHPでエンコード手順を実行しようとすると、暗号化された文字列がはるかに短くなりました...それについてどう考えるかわかりません:)

于 2012-06-21T13:20:49.870 に答える
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 に答える
0

OK、それで私はついに諦めました。問題は明らかに、PHPで再現できなかったOpenEdgeのハッシュ関数でした。解決策は、ハッシュ関数からハッシュされたキーを取得し、それをHEXで2番目のチャネルを介してPHPに移動し、そこで復号化するために使用することでした。

完全に安全というわけではなく、エレガントでもありませんが、機能します。セキュリティの問題はコード側ではなく、データベースストレージ側です。要件が異なる場合があるため、このアプローチは、使用可能であることが確実な場合にのみ使用してください。

于 2012-06-27T11:29:23.767 に答える