java基于AES对称加密算法实现的加密与解密功能示例

网友投稿 215 2023-06-20


java基于AES对称加密算法实现的加密与解密功能示例

本文实例讲述了java基于AES对称加密算法实现的加密与解密功能。分享给大家供大家参考,具体如下:

package com.soufun.com;

import java.io.UnsupportedEncodingException;

import java.security.InvalidKeyException;

import java.security.NoSuchAlgorithmException;

import java.security.SecureRandom;

import java.util.Date;

import javax.crypto.BadPaddingException;

import javax.crypto.Cipher;

import javax.crypto.IllegalBlockSizeException;

import javax.crypto.KeyGenerator;

import javax.crypto.NoSuchPaddingException;

import javax.crypto.SecretKey;

import javax.crypto.spec.SecretKeySpec;

/**

* @author WHD

*/

public class AesUtil {

private static final String AES="AES";

private static final String UTF8="UTF-8";

static KeyGenerator kgen =null;

static{

try {

kgen= KbQsfKueyGenerator.getInstance(AES);

} catch (NoSuchAlgorithmException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

/*

* @param content:

* @param password:

*/

private static byte[] encrypt(String content, String password) {

try {

// 使用静态代码块来生成KeyGenerator对象

//KeyGenerator kgen = KeyGenerator.getInstance(AES);

// 使用128 位

kgen.init(128, new SecureRandom(password.getBytes()));

SecretKey secretKey = kgen.generateKey();

byte[] encodeFormat = secretKey.getEncoded();

SecretKeySpec key = new SecretKeySpec(encodeFormat, AES);

// Cipher对象实际完成加密操作

Cipher cipher = Cipher.getInstance(AES);

// 加密内容进行编码

byte[] byteContent = content.getBytes(UTF8);

// 用密匙初始化Cipher对象

cipher.init(Cipher.ENCRYPT_MODE, key);

// 正式执行加密操作

byte[] result = cipher.doFinal(byteContent);

return result;

} catch (NoSuchAlgorithmException e) {

e.printStackTrace();

} catch (NoSuchPaddingException e) {

e.printStackTrace();

} catch (InvalidKeyException e) {

e.printStackTrace();

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

} catch (IllegalBlockSizeException e) {

e.printStackTrace();

} catch (BadPaddingException e) {

e.printStackTrace();

}

return null;

}

/*

* @param content:

* @param password:

*/

private static byte[] decrypt(byte[] content, String password) {

try {// 使用静态代码块来生成KeyGenerator对象

//KeyGenerator kgen = KeyGenerator.getInstance(AES);

// 使用128 位

kgen.init(128, new SecureRandom(password.getBytes()));

SecretKey secretKey = kgen.generateKey();

byte[] encodeFormat = secretKey.getEncoded();

SecretKeySpec key = new SecretKeySpec(encodeFormat, AES);

// Cipher对象实际完成加密操作

Cipher cipher = Cipher.getInstance(AES);

// 用密匙初始化Cipher对象

cipher.init(Cipher.DECRYPT_MODE, key);

// 正式执行解密操作

byte[] result = cipher.doFinal(content);

return result;

} catch (NoSuchAlgorithmException e) {

e.printStackTrace();

} catch (NoSuchPaddingException e) {

e.printStackTrace();

} catch (InvalidKeyException e) {

e.printStackTrace();

} catch (IllegalBlockSizeException e) {

e.printStackTrace();

} catch (BadPaddingException e) {

e.printStackTrace();

}

return null;

}

/**

* 二进制--》十六进制转化

* @param buf

* @return

*/

private static String parseByte2HexStr(byte buf[]) {

StringBuffer sb = new StringBuffer();

for (int i = 0; i < buf.length; i++) {

String hex = Integer.toHexString(buf[i] & 0xFF);

if (hex.length() == 1) {

hex = '0' + hex;

}

sb.append(hex.toUpperCase());

}

return sb.toString();

}

/**

* 十六进制--》二进制转化

* @param hexStr

* @return

*/

private static byte[] parseHexStr2Byte(String hexStr) {

if (hexStr.length() < 1) {

return null;

}

byte[] result = new byte[hexStr.length() / 2];

for (int i = 0; i < hexStr.length() / 2; i++) {

int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);

int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2),

16);

result[i] = (byte) (high * 16 + low);

}

return result;

}

public static void main(String[] args) throws UnsupportedEncodingException {

long begin=new Date().getTime();

String content = "aaades加密测试";

String password = "12345678dd";

// 加密

System.out.println("加密前:" + content);

byte[] encryptResult = encrypt(content, password);

String encryptResultStr = parseByte2HexStr(encryptResult);

System.out.println("加密后:" + encryptResultStr);

// 解密

byte[] decryptFrom = parseHexStr2Byte(encryptResultStr);

byte[] decryptResult = decrypt(decryptFrom, password);

// 解密内容进行解码

String result = new String(decryptResult, UTF8);

System.out.println("解密后:" + result);

long end= new Date().getTime();

System.out.println(end-begin);

}

}

注:SecureRandom是生成安全随机数序列,password.getBytes()是种子,只要种子相同,序列就一样,所以解密只要有password就行,可以复原这个序列。

PS:关于加密解密感兴趣的朋友还可以参考本站在线工具:

密码安全性在线检测:

http://tools.jb51.net/password/my_password_safe

高强度密码生成器:

http://tools.jb51.net/password/CreateStrongPassword

迅雷、快车、旋风URL加密/解密工具:

http://tools.jb51.net/password/urlrethunder

在线散列/哈希算法加密工具:

http://tools.jb51.net/password/hash_encrypt

在线MD5/hash/SHA-1/SHA-2/SHA-256/SHA-512/SHA-3/RIPEMD-160加密工具:

http://tools.jb51.net/password/hash_md5_sha

在线sha1/sha224/sha256/sha384/sha512加密工具:

http://tools.jb51.net/password/sha_encode

希望本文所述对大家java程序设计有所帮助。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:java基于Des对称加密算法实现的加密与解密功能详解
下一篇:详解Java利用实现对称加密(DES、3DES、AES)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~