輸入java.io.UnsupportedEncodingException。 輸入java.security.InvalidAlgorithmParameterException。 輸入java.security.InvalidKeyException。 輸入java.security.Key。 輸入java.security.NoSuchAlgorithmException。 輸入java.util.Base64。 輸入java.util.Base64.Decoder。 輸入java.util.Base64.Encoder。 輸入java.util.Collections。 輸入javax.crypto.BadPaddingException。 輸入javax.crypto.Cipher; 輸入javax.crypto.IllegalBlockSizeException。 輸入javax.crypto.NoSuchPaddingException。 インポートjavax.crypto.spec.IvParameterSpec; インポートするjavax.crypto.spec.SecretKeySpec; パブリック クラスDesUtil { 公共 静的 ボイドメイン(文字列[]引数) { DesUtil DES = 新しいDesUtil()。 文字列RES = des.encrypt( "adminユーザー"、 "1234567"、 "asdfzxcv" )。 System.out.println( "密文:" ); System.out.println(RES)。 ストリング平文 = des.decrypt(RES、 "1234567"、 "asdfzxcv" )。 System.out.println( "明文:" ); System.out。 * @param 暗号化される平文データ * @param キー、キー、8バイトの文字列 * @paramのIVランダム初期化ベクトルのパラメータ、長さのモードデス列8つのバイトが.javaファイルで指定されていませんパラメータは、警告をスローしますが、それでも、暗号化することができる使用されていません。このパラメータは、PHPでランダムなパラメータを暗号化します。 * @return * / パブリック文字列の暗号化(平文文字列、文字キー、文字列IV) { 文字列の結果 = nullを。 試し { // IVは、オブジェクト IvParameterSpec ivSpecは= 新しい新しい IvParameterSpec(iv.getBytes( "UTF-8" )); //キーの長さよりも短い場合、手動キーオブジェクト補体0を作成し、Javaは自動的に長さが午後12時00分未満8つのバイトを埋めます。異なる、PHPは自動的に暗号化結果につながる可能性があり、\ 0、いっぱいになります バイト[] NK = 新しい バイト [8 ]。 もし(key.getBytes( "UTF-8")長さ<8 ) { int型サブ= 8 - key.getBytes( "UTF-8" ).LENGTH。 NK =(キー+ String.join( ""、Collections.nCopies(サブ、0 + "")))GetBytesメソッド( "UTF-8" )。 } 他 { NK = key.getBytes( "UTF-8" )。 } キーのsKey = 新しい SecretKeySpec(NK、 "DES" )。 // 加解密服务类 暗号暗号=暗号。); // 暗号化するために指定された (Cipher.ENCRYPT_MODE、のsKey、ivSpec); cipher.initを //は、暗号化実行 バイト [] = Cipher.doFinal暗号文(plaintext.getBytes( "UTF-8" )); //は、base64エンコーディングを返します文字列を介して エンコーダエンコーダ= ; Base64.getEncoder() の結果 = encoder.encodeToString(暗号文); } キャッチ(持つNoSuchAlgorithmException E) { e.printStackTrace(); } キャッチ(NoSuchPaddingException E) { e.printStackTrace( ); } キャッチ(IllegalBlockSizeException電子) { e.printStackTrace(); } キャッチ(BadPaddingException電子) { e.printStackTrace(); } キャッチ(例外:InvalidKeyException電子) { e.printStackTrace(); } キャッチ(例外e) { e.printStackTrace(); } 戻り値の結果; } パブリック文字列の復号化(暗号文文字、文字列キー、文字列IV) { 文字列結果 = NULL ; デコーダデコーダ = Base64.getDecoder()。 バイト [] cipherByte = decoder.decode(暗号文)。 試す { IvParameterSpec ivSpec = 新しい IvParameterSpec(iv.getBytes( "UTF-8" )); バイト [] NK = 新しい バイト [8 ]。 もし(key.getBytes( "UTF-8")長さ<8 ) { int型サブ= 8 - key.getBytes( "UTF-8" ).LENGTH。 NK =(キー+ String.join( ""、Collections.nCopies(サブ、0 + "")))GetBytesメソッド( "UTF-8" )。他の NK = key.getBytes( "UTF-8" ); } キーのsKey = 新しい SecretKeySpec(NK、 "DES" )。 暗号暗号 = Cipher.getInstance( "DES / CBC / PKCS5Padding"変換)。 cipher.init(Cipher.DECRYPT_MODE、のsKey、ivSpec)。 バイト []平文= cipher.doFinal(cipherByte)。 結果 = 新しい文字列(平文)。 } キャッチ(にUnsupportedEncodingException電子) { e.printStackTrace(); } キャッチ(NoSuchPaddingException電子) { e.printStackTrace(); } キャッチ(持つNoSuchAlgorithmException電子) { e.printStackTrace(); } キャッチ(InvalidAlgorithmParameterExceptionが電子) { e.printStackTrace(); } キャッチ(例外:InvalidKeyException電子) { e.printStackTrace(); } キャッチ(BadPaddingException電子) { e.printStackTrace(); } キャッチ(IllegalBlockSizeException電子) { e.printStackTrace(); } リターン結果; } }
対応するPHPの暗号化と復号化:
クラスDES { パブリック 関数で暗号化($平文、$キー、$のIV ) { // Javaの充填規則を使用して IF(strlenを($キー)<。8 ) { $キー = $キー。におけるSTR_Repeat( '0'、。8 - strlenを($キー)); } // 第四のパラメータは、0に設定された自動充填に戻り、暗号文base64エンコードされていることを全てさ $暗号文 = openssl_encrypt($平文、 'DES-CBC'、$キー、0、IV $ )。 返す $暗号文を、 } パブリック 関数の解読($暗号文、$キー、$ IV ) { 場合(STRLEN($キー)<8 ) { $キー = $キー。STR_Repeat( '0'、8 - STRLEN($キー)); } // 解密数据 $平文 = openssl_decrypt($暗号文、 'DES-CBC'、$キー、0、$ IV )。 リターン $平文; } }