1

したがって、特定のプロジェクトでは、別の PHP アプリケーションで暗号化/復号化されるのと同じ方法で文字列を暗号化および復号化できる必要があります。私のアプリケーションは Grails アプリなので、Java でコードを記述します。PHP 側で文字列を暗号化/復号化する方法は次のとおりです (コード例であり、必ずしも機能するとは限りません)。

<?
$input="textToBeEncrypted";

function encrypt($data, $key)
{
$cipher_alg = MCRYPT_DES;
$mode = MCRYPT_MODE_CBC;
return @mcrypt_encrypt($cipher_alg, $key, $data, $mode);
}

function decrypt($encrypted, $key)
{
$cipher_alg = MCRYPT_DES;
$mode = MCRYPT_MODE_CBC;
return @mcrypt_decrypt($cipher_alg, $key, $encrypted, $mode);
}  

$key ="testKey";
$data=$input;
$result = decrypt($data, $key);
echo ">>" . $result . "<br>\n";
?>  

したがって、Java (または Groovy) で同じ暗号化/復号化を適用できるようにしたいと考えています。このサンプルコードhttps://github.com/stevenholder/PHP-Java-AES-Encrypt/blob/master/security.javaを見つけました。Javaでアルゴリズムとモードの名前を見つけることができれば、それを理解しています、それは動作するはずです。何か不足していない限り...暗号化アルゴリズムのJava標準名ページに移動しましたhttp://docs.oracle.com/javase/7/docs/technotes/guides/security/StandardNames.html、しかしできますPHPコードにあるものとまったく同等のものを見つけられません。何か案は?似たようなことをする必要があった人はいますか?

ありがとう、
イラクリス

4

1 に答える 1

0

暗号化で考慮すべき 3 つの主な事項は、アルゴリズム、モード、およびパディングです。すべてが機能するには、暗号化ソフトウェアと復号化ソフトウェアの間で互換性がなければなりません。

まず、暗号化アルゴリズムとしてAES( Rijndael) を使用することをお勧めします。もはや十分に安全であるとは見なされていません。リンクを投稿した Java コードは を使用しているため、表示している PHP コードとは互換性がありません。DESDESAES

さらに、そのJavaコードはECB推奨されないモードに使用されています。ECB初期化ベクトルの処理を必要としないため簡単ですが、それも欠点です。CBC明示的な IV 処理は見られませんが、PHP コードはこれを使用しています。その場合、Mcrypt はすべてゼロの IV を使用しますが、これはまったく理想的ではありません。

最後に、Java コードはPKCS5パディング メソッドとして使用していますが、PHP コードはゼロ パディングを使用しています。それらは互換性がありません。Oracle の JDK に付属するデフォルト プロバイダはゼロ パディングをサポートしていませんが、Bouncy Castleはサポートしています(セクション 5.0 を参照)。それには、Bouncy Castle の API を直接使用するか、そのリンクで詳述されているメソッドの 1 つを使用して JCE プロバイダーとして使用する必要があります。文字列"DES/CBC/ZeroByte"はトリックを行う必要があります。

もちろん、暗号化するデータが null バイトで終わる可能性がある場合、ゼロ パディングは問題になる可能性があります。

以前にこの質問に似た質問に回答し、回答で Java で暗号化し、PHP で復号化するためのコードを提供しましたうまくいけば、それはあなたを助けるかもしれません.

于 2013-09-01T15:11:00.263 に答える