php aes加解密?

public class AESUtil {

private static String key = "test";

public static String encrypt(String content, String key) {

try {

KeyGenerator kgen = KeyGenerator.getInstance("AES");

kgen.init(128, new SecureRandom(key.getBytes()));

SecretKey secretKey = kgen.generateKey();

byte[] enCodeFormat = secretKey.getEncoded();

SecretKeySpec secretKeySpec = new SecretKeySpec(enCodeFormat, "AES");

Cipher cipher = Cipher.getInstance("AES");

byte[] byteContent = content.getBytes("utf-8");

cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);

byte[] byteRresult = cipher.doFinal(byteContent);

StringBuffer sb = new StringBuffer();

for (int i = 0; i < byteRresult.length; i++) {

String hex = Integer.toHexString(byteRresult[i] & 0xFF);

if (hex.length() == 1) {

hex = '0' + hex;

}

sb.append(hex.toUpperCase());

}

return sb.toString();

} catch (NoSuchAlgorithmException e) {

e.printStackTrace();

} catch (NoSuchPaddingException e) {

e.printStackTrace();

} catch (InvalidKeyException e) {

e.printStackTrace();

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

} catch (IllegalBlockSizeException e) {

e.printStackTrace();

} catch (BadPaddingException e) {

e.printStackTrace();

}

return null;

}

/**

* 解密

*

* @param content

* 待解密内容

* @param key

* 解密的密钥

* @return

*/

public static String decrypt(String content, String key) {

if (content.length() < 1)

return null;

byte[] byteRresult = new byte[content.length() / 2];

for (int i = 0; i < content.length() / 2; i++) {

int high = Integer

.parseInt(content.substring(i * 2, i * 2 + 1), 16);

int low = Integer.parseInt(content.substring(i * 2 + 1, i * 2 + 2),

16);

byteRresult[i] = (byte) (high * 16 + low);

}

try {

KeyGenerator kgen = KeyGenerator.getInstance("AES");

SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");

secureRandom.setSeed(key.getBytes());

kgen.init(128, secureRandom);

SecretKey secretKey = kgen.generateKey();

byte[] enCodeFormat = secretKey.getEncoded();

SecretKeySpec secretKeySpec = new SecretKeySpec(enCodeFormat, "AES");

Cipher cipher = Cipher.getInstance("AES");

cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);// Decrypt_mode指解密操作

byte[] result = cipher.doFinal(byteRresult);

return new String(result, "utf-8");// 不加utf-8,中文时会乱码

} catch (NoSuchAlgorithmException e) {

e.printStackTrace();

} catch (NoSuchPaddingException e) {

e.printStackTrace();

} catch (InvalidKeyException e) {

e.printStackTrace();

} catch (IllegalBlockSizeException e) {

e.printStackTrace();

} catch (BadPaddingException e) {

e.printStackTrace();

} catch (Exception e) {

e.printStackTrace();

}

return null;

}

// 重载的方法,使用默认密钥

public static String decrypt(String content) {

return decrypt(content, key);

}

public static String encrypt(String content) {

return encrypt(content, key);

}

}

如上的java实现的aes加解密,如何用php实现同样的aes加解密效果?


回答:

其实java实现的aes加解密已经足够安全以下的代码你可以参考一下

class AESUtil

{

private static $key = "test"; // 默认密钥

/**

* 加密函数

*

* @param string $content 要加密的数据

* @param string|null $key 加密使用的密钥,如果未指定,则使用默认密钥

* @return string 加密后的十六进制字符串

*/

public static function encrypt($content, $key = null)

{

if (is_null($key)) { // 如果未指定密钥,则使用默认密钥

$key = self::$key;

}

// 生成随机的初始化向量(IV)

$iv_size = openssl_cipher_iv_length('AES-128-CBC');

$iv = openssl_random_pseudo_bytes($iv_size);

// 对数据进行加密

$encrypted_data = openssl_encrypt($content, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv);

// 将 IV 和加密后的数据连接起来,作为输出的结果

$data_with_iv = $iv . $encrypted_data;

return strtoupper(bin2hex($data_with_iv)); // 将结果转换为十六进制字符串并返回

}

/**

* 解密函数

*

* @param string $content 要解密的数据(十六进制字符串)

* @param string|null $key 解密使用的密钥,如果未指定,则使用默认密钥

* @return string 解密后的数据

*/

public static function decrypt($content, $key = null)

{

if (is_null($key)) { // 如果未指定密钥,则使用默认密钥

$key = self::$key;

}

// 将输入的十六进制字符串转换为二进制数据

$data_with_iv = hex2bin($content);

// 从数据中提取 IV 和加密的数据

$iv_size = openssl_cipher_iv_length('AES-128-CBC');

$iv = substr($data_with_iv, 0, $iv_size);

$encrypted_data = substr($data_with_iv, $iv_size);

// 对数据进行解密

$decrypted_data = openssl_decrypt($encrypted_data, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv);

return $decrypted_data; // 返回解密后的数据

}

}

// 使用示例

$plaintext = "Hello, World!";

$encrypted_text = AESUtil::encrypt($plaintext);

$decrypted_text = AESUtil::decrypt($encrypted_text);

echo "原文: " . $plaintext . PHP_EOL;

echo "加密后: " . $encrypted_text . PHP_EOL;

echo "解密后: " . $decrypted_text . PHP_EOL;

输出

原文: Hello, World!

加密后: 992187E67DA8ABA4DDDACF873DA6FE13

解密后: Hello, World!

这段代码是我修改后的代码,用 PHP 使用了AES-128-CBC加密模式,并生成一个随机的IV向量作为参数传递给加解密函数。在加密时,将IV向量和加密后的数据一起进行编码,解密时先将编码后的字符串解码成IV向量和密文,然后再进行解密。这个代码可以得到与Java实现的AES加解密相同的结果。你可以试一试

以上是 php aes加解密? 的全部内容, 来源链接: utcz.com/p/945066.html

回到顶部