1 /*
2 *3 *4 *5 *6 */
7 packageweaver.interfaces.encode;8
9 importjava.security.SecureRandom;10
11 importjavax.crypto.Cipher;12 importjavax.crypto.KeyGenerator;13 importjavax.crypto.SecretKey;14 importjavax.crypto.spec.SecretKeySpec;15
16 importweaver.general.Base64;17 importweaver.integration.logging.Logger;18 importweaver.integration.logging.LoggerFactory;19
20 /**
21 * AES加密解密,Base64转码22 *@authorchengf23 *24 */
25 public class AES_Base64 implementsIEncode {26 /**
27 * 系统集成日志对象,用于统一输出日志到系统集成日志文件中。28 */
29 private static Logger newlog = LoggerFactory.getLogger(AES_Base64.class);30
31 /**
32 * 密码33 */
34 private String pwd = null;35
36 /**
37 * 构造器38 */
39 publicAES_Base64() {40
41 }42
43 /**
44 * 构造器45 *@parampwd 密码46 */
47 publicAES_Base64(String pwd) {48 this.pwd =pwd;49 }50
51 /**
52 * 将传入的明文转换为密文53 *54 *@paramstr 明文字符串55 *@return加密后的密文56 */
57 publicString encode(String str) {58 byte[] result = null;59 try{60 KeyGenerator kgen = KeyGenerator.getInstance("AES");61 SecureRandom random = SecureRandom.getInstance("SHA1PRNG");62 if (pwd == null) {63 pwd = "ecology9";64 }65 random.setSeed(pwd.getBytes());66 kgen.init(128, random);67 SecretKey secretKey =kgen.generateKey();68 byte[] enCodeFormat =secretKey.getEncoded();69 SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");70
71 //创建密码器
72 Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");73 cipher.init(Cipher.ENCRYPT_MODE, key);74 byte[] byteContent =str.getBytes();75 result =cipher.doFinal(byteContent);76
77 } catch(Exception e) {78 newlog.error("加密异常!", e);79 return null;80 }81
82 return newString(Base64.encode(result));83 }84
85 /**
86 * 将传入的密文转换为明文87 *88 *@paramstr 密文字符串89 *@return解密后的明文90 */
91 publicString decode(String str) {92 byte[] result = null;93 byte[] content =Base64.decode(str.getBytes());94 try{95 KeyGenerator kgen = KeyGenerator.getInstance("AES");96 SecureRandom random = SecureRandom.getInstance("SHA1PRNG");97 if (pwd == null) {98 pwd = "ecology9";99 }100 random.setSeed(pwd.getBytes());101 kgen.init(128, random);102 SecretKey secretKey =kgen.generateKey();103 byte[] enCodeFormat =secretKey.getEncoded();104 SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");105
106 //创建密码器
107 Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");108 cipher.init(Cipher.DECRYPT_MODE, key);109 result =cipher.doFinal(content);110
111 } catch(Exception e) {112 newlog.error("解密异常!", e);113 return null;114 }115
116 return newString(result);117 }118
119 /**
120 * 设置加密和解密的密钥121 *122 *@parampwd 加密密钥123 *@returntrue:成功,false:失败124 */
125 public booleansetPwd(String pwd) {126 this.pwd =pwd;127 return true;128 }129
130 /**
131 * 设置加密和解密的向量132 *@paramiv 加密向量133 *@returntrue:成功,false:失败134 */
135 public booleansetIv(String iv) {136 return true;137 }138
139 /**
140 * 主程序141 *@paramargs 参数142 */
143 public static voidmain(String[] args) {144 AES_Base64 aesBase64 = newAES_Base64();145 String content = "测试test";146 //AES的密钥长度最好是16位(不是必须)
147 String password = "ecology9";148 aesBase64.setPwd(password);149 //加密150 //System.out.println("加密前:" + content);
151 String encodeResultStr =aesBase64.encode(content);152 //System.out.println("加密后:" + encodeResultStr);153 //解密
154 String decodeResultStr =aesBase64.decode(encodeResultStr);155 //System.out.println("解密后:" + decodeResultStr);
156 }157
158 }
然后对应封装了一个PHP类:
PHP代码
class AES {
//PKCS5Padding 补码方式
private function _pkcs5Pad($text, $blockSize) {
$pad = $blockSize - (strlen($text) % $blockSize);
return $text . str_repeat(chr($pad), $pad);
}
private function _pkcs5Unpad($text) {
$end = substr($text, -1);
$last = ord($end);
$len = strlen($text) - $last;
if(substr($text, $len) == str_repeat($end, $last)) {
return substr($text, 0, $len);
}
return false;
}
//加密
public function encrypt($encrypt, $key) {
$blockSize = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
$paddedData = $this->_pkcs5Pad($encrypt, $blockSize);
$ivSize = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($ivSize, MCRYPT_RAND);
$key2 = substr(openssl_digest(openssl_digest($key, 'sha1', true), 'sha1', true),0,16);
$encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key2, $paddedData, MCRYPT_MODE_ECB, $iv);
return base64_encode($encrypted);
}
//解密
public function decrypt($decrypt, $key) {
$decoded = base64_decode($decrypt);
$blockSize = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($blockSize, MCRYPT_RAND);
$key2 = substr(openssl_digest(openssl_digest($key, 'sha1', true), 'sha1', true), 0, 16);
$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key2, $decoded, MCRYPT_MODE_ECB, $iv);
return $this->_pkcs5Unpad($decrypted);
}
}
参考: