如何將Java AES加密算法轉換為PHP7實現?

如何將Java AES加密算法轉換為PHP7實現?

Java AES加密算法移植到php7

本文闡述如何將一段Java代碼實現的AES加密算法轉換為php7版本。Java代碼使用Base64編碼返回加密結果,密鑰生成方式獨特,需要仔細對應。

原始Java代碼片段:

public static String encrypt(String str, String secretkey) {     try {         Cipher cipher = Cipher.getInstance("AES");         cipher.init(Cipher.ENCRYPT_MODE, getKey(secretkey));         byte[] result = cipher.doFinal(str.getBytes());         return Base64.encodeBase64String(result);     } catch (Exception e) {         logger.error(e.getMessage(), e);     }     return ""; }  private static Key getKey(String secretkey) {     try {         KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");         SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");         secureRandom.setSeed(secretkey.getBytes());         keyGenerator.init(128, secureRandom);         SecretKey secretKey = keyGenerator.generateKey();         byte[] byteKey = secretKey.getEncoded();         return new SecretKeySpec(byteKey, "AES");     } catch (Exception e) {         logger.error(e.getMessage(), e);         return null;     } }

這段Java代碼的核心是使用SecretKeySpec生成密鑰,并用Cipher進行AES加密,最后Base64編碼輸出結果。在PHP中,我們需要類似步驟實現相同的加密功能。

立即學習PHP免費學習筆記(深入)”;

PHP中使用openssl_encrypt函數進行AES加密。密鑰生成方面,PHP的openssl_random_pseudo_bytes函數生成隨機數,結合hash函數可以從提供的secretkey生成128位密鑰。 Java代碼使用SHA1PRNG作為隨機數生成器,PHP中需要確保密鑰生成的隨機性以保證安全性。Base64編碼使用base64_encode函數。

對應的PHP代碼如下(需根據實際情況調整):

<?php function encrypt($str, $secretKey) {     $key = substr(hash('sha256', $secretKey), 0, 32); // 生成256位密鑰 (AES-256)     $iv = openssl_random_pseudo_bytes(16); // 生成16字節的IV (AES-256)     $encrypted = openssl_encrypt($str, 'aes-256-cbc', $key, OPENSSL_RAW_DATA, $iv); // 使用OPENSSL_RAW_DATA避免填充     return base64_encode($encrypted . $iv); // 加密結果和IV拼接后Base64編碼 }  // 示例用法 $secretKey = "your_secret_key"; // 請替換為你的密鑰 $plaintext = "your_plaintext"; // 請替換為你的明文 $encrypted = encrypt($plaintext, $secretKey); echo $encrypted; ?>

這段PHP代碼使用了aes-256-cbc模式(為了更強的安全性,建議使用256位密鑰),并將生成的初始化向量(IV)與加密結果拼接后Base64編碼,方便解密時還原。 Java代碼中未明確指定加密模式,這里假設為CBC模式。如果Java代碼使用了其他模式,需要相應調整PHP代碼。請務必將your_secret_key和your_plaintext替換為實際值。注意密鑰的安全性,避免密鑰泄露。 使用OPENSSL_RAW_DATA選項可以避免openssl自動添加填充,與Java的doFinal行為更一致。

為了與Java代碼的密鑰生成方式更接近,可以使用以下改進的PHP密鑰生成方法:

function generateKey($secretKey) {     $seed = hash('sha256', $secretKey, true); // 使用hash生成seed,并確保結果為二進制字符串     $secureRandom = new OpenSSLRandomSource; // 使用OpenSSL自帶的隨機數生成器     $key = $secureRandom->generate(16); // 生成16字節的密鑰 (AES-128)     return $key; }

然后在encrypt函數中使用$key = generateKey($secretKey);來生成密鑰。 這更貼近Java中使用SecureRandom和SHA1PRNG的方式,但仍然建議使用aes-256-cbc以獲得更高的安全性。 記住,安全可靠的密鑰管理至關重要。

? 版權聲明
THE END
喜歡就支持一下吧
點贊10 分享