说明
加密规则:AES-128-ECB
补齐规则:PKCS7
php代码
<?php
/**
* @author aji
*/
namespace utils;
/**
* 加密工具类
*
* 参考网址:https://www.php.net/manual/zh/function.openssl-encrypt.php
* ------------------------------------------------------------------------------------------------------
* 加解密方法 method
* AES-128-CBC (16位Key, 16位iv)
* AES-192-CBC (24位Key, 16位iv)
* AES-256-CBC (32位Key, 16位iv)
* AES-128-ECB (16位Key)
* AES-192-ECB (24位Key)
* AES-256-ECB (32位Key)
* ……
* ------------------------------------------------------------------------------------------------------
* openssl_簇 options
* 0 : 默认模式,自动对数据做 pkcs7 填充, 且返回的加密数据经过 base64 编码
* 1 : OPENSSL_RAW_DATA, 自动对数据做 pkcs7 填充, 且返回的加密数据未经过 base64 编码
* 2 : OPENSSL_ZERO_PADDING, 处理使用 NUL("\0") 的数据,故需手动使用 NUL("\0") 填充好数据再做加密处理,如未做则会报错
* --------------------------------------------------------------------------------------------------------
*/
class Encrypt
{
/**
* var string $method 加解密方法,可通过openssl_get_cipher_methods()获得
*/
private $method;
/**
* var string $secret_key 加解密的密钥
*/
private $key;
/**
* var string $iv 加解密的向量,有些方法需要设置比如CBC
*/
private $iv;
/**
* var string $options (不知道怎么解释,目前设置为0没什么问题)
*/
private $options;
/**
* 构造函数
*
* @param string $key 密钥
* @param string $method 加密方式
* @param mixed $options openssl_簇
* @param string $iv iv向量
*
*/
public function __construct($key = 'ajiSecretKey2020', $method = 'AES-128-ECB', $options = 0, $iv = '')
{
$this->key = $key;
$this->method = $method;
$this->options = $options;
$this->iv = $iv;
}
public function setKey($key)
{
$this->key = $key;
}
public function setMethod($method)
{
$this->method = $method;
}
public function setOptions($options)
{
$this->options = $options;
}
public function setIv($iv)
{
$this->iv = $iv;
}
/**
* 加密方法,对数据进行加密,返回加密后的数据
*
* @param string $data 要加密的数据
* @return string
*/
public function encrypt($data)
{
return openssl_encrypt($data, $this->method, $this->key, $this->options, $this->iv);
}
/**
* 解密方法,对数据进行解密,返回解密后的数据
*
* @param string $data 要解密的数据
* @return string
*/
public function decrypt($data)
{
return openssl_decrypt($data, $this->method, $this->key, $this->options, $this->iv);
}
}
java代码
import javax.crypto.*;
import javax.crypto.spec.*;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
/**
* @author aji
*/
public class Aes {
/**
* 加密
*
* @param value 明文
* @param key 密钥
* @return String
*/
public static String encrypt(String value, String key) {
try {
if (key == null) {
System.out.print("Key为空null");
return null;
}
// 判断Key是否为16位
if (key.length() != 16) {
System.out.print("Key长度不是16位");
return null;
}
byte[] raw = key.getBytes(StandardCharsets.US_ASCII);
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
byte[] encrypted = cipher.doFinal(value.getBytes());
return Base64.getEncoder().encodeToString(encrypted);
} catch (Exception ex) {
System.out.println(ex.toString());
return null;
}
}
/**
* 解密
*
* @param value 密文
* @param key 密钥
* @return String
*/
public static String decrypt(String value, String key) {
try {
// 判断Key是否正确
if (key == null) {
System.out.print("Key为空null");
return null;
}
// 判断Key是否为16位
if (key.length() != 16) {
System.out.print("Key长度不是16位");
return null;
}
byte[] raw = key.getBytes(StandardCharsets.US_ASCII);
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
byte[] encrypted1 = Base64.getDecoder().decode(value);
try {
byte[] original = cipher.doFinal(encrypted1);
return new String(original);
} catch (Exception e) {
System.out.println(e.toString());
return null;
}
} catch (Exception ex) {
System.out.println(ex.toString());
return null;
}
}
}
C#代码
using System;
using System.Security.Cryptography;
using System.Text;
namespace webApp.Utils
{
public class Aes
{
/// <summary>
/// AES加密
/// </summary>
/// <param name="value">明文</param>
/// <param name="key">密钥</param>
/// <returns></returns>
public static string Encrypt(string value, string key)
{
if (string.IsNullOrEmpty(value)) return string.Empty;
if (key == null) throw new Exception("未将对象引用设置到对象的实例。");
if (key.Length != 16) throw new Exception("指定的密钥长度必须为16位。");
var _keyByte = Encoding.UTF8.GetBytes(key);
var _valueByte = Encoding.UTF8.GetBytes(value);
using (var aes = new RijndaelManaged())
{
aes.Key = _keyByte;
aes.Mode = CipherMode.ECB;
aes.Padding = PaddingMode.PKCS7;
var cryptoTransform = aes.CreateEncryptor();
var resultArray = cryptoTransform.TransformFinalBlock(_valueByte, 0, _valueByte.Length);
return Convert.ToBase64String(resultArray, 0, resultArray.Length);
}
}
/// <summary>
/// AES解密
/// </summary>
/// <param name="value">密文</param>
/// <param name="key">密钥</param>
/// <returns></returns>
public static string Decrypt(string value, string key)
{
if (string.IsNullOrEmpty(value)) return string.Empty;
if (key == null) throw new Exception("未将对象引用设置到对象的实例。");
if (key.Length != 16) throw new Exception("指定的密钥长度必须为16位。");
var _keyByte = Encoding.UTF8.GetBytes(key);
var _valueByte = Convert.FromBase64String(value);
using (var aes = new RijndaelManaged())
{
aes.Key = _keyByte;
aes.Mode = CipherMode.ECB;
aes.Padding = PaddingMode.PKCS7;
var cryptoTransform = aes.CreateDecryptor();
var resultArray = cryptoTransform.TransformFinalBlock(_valueByte, 0, _valueByte.Length);
return Encoding.UTF8.GetString(resultArray);
}
}
}
}
本文介绍了如何使用AES-128-ECB加密算法在PHP、Java和C#三种编程语言中进行加密和解密操作。遵循PKCS7填充规则,提供了每种语言的具体实现代码。

7341

被折叠的 条评论
为什么被折叠?



