本文闡述如何將一段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以獲得更高的安全性。 記住,安全可靠的密鑰管理至關重要。