加密解密 - Java Aes 类,可否用 php 实现,求助于懂 Java 代码的 php 程序猿
Java 代码:
<code>import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; public class AESSecurityUtil { private static final String AES = "AES"; private static final String CHARSET_NAME = "utf-8"; private static SecretKeySpec getKey(String password) throws NoSuchAlgorithmException{ KeyGenerator kgen = KeyGenerator.getInstance(AES); SecureRandom random=SecureRandom.getInstance("SHA1PRNG"); random.setSeed(password.getBytes()); kgen.init(128, random); SecretKey secretKey = kgen.generateKey(); byte[] enCodeFormat = secretKey.getEncoded(); SecretKeySpec key = new SecretKeySpec(enCodeFormat, AES); return key; } public static String encode(String str, String password) { byte[] arr = encodeToArr(str, password); return byteArrToString(arr); } private static byte[] encodeToArr(String str, String password) { try { Cipher cipher = Cipher.getInstance(AES); byte[] byteContent = str.getBytes(CHARSET_NAME); cipher.init(Cipher.ENCRYPT_MODE, getKey(password)); byte[] result = cipher.doFinal(byteContent); return result; } catch (Exception e) { e.printStackTrace(); } return null; } public static String decode(String hexStr, String password){ byte[] arr = string2ByteArr(hexStr); return decode(arr, password); } private static String decode(byte[] arr, String password) { try{ Cipher cipher = Cipher.getInstance(AES); cipher.init(Cipher.DECRYPT_MODE, getKey(password)); byte[] result = cipher.doFinal(arr); return new String(result, CHARSET_NAME); }catch (Exception e){ e.printStackTrace(); } return null; } private static String byteArrToString(byte[] arr) { StringBuffer sb = new StringBuffer(); for (int i = 0; i <arr.length i string s="Integer.toString(arr[i]" if sb.append return sb.tostring private static byte string2bytearr str="0123456789ABCDEF" arr="new" for char s1="s.charAt(i" s2="s.charAt(i" int tmp1="str.indexOf(s1)" tmp2="str.indexOf(s2);" public void main args throws exception system.out.println keystr="UITN25LMUQC436IM" plaintext="this is a string will be AES_Encrypt" enctext="encode(plainText,keyStr);" decstring="decode(encText,keyStr);"></arr.length></code>
背景:对方平台语言是Java,参数必须加密,返回数据也是加密后返回,我这边语言是php
问题:这个Java aes 类,能否用php实现,如果能实现,应该如何实现,请指点。
我写的php代码:
<code><?php if (!function_exists('hex2bin')) { function hex2bin($str) { $sbin = ""; $len = strlen($str); for ($i = 0; $i < $len; $i += 2) { $sbin .= pack("H*", substr($str, $i, 2)); } return $sbin; } } class Util_AesEncrypt { private $_cipher = MCRYPT_RIJNDAEL_128; private $_mode = MCRYPT_MODE_ECB; private function _pkcs5Pad($text, $blockSize) { $pad = $blockSize - (strlen($text) % $blockSize); return $text . str_repeat(chr($pad), $pad); } private function _pkcs5Unpad($text) { $end = substr($text, -1); $last = ord($end); $len = strlen($text) - $last; if (substr($text, $len) == str_repeat($end, $last)) { return substr($text, 0, $len); } return false; } public function encrypt($encrypt, $key) { $blockSize = mcrypt_get_block_size($this->_cipher, $this->_mode); $paddedData = $this->_pkcs5Pad($encrypt, $blockSize); $ivSize = mcrypt_get_iv_size($this->_cipher, $this->_mode); $iv = mcrypt_create_iv($ivSize, MCRYPT_RAND); $encrypted = mcrypt_encrypt($this->_cipher, $key, $paddedData, $this->_mode, $iv); return bin2hex($encrypted); } public function decrypt($decrypt, $key) { $decoded = hex2bin($decrypt); $blockSize = mcrypt_get_iv_size($this->_cipher, $this->_mode); $iv = mcrypt_create_iv($blockSize, MCRYPT_RAND); $decrypted = mcrypt_decrypt($this->_cipher, $key, $decoded, $this->_mode, $iv); return $this->_pkcs5Unpad($decrypted); } } $keyStr = 'UITN25LMUQC436IM'; $plainText = 'this is a string will be AES_Encrypt'; $aes = new Util_AesEncrypt(); $encText = $aes->encrypt($plainText, $keyStr); $decString = $aes->decrypt($encText, $keyStr); echo $encText, "\n", $decString; </code>
两者运行结果很大差异,并且也没法互相加密解密,应如何改正?
回复内容:
Java 代码:
<code>import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; public class AESSecurityUtil { private static final String AES = "AES"; private static final String CHARSET_NAME = "utf-8"; private static SecretKeySpec getKey(String password) throws NoSuchAlgorithmException{ KeyGenerator kgen = KeyGenerator.getInstance(AES); SecureRandom random=SecureRandom.getInstance("SHA1PRNG"); random.setSeed(password.getBytes()); kgen.init(128, random); SecretKey secretKey = kgen.generateKey(); byte[] enCodeFormat = secretKey.getEncoded(); SecretKeySpec key = new SecretKeySpec(enCodeFormat, AES); return key; } public static String encode(String str, String password) { byte[] arr = encodeToArr(str, password); return byteArrToString(arr); } private static byte[] encodeToArr(String str, String password) { try { Cipher cipher = Cipher.getInstance(AES); byte[] byteContent = str.getBytes(CHARSET_NAME); cipher.init(Cipher.ENCRYPT_MODE, getKey(password)); byte[] result = cipher.doFinal(byteContent); return result; } catch (Exception e) { e.printStackTrace(); } return null; } public static String decode(String hexStr, String password){ byte[] arr = string2ByteArr(hexStr); return decode(arr, password); } private static String decode(byte[] arr, String password) { try{ Cipher cipher = Cipher.getInstance(AES); cipher.init(Cipher.DECRYPT_MODE, getKey(password)); byte[] result = cipher.doFinal(arr); return new String(result, CHARSET_NAME); }catch (Exception e){ e.printStackTrace(); } return null; } private static String byteArrToString(byte[] arr) { StringBuffer sb = new StringBuffer(); for (int i = 0; i <arr.length i string s="Integer.toString(arr[i]" if sb.append return sb.tostring private static byte string2bytearr str="0123456789ABCDEF" arr="new" for char s1="s.charAt(i" s2="s.charAt(i" int tmp1="str.indexOf(s1)" tmp2="str.indexOf(s2);" public void main args throws exception system.out.println keystr="UITN25LMUQC436IM" plaintext="this is a string will be AES_Encrypt" enctext="encode(plainText,keyStr);" decstring="decode(encText,keyStr);"></arr.length></code>
背景:对方平台语言是Java,参数必须加密,返回数据也是加密后返回,我这边语言是php
问题:这个Java aes 类,能否用php实现,如果能实现,应该如何实现,请指点。
我写的php代码:
<code><?php if (!function_exists('hex2bin')) { function hex2bin($str) { $sbin = ""; $len = strlen($str); for ($i = 0; $i < $len; $i += 2) { $sbin .= pack("H*", substr($str, $i, 2)); } return $sbin; } } class Util_AesEncrypt { private $_cipher = MCRYPT_RIJNDAEL_128; private $_mode = MCRYPT_MODE_ECB; private function _pkcs5Pad($text, $blockSize) { $pad = $blockSize - (strlen($text) % $blockSize); return $text . str_repeat(chr($pad), $pad); } private function _pkcs5Unpad($text) { $end = substr($text, -1); $last = ord($end); $len = strlen($text) - $last; if (substr($text, $len) == str_repeat($end, $last)) { return substr($text, 0, $len); } return false; } public function encrypt($encrypt, $key) { $blockSize = mcrypt_get_block_size($this->_cipher, $this->_mode); $paddedData = $this->_pkcs5Pad($encrypt, $blockSize); $ivSize = mcrypt_get_iv_size($this->_cipher, $this->_mode); $iv = mcrypt_create_iv($ivSize, MCRYPT_RAND); $encrypted = mcrypt_encrypt($this->_cipher, $key, $paddedData, $this->_mode, $iv); return bin2hex($encrypted); } public function decrypt($decrypt, $key) { $decoded = hex2bin($decrypt); $blockSize = mcrypt_get_iv_size($this->_cipher, $this->_mode); $iv = mcrypt_create_iv($blockSize, MCRYPT_RAND); $decrypted = mcrypt_decrypt($this->_cipher, $key, $decoded, $this->_mode, $iv); return $this->_pkcs5Unpad($decrypted); } } $keyStr = 'UITN25LMUQC436IM'; $plainText = 'this is a string will be AES_Encrypt'; $aes = new Util_AesEncrypt(); $encText = $aes->encrypt($plainText, $keyStr); $decString = $aes->decrypt($encText, $keyStr); echo $encText, "\n", $decString; </code>
两者运行结果很大差异,并且也没法互相加密解密,应如何改正?

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用してPHPの特定の文字列内の母音の数を計算する方法を学びます。英語の母音は、a、e、i、o、u、そしてそれらは大文字または小文字である可能性があります。 母音とは何ですか? 母音は、特定の発音を表すアルファベットのある文字です。大文字と小文字など、英語には5つの母音があります。 a、e、i、o、u 例1 入力:string = "tutorialspoint" 出力:6 説明する 文字列「TutorialSpoint」の母音は、u、o、i、a、o、iです。合計で6元があります

Java をシンプルに: プログラミング能力の初心者向けガイド はじめに Java は、モバイル アプリケーションからエンタープライズ レベルのシステムに至るまで、あらゆるもので使用される強力なプログラミング言語です。初心者にとって、Java の構文はシンプルで理解しやすいため、プログラミングの学習に最適です。基本構文 Java は、クラスベースのオブジェクト指向プログラミング パラダイムを使用します。クラスは、関連するデータと動作をまとめて編成するテンプレートです。簡単な Java クラスの例を次に示します。 publicclassperson{privateStringname;privateintage;

Java は、初心者と経験豊富な開発者の両方が学習できる人気のあるプログラミング言語です。このチュートリアルは基本的な概念から始まり、高度なトピックに進みます。 Java Development Kit をインストールしたら、簡単な「Hello, World!」プログラムを作成してプログラミングを練習できます。コードを理解したら、コマンド プロンプトを使用してプログラムをコンパイルして実行すると、コンソールに「Hello, World!」と出力されます。 Java の学習はプログラミングの旅の始まりであり、習熟が深まるにつれて、より複雑なアプリケーションを作成できるようになります。

カプセルは3次元の幾何学的図形で、両端にシリンダーと半球で構成されています。カプセルの体積は、シリンダーの体積と両端に半球の体積を追加することで計算できます。このチュートリアルでは、さまざまな方法を使用して、Javaの特定のカプセルの体積を計算する方法について説明します。 カプセルボリュームフォーミュラ カプセルボリュームの式は次のとおりです。 カプセル体積=円筒形の体積2つの半球体積 で、 R:半球の半径。 H:シリンダーの高さ(半球を除く)。 例1 入力 RADIUS = 5ユニット 高さ= 10単位 出力 ボリューム= 1570.8立方ユニット 説明する 式を使用してボリュームを計算します。 ボリューム=π×R2×H(4
