PHP 加密处理代码
public static function encrypt($key, $data) {
try {
$textBytes = getBytes($data);
$padBytes = PKCS7Encoder::encode(count($textBytes));
$data_message = array_merge($textBytes, $padBytes);
$data_message = vsprintf(str_repeat('%c', count($data_message)), $data_message);
$keys = self::string2Byte($key);
$keys = base64_encode(vsprintf(str_repeat('%c', count($keys)), $keys));
$iv = array_slice(self::decodeBase64($key), 0, 16);
$iv = base64_encode(vsprintf(str_repeat('%c', count($iv)), $iv));
$encrypt_message = openssl_encrypt(
$data_message,
"aes-128-cbc",
base64_decode($keys),
OPENSSL_NO_PADDING,
base64_decode($iv)
);
$encrypt_message = getBytes($encrypt_message);
$encrypt_message = base64_encode(vsprintf(str_repeat('%c', count($encrypt_message)), $encrypt_message));
return $encrypt_message;
} catch (\Exception $e) {
throw new CustomApiException('加密处理失败');
}
}
PHP 解密处理方法
public static function decrypt($string, $key) {
try {
$keys = self::string2Byte($key);
$keys = vsprintf(str_repeat('%c', count($keys)), $keys);
$desc = getBytes(base64_decode($string));
$decrypt = vsprintf(str_repeat('%c', count($desc)), $desc);
$aesKey = array_slice(self::decodeBase64($key), 0, 16);
$iv = base64_encode(vsprintf(str_repeat('%c', count($aesKey)), $aesKey));
$decrypt_message = openssl_decrypt(
$decrypt,
"aes-128-cbc",
$keys,
OPENSSL_NO_PADDING,
base64_decode($iv)
);
$decrypt_message = getBytes($decrypt_message);
$decrypt_message = PKCS7Encoder::decode($decrypt_message);
$decrypt_message = vsprintf(str_repeat('%c', count($decrypt_message)), $decrypt_message);
return $decrypt_message;
} catch (\Exception $e) {
writeErrLogs('解密处理失败:', $e);
throw new CustomApiException('解密处理失败');
}
}
Java加密方法
public static String encrypt(String key, String data) {
try {
ByteGroup byteCollector = new ByteGroup();
byte[] textBytes = data.getBytes(CHARSET);
byteCollector.addBytes(textBytes);
byte[] padBytes = PKCS7Encoder.encode(byteCollector.size());
byteCollector.addBytes(padBytes);
byte[] unencrypted = byteCollector.toBytes();
byte[] aesKey = WdBase64.decodeBase64(key);
Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
SecretKeySpec keySpec = new SecretKeySpec(string2Byte(key), "AES");
IvParameterSpec iv = new IvParameterSpec(aesKey, 0, 16);
cipher.init(1, keySpec, iv);
byte[] encrypted = cipher.doFinal(unencrypted);
return WdBase64.encodeBase64String(encrypted);
} catch (Throwable var11) {
throw var11;
}
}
Java解密方法
public static String decrypt(String key, String data) {
try {
Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
byte[] aesKey = WdBase64.decodeBase64(key);
SecretKeySpec key_spec = new SecretKeySpec(string2Byte(key), "AES");
IvParameterSpec iv = new IvParameterSpec(Arrays.copyOfRange(aesKey, 0, 16));
cipher.init(2, key_spec, iv);
byte[] encrypted = WdBase64.decodeBase64(data);
byte[] original = cipher.doFinal(encrypted);
byte[] bytes = PKCS7Encoder.decode(original);
return new String(bytes, CHARSET);
} catch (Throwable var9) {
throw var9;
}
}
PHP封装方法
function arrayCopy($src = [], $srcPos = 0, $dest = [], $destPos = 0, $length = 0)
{
$src = array_slice($src, $srcPos, $length);
$length_end = $destPos + $length;
for ($i= $destPos; $i< $length_end; $i++) {
$dest[$i] = $src[$i-$destPos];
}
unset($value);
return $dest;
}
function getBytes($string)
{
$bytes = array();
for($i = 0; $i < strlen($string); $i++){
if(ord($string[$i]) >= 128){
$byte = ord($string[$i]) - 256;
}else{
$byte = ord($string[$i]);
}
$bytes[] = $byte;
}
return $bytes;
}
function toByte($num)
{
$num=decbin($num);
$num=substr($num,-8);
$sign= $num[0];
if($sign==1 && strlen($num) == 8) {
return bindec($num)-256;
}
return bindec($num);
}
public static function string2Byte($str) {
$result = [];
$count = strlen($str) / 2;
for($i = 0; $i < $count; ++$i) {
$b = ((self::getStrIndex($str[2 * $i]) & 15) << 4 | self::getStrIndex($str[2 * $i + 1]) & 15);
$result[$i] = $b;
}
return $result;
}
public static function getStrIndex($c) {
return $c > '9' ? 10 + ($c - 97) : $c - 48;
}
PKCS7
class PKCS7Encoder
{
private static $BLOCK_SIZE = 32;
private static $CHARSET = "utf-8";
public static function encode($count) {
$amountToPad = self::$BLOCK_SIZE - $count % self::$BLOCK_SIZE;
if ($amountToPad == 0) {
$amountToPad = self::$BLOCK_SIZE;
}
$tmp = [];
for ($index = 0; $index < $amountToPad; ++$index) {
$tmp[] = $amountToPad;
}
return $tmp;
}
public static function decode($decrypted) {
$pad = $decrypted[count($decrypted) - 1];
if ($pad < 1 || $pad > 32) {
$pad = 0;
}
return array_slice($decrypted, 0, count($decrypted) - $pad);
}
}
示例代码
$key = "11111111111111111111111111111111";
$data = "你知道跑是啊实打实的阿斯顿阿斯顿阿萨的";
$encrypt_message = 'qotHLbzsDXKDBW1xzgvp7FjLuj/u+3VFzii+ebCTAa4NJJlsM7sFo7NpLKiIg4935p0kFJNjMNHpaPKFpivjiQ==';
$b = [
'加密数据:' => AESUtils::encrypt($key, $data),
'解密数据:' => AESUtils::decrypt($encrypt_message, $key)
];
return $b;