package com.joye3g.ed;
public class Main {
public static void main(String[] args) throws Exception {
// initThreeDES();
// initAES();
// initRSA();
// initMD5();
// initSHA();
initHMAC();
}
public static void initThreeDES(){
ThreeDES des = new ThreeDES();
String msg = "安全编程技术_加密解密";
System.out.println("明文是" + msg);
byte[] enc = des.createEncryptor(msg);
System.out.println("密文是" + new String(enc));
byte[] dec = des.createDecryptor(enc);
System.out.println("解密后的结果是" + new String(dec));
}
public static void initAES(){
AES aes = new AES();
String msg = "安全编程技术_加密解密";
System.out.println("明文是" + msg);
byte[] enc = aes.createEncryptor(msg);
System.out.println("密文是" + new String(enc));
byte[] dec = aes.createDecryptor(enc);
System.out.println("解密后的结果是" + new String(dec));
}
public static void initRSA(){
RSA rsa = new RSA();
String msg = "安全编程技术_加密解密";
System.out.println("明文是:" + msg);
//用公钥加密
byte[] srcBytes = msg.getBytes();
byte[] resultBytes = rsa.encrypt(srcBytes);
String result = new String(resultBytes);
System.out.println("用公钥加密后密文是:" + result);
//用私钥解密
byte[] decBytes = rsa.decrypt(resultBytes);
String dec = new String(decBytes);
System.out.println("用私钥解密后结果是:" + dec);
}
public static void initMD5(){
String msg = "安全编程技术_加密解密";
System.out.println("明文是" + msg);
MD5 md5 = new MD5();
byte[] resultBytes = md5.encrypt(msg);
String result = new String(resultBytes);
System.out.println("密文是" + result);
}
public static void initSHA(){
String msg = "安全编程技术_加密解密";
System.out.println("明文是" + msg);
SHA sha = new SHA();
byte[] resultBytes = sha.encrypt(msg);
String result = new String(resultBytes);
System.out.println("密文是" + result);
}
public static void initHMAC(){
//要计算消息验证码的字符串
String str="安全编程技术_加密解密";
System.out.println("明文是:" + str);
HMAC hmac = new HMAC();
byte[] certifyCode = hmac.createEncryptor(str);
System.out.println("密文是:" + new String(certifyCode));
}
}
AES:
package com.joye3g.ed;
import java.security.NoSuchAlgorithmException;
import java.security.Security;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
public class AES {
// KeyGenerator提供对称密钥生成器的功能,支持各种算法
private KeyGenerator keyGenerator;
// SecretKey负责保存对称密钥
private SecretKey secretKey;
// Cipher负责完成加密或解密工作
private Cipher cipher;
// 该字节数组负责保存加密的结果
private byte[] cipherByte;
@SuppressWarnings("restriction")
public AES() {
Security.addProvider(new com.sun.crypto.provider.SunJCE());
// 实例化支持AES算法的密钥生成器,算法名称用AES
try {
keyGenerator = KeyGenerator.getInstance("AES");
// 生成密钥
secretKey = keyGenerator.generateKey();
// 生成Cipher对象,指定其支持AES算法
cipher = Cipher.getInstance("AES");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
}
}
/* 对字符串str加密 */
public byte[] createEncryptor(String str) {
try {
// 根据密钥对Cipher对象进行初始化,ENCRYPT_MODE表示加密模式
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] src = str.getBytes();
// 将加密结果保存进cipherByte
cipherByte = cipher.doFinal(src);
} catch (java.security.InvalidKeyException ex) {
ex.printStackTrace();
} catch (javax.crypto.BadPaddingException ex) {
ex.printStackTrace();
} catch (javax.crypto.IllegalBlockSizeException ex) {
ex.printStackTrace();
}
return cipherByte;
}
/* 对字节数组buff解密 */
public byte[] createDecryptor(byte[] buff) {
try {
// 根据密钥对Cipher对象进行初始化,ENCRYPT_MODE表示解密模式
cipher.init(Cipher.DECRYPT_MODE, secretKey);
// 将得到明文存入cipherByte字符数组
cipherByte = cipher.doFinal(buff);
} catch (java.security.InvalidKeyException ex) {
ex.printStackTrace();
} catch (javax.crypto.BadPaddingException ex) {
ex.printStackTrace();
} catch (javax.crypto.IllegalBlockSizeException ex) {
ex.printStackTrace();
}
return cipherByte;
}
}
DES:
package com.joye3g.ed;
import java.security.NoSuchAlgorithmException;
import java.security.Security;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
public class DES {
// KeyGenerator提供对称密钥生成器的功能,支持各种算法
private KeyGenerator keyGenerator;
// SecretKey负责保存对称密钥
private SecretKey secretKey;
// Cipher负责完成加密或解密工作
private Cipher cipher;
// 该字节数组负责保存加密的结果
private byte[] cipherByte;
@SuppressWarnings("restriction")
public DES() {
Security.addProvider(new com.sun.crypto.provider.SunJCE());
try {
// 实例化支持DES算法的密钥生成器(算法名称命名需按规定,否则抛出异常)
keyGenerator = KeyGenerator.getInstance("DES");
// 生成密钥
secretKey = keyGenerator.generateKey();
// 生成Cipher对象,指定其支持DES算法
cipher = Cipher.getInstance("DES");
} catch (NoSuchAlgorithmException ex) {
ex.printStackTrace();
} catch (NoSuchPaddingException ex) {
ex.printStackTrace();
}
}
/* 对字符串str加密 */
public byte[] createEncryptor(String str) {
try {
// 根据密钥对Cipher对象进行初始化,ENCRYPT_MODE表示加密模式
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] src = str.getBytes();
// 将加密结果保存进cipherByte
cipherByte = cipher.doFinal(src);
} catch (java.security.InvalidKeyException ex) {
ex.printStackTrace();
} catch (javax.crypto.BadPaddingException ex) {
ex.printStackTrace();
} catch (javax.crypto.IllegalBlockSizeException ex) {
ex.printStackTrace();
}
return cipherByte;
}
/* 对字节数组buff解密 */
public byte[] createDecryptor(byte[] buff) {
try {
// 根据密钥对Cipher对象进行初始化,ENCRYPT_MODE表示解密模式
cipher.init(Cipher.DECRYPT_MODE, secretKey);
// 将得到的明文存入cipherByte字符数组
cipherByte = cipher.doFinal(buff);
} catch (java.security.InvalidKeyException ex) {
ex.printStackTrace();
} catch (javax.crypto.BadPaddingException ex) {
ex.printStackTrace();
} catch (javax.crypto.IllegalBlockSizeException ex) {
ex.printStackTrace();
}
return cipherByte;
}
}
HMAC:
package com.joye3g.ed;
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import javax.crypto.KeyGenerator;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
public class HMAC {
private Mac mac;
public HMAC() {
try {
// 用DES算法得到计算验证码的密钥
KeyGenerator keyGen = KeyGenerator.getInstance("DESede");
SecretKey key = keyGen.generateKey();
byte[] keyByte = key.getEncoded();
// 生成MAC对象
SecretKeySpec SKS = new SecretKeySpec(keyByte, "HMACMD5");
mac = Mac.getInstance("HMACMD5");
mac.init(SKS);
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
public byte[] createEncryptor(String str) {
// 传入要计算验证码的字符串
byte[] certifyCode = null;
try {
mac.update(str.getBytes("UTF8"));
// 计算验证码
certifyCode = mac.doFinal();
return certifyCode;
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
}
MD5:
package com.joye3g.ed;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MD5 {
private MessageDigest md5;
public MD5() {
//根据MD5算法生成MessageDigest对象
try {
md5 = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
// MD5加密
public byte[] encrypt(String msg) {
byte[] srcBytes = msg.getBytes();
//使用srcBytes更新摘要
md5.update(srcBytes);
//完成哈希计算,得到并返回密文
return md5.digest();
}
}
RSA:
package com.joye3g.ed;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import javax.crypto.Cipher;
import javax.crypto.NoSuchPaddingException;
public class RSA {
private RSAPrivateKey privateKey;
private RSAPublicKey publicKey;
private Cipher cipher;
public RSA() {
try {
// KeyPairGenerator类用于生成公钥和私钥对,基于RSA算法生成对象
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
// 初始化密钥对生成器,密钥大小为1024位
keyPairGen.initialize(1024);
// 生成一个密钥对保存在keyPair中
KeyPair keyPair = keyPairGen.generateKeyPair();
// 得到私钥
privateKey = (RSAPrivateKey) keyPair.getPrivate();
// 得到公钥
publicKey = (RSAPublicKey) keyPair.getPublic();
// 根据私钥对Cipher对象进行初始化
cipher = Cipher.getInstance("RSA");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
}
}
/* 对srcBytes加密 */
public byte[] encrypt(byte[] srcBytes) {
if (publicKey != null) {
try {
// 根据公钥,对Cipher对象进行初始化
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
// 将加密结果保存进resultBytes
byte[] resultBytes = cipher.doFinal(srcBytes);
return resultBytes;
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}
/* 对encBytes解密 */
public byte[] decrypt(byte[] encBytes) {
if (privateKey != null) {
try {
cipher.init(Cipher.DECRYPT_MODE, privateKey);
// 将解密结果保存进resultBytes
byte[] decBytes = cipher.doFinal(encBytes);
return decBytes;
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}
}
SHA:
package com.joye3g.ed;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class SHA {
private MessageDigest md5;
public SHA() {
//根据MD5算法生成MessageDigest对象
try {
md5 = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
// MD5加密
public byte[] encrypt(String msg) {
byte[] srcBytes = msg.getBytes();
//使用srcBytes更新摘要
md5.update(srcBytes);
//完成哈希计算,得到并返回密文
return md5.digest();
}
}
3DES:
package com.joye3g.ed;
import java.security.NoSuchAlgorithmException;
import java.security.Security;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
public class ThreeDES {
// KeyGenerator提供对称密钥生成器的功能,支持各种算法
private KeyGenerator keyGenerator;
// SecretKey负责保存对称密钥
private SecretKey secretKey;
// Cipher负责完成加密或解密工作
private Cipher cipher;
// 该字节数组负责保存加密的结果
private byte[] cipherByte;
@SuppressWarnings("restriction")
public ThreeDES() {
Security.addProvider(new com.sun.crypto.provider.SunJCE());
// 实例化支持3DES算法的密钥生成器,算法名称用DESede
try {
keyGenerator = KeyGenerator.getInstance("DESede");
// 生成密钥
secretKey = keyGenerator.generateKey();
// 生成Cipher对象,指定其支持3DES算法
cipher = Cipher.getInstance("DESede");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
}
}
/* 对字符串str加密 */
public byte[] createEncryptor(String str) {
try {
// 根据密钥对Cipher对象进行初始化,ENCRYPT_MODE表示加密模式
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] src = str.getBytes();
// 将加密结果保存进cipherByte
cipherByte = cipher.doFinal(src);
} catch (java.security.InvalidKeyException ex) {
ex.printStackTrace();
} catch (javax.crypto.BadPaddingException ex) {
ex.printStackTrace();
} catch (javax.crypto.IllegalBlockSizeException ex) {
ex.printStackTrace();
}
return cipherByte;
}
/* 对字节数组buff解密 */
public byte[] createDecryptor(byte[] buff) {
try {
// 根据密钥对Cipher对象进行初始化,ENCRYPT_MODE表示解密模式
cipher.init(Cipher.DECRYPT_MODE, secretKey);
// 将得到明文存入cipherByte字符数组
cipherByte = cipher.doFinal(buff);
} catch (java.security.InvalidKeyException ex) {
ex.printStackTrace();
} catch (javax.crypto.BadPaddingException ex) {
ex.printStackTrace();
} catch (javax.crypto.IllegalBlockSizeException ex) {
ex.printStackTrace();
}
return cipherByte;
}
}