Aes加密解密,php/java/C#三端通用

本文介绍了如何使用AES-128-ECB加密算法在PHP、Java和C#三种编程语言中进行加密和解密操作。遵循PKCS7填充规则,提供了每种语言的具体实现代码。
说明

加密规则: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);
            }
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值