php android openssl

时间:2019-08-22 09:00:32 阅读:44次
php android openssl
<?php
class EasyAESCrypt {
	private $iv;
	private $key;
	private $bit; //Only can use 128, 256
	function __construct($key, $bit = 128, $iv = "") {
		// gen key
		if($bit == 256){
			$this->key = hash('SHA256', $key, true);
		}else{
			$this->key = hash('MD5', $key, true);
		}

		// gen iv
		if($iv != ""){
			$this->iv = hash('MD5', $iv, true);
		}else{
			$this->iv = chr(0).chr(0).chr(0).chr(0).chr(0).chr(0).chr(0).chr(0).chr(0).chr(0).chr(0).chr(0).chr(0).chr(0).chr(0).chr(0); //IV is not set. It doesn't recommend.
		}
	}

	function encrypt($str) {
		if(version_compare(PHP_VERSION,'7.0.0','ge')) {
			return $this->opensslEncrypt($str);
		} else {
			return $this->mcryptEncrypt($str);
		}
	}

	function decrypt($str) {
		if(version_compare(PHP_VERSION,'7.0.0','ge')) {
			return $this->opensslDecrypt($str);
		} else {
			return $this->mcryptDecrypt($str);
		}
	}

	private function opensslEncrypt($str) {
		$data = openssl_encrypt($str, 'AES-128-CBC', $this->key, OPENSSL_RAW_DATA, $this->iv);
		return base64_encode($data);
	}

	private function opensslDecrypt($str) {
		$decrypted = openssl_decrypt(base64_decode($str), 'AES-128-CBC', $this->key, OPENSSL_RAW_DATA, $this->iv);
		return $decrypted;
	}
	
	private function mcryptEncrypt($str) {
		//Open
		$module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');
		mcrypt_generic_init($module, $this->key, $this->iv);

		//Padding
		$block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC); //Get Block Size
		$pad = $block - (strlen($str) % $block); //Compute how many characters need to pad
		$str .= str_repeat(chr($pad), $pad); // After pad, the str length must be equal to block or its integer multiples

		//Encrypt
		$encrypted = mcrypt_generic($module, $str);

		//Close
		mcrypt_generic_deinit($module);
		mcrypt_module_close($module);

		//Return
		return base64_encode($encrypted);
	}

	private function mcryptDecrypt($str) {
		//Open 
		$module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');
		mcrypt_generic_init($module, $this->key, $this->iv);

		//Decrypt
		$str = mdecrypt_generic($module, base64_decode($str)); //Get original str

		//Close
		mcrypt_generic_deinit($module);
		mcrypt_module_close($module);

		//Depadding
		$slast = ord(substr($str, -1)); //pad value and pad count
		$str = substr($str, 0, strlen($str) - $slast);

		//Return
		return $str;           
	}
}

Android

import android.util.Base64;

import java.security.Key;
import java.security.MessageDigest;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

/**
 * AES 加解密
 *
 * @author pkuoliver
 * @see Base64
 */
public class EasyAES {
 
	//-----类别常数-----
	/**
	 * 预设的Initialization Vector,为16 Bits的0
	 */
	private static final IvParameterSpec DEFAULT_IV = new IvParameterSpec(new byte[]{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0});
	/**
	 * 加密演算法使用AES
	 */
	private static final String ALGORITHM = "AES";
	/**
	 * AES使用CBC模式与PKCS5Padding
	 */
	private static final String TRANSFORMATION = "AES/CBC/PKCS5Padding";
 
	//-----成员变量-----
	/**
	 * 取得AES加解密的秘钥
	 */
	private Key key;
	/**
	 * AES CBC模式使用的Initialization Vector
	 */
	private IvParameterSpec iv;
	/**
	 * Cipher 物件
	 */
	private Cipher cipher;
 
	/**
	 * 构造函数,使用128 Bits的AES秘钥(计算任意长度秘钥的MD5)和预设IV
	 *
	 * @param key 传入任意长度的AES秘钥
	 */
	public EasyAES(final String key) {
		this(key, 128);
	}
 
	/**
	 * 构造函数,使用128 Bits或是256 Bits的AES秘钥(计算任意长度秘钥的MD5或是SHA256)和预设IV
	 *
	 * @param key 传入任意长度的AES秘钥
	 * @param bit 传入AES秘钥长度,数值可以是128、256 (Bits)
	 */
	public EasyAES(final String key, final int bit) {
		this(key, bit, null);
	}
 
	/**
	 * 构造函数,使用128 Bits或是256 Bits的AES秘钥(计算任意长度秘钥的MD5或是SHA256),用MD5计算IV值
	 *
	 * @param key 传入任意长度的AES秘钥
	 * @param bit 传入AES秘钥长度,数值可以是128、256 (Bits)
	 * @param iv 传入任意长度的IV字串
	 */
	public EasyAES(final String key, final int bit, final String iv) {
		if (bit == 256) {
			this.key = new SecretKeySpec(getHash("SHA-256", key), ALGORITHM);
		} else {
			this.key = new SecretKeySpec(getHash("MD5", key), ALGORITHM);
		}
		if (iv != null) {
			this.iv = new IvParameterSpec(getHash("MD5", iv));
		} else {
			this.iv = DEFAULT_IV;
		}
 
		init();
	}
 
	//-----物件方法-----
	/**
	 * 取得字串的Hash值
	 *
	 * @param algorithm 传入散列算法
	 * @param text 传入要散列的字串
	 * @return 传回散列后內容
	 */
	private static byte[] getHash(final String algorithm, final String text) {
		try {
			return getHash(algorithm, text.getBytes("UTF-8"));
		} catch (final Exception ex) {
			throw new RuntimeException(ex.getMessage());
		}
	}
 
	/**
	 * 取得资料的Hash值
	 *
	 * @param algorithm 传入散列算法
	 * @param data 传入要散列的资料
	 * @return 传回散列后內容
	 */
	private static byte[] getHash(final String algorithm, final byte[] data) {
		try {
			final MessageDigest digest = MessageDigest.getInstance(algorithm);
			digest.update(data);
			return digest.digest();
		} catch (final Exception ex) {
			throw new RuntimeException(ex.getMessage());
		}
	}
 
	/**
	 * 初始化
	 */
	private void init() {
		try {
			cipher = Cipher.getInstance(TRANSFORMATION);
		} catch (final Exception ex) {
			throw new RuntimeException(ex.getMessage());
		}
	}
 
	/**
	 * 加密文字
	 *
	 * @param str 传入要加密的文字
	 * @return 传回加密后的文字
	 */
	public String encrypt(final String str) {
		try {
			return encrypt(str.getBytes("UTF-8"));
		} catch (final Exception ex) {
			throw new RuntimeException(ex.getMessage());
		}
	}
 
	/**
	 * 加密资料
	 *
	 * @param data 传入要加密的资料
	 * @return 传回加密后的资料
	 */
	public String encrypt(final byte[] data) {
		try {
			cipher.init(Cipher.ENCRYPT_MODE, key, iv);
			final byte[] encryptData = cipher.doFinal(data);
			return new String(Base64.encode(encryptData, Base64.DEFAULT), "UTF-8");
		} catch (final Exception ex) {
			throw new RuntimeException(ex.getMessage());
		}
	}
 
	/**
	 * 解密文字
	 *
	 * @param str 传入要解密的文字
	 * @return 传回解密后的文字
	 */
	public String decrypt(final String str) {
		try {
			return decrypt(Base64.decode(str, Base64.DEFAULT));
		} catch (final Exception ex) {
			throw new RuntimeException(ex.getMessage());
		}
	}
 
	/**
	 * 解密文字
	 *
	 * @param data 传入要解密的资料
	 * @return 传回解密后的文字
	 */
	public String decrypt(final byte[] data) {
		try {
			cipher.init(Cipher.DECRYPT_MODE, key, iv);
			final byte[] decryptData = cipher.doFinal(data);
			return new String(decryptData, "UTF-8");
		} catch (final Exception ex) {
			throw new RuntimeException(ex.getMessage());
		}
	}
	
	public static String encryptString(String content) {
		//这里填写密码和iv字符串,注意要确保16位的
		EasyAES ea = new EasyAES("****************", 128, "################");
		return ea.encrypt(content);
	}
	
	public static String decryptString(String content) {
        String result = null;
		try {
			//这里填写密码和iv字符串,注意要确保16位的
			EasyAES ea = new EasyAES("****************", 128, "################");
			result = ea.decrypt(content);
		} catch(Exception ex) {
			ex.printStackTrace();
		}
		return result;
	}
}


地址

https://github.com/pkuoliver/EasyAES

扫描二维码关注程序员爱笔记,接收更多资讯

评论

快速评论