MD5、DES、RSA消息加密解密

最近做的一个项目中用到这几种加密解密算法,简单总结下用法。
一 MD5、DES、RSA的基本概念?
相信大家多多少少都接触过一些加密解密算法,MD5可以说是最常用的一种了,MD5是直接对要加密信息进行加密的消息摘要算法,DES是一种对称加密算法,RSA则是一种非对称加密算法。

所谓对称加密是一种将原始数据(需加密消息)和加密密钥key一起经过特殊加密算法处理,在解密时使用同一密钥(加密时使用的加密密钥key)与加过密的数据一起经过相同算法的逆算法对密文进行解密。

非对称加密是借助匹配的一对密钥(公钥publicKey 和私钥privateKey),加密时借助公钥和原始数据(需加密消息)一起经过特殊加密算法处理,解密时采用私钥和加过密的数据进过逆算法对密文进行解密;或者加密时使用私钥进行加密,解密时使用公钥进行解密。

1、java(jdk1.6)中java.security.MessageDigest抽象类为应用程序提供信息摘要算法的功能,用法也非常简单。

MessageDigest md = MessageDigest.getInstance("MD5"); // 初始化

byte b_data [] = dataString.getByte(); // 加密前先将需加密数据(字符串dataString)转成byte[]

byte md5_result [] = md.digest(b_data); // 加密返回摘要信息

2、DES算法,首先需要生成一个密钥key,这里采用随机数生成,然后根据这个密钥进行加密解密操作。
SecureRandom sr = new SecureRandom(); // DES算法要求有一个可信任的随机数源
KeyGenerator desKg = KeyGenerator.getInstance("DES"); // 为DES算法生成一个KeyGenerator对象
desKg.init(sr);

SecretKey key = desKg.generateKey(); //获取密钥对象

byte[] rawKeyData = key.getEncoded(); // 生成DES密钥


/**
* 利用DES算法加密二进制数据
* rawKeyData 密钥key | rawOrignData 需加密数据
* @param rawKeyData byte[]
* @param byOrignData byte[]
* @return byte[]
*/
public static byte[] desEncrypt(byte[] rawKeyData,byte[] rawOrignData) throws Exception
{
// DES算法要求有一个可信任的随机数源
SecureRandom sr = new SecureRandom();

// 从原始密匙数据创建DESKeySpec对象
DESKeySpec dks = new DESKeySpec(rawKeyData);

// 创建一个密匙工厂,然后用它把DESKeySpec转换成一个SecretKey对象
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey key = keyFactory.generateSecret(dks);

// Cipher对象实际完成加密操作
Cipher cipher = Cipher.getInstance("DES");

// 用密匙初始化Cipher对象
cipher.init(Cipher.ENCRYPT_MODE, key, sr);

// 现在,获取数据并加密
byte encryptedData[] = cipher.doFinal(rawOrignData);

// 返回加密后的数据
return encryptedData;
}

/**
* 利用DES算法解密二进制数据
* rawKeyData 密钥key | rawCryptograph 需解密数据
* @param rawKeyData byte[]
* @param rawCryptograph byte[]
* @return byte[]
*/
public static byte[] desDecrypt(byte[] rawKeyData,byte[] rawCryptograph) throws Exception
{
// DES算法要求有一个可信任的随机数源
SecureRandom sr = new SecureRandom();

// 从原始密匙数据创建一个DESKeySpec对象
DESKeySpec dks = new DESKeySpec(rawKeyData);

// 创建一个密匙工厂,然后用它把DESKeySpec对象转换成一个SecretKey对象
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey key = keyFactory.generateSecret(dks);

// Cipher对象实际完成解密操作
Cipher cipher = Cipher.getInstance("DES");

// 用密匙初始化Cipher对象
cipher.init(Cipher.DECRYPT_MODE, key, sr);

// 正式执行解密操作
return cipher.doFinal(rawCryptograph);
}


3、RSA算法,首先需要生成密钥对(公钥publicKey、私钥privateKey),这里采用随机数产生,然后根据密钥对进行加密解密操作。
// 为RSA算法,这里借助了jar包 bcprov-jdk14-145.jar 用来生成一个KeyPairGenerator对象
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA", new org.bouncycastle.jce.provider.BouncyCastleProvider());

//指定密钥的长度,初始化密钥对生成器 (这里假设密钥长度为1024)
SecureRandom ran = new SecureRandom();
kpg.initialize(1024, ran);

KeyPair keyPair = kpg.genKeyPair(); //生成密钥对

//获取公钥
RSAPublicKey pbkey = (RSAPublicKey) keyPair.getPublic();
BigInteger PublicExponent = pbkey.getPublicExponent(); // 从RSA密钥对中获取公有指数

//或者获取私钥
RSAPrivateKey prkey = (RSAPrivateKey)keyPair.getPrivate();
BigInteger PrivateExponent = prkey.getPrivateExponent(); //从RSA密钥对中获取私有指数

BigInteger Modulus = pbkey.getModulus(); // RSA 密钥对中用到的一个公共系数

//(RSA公钥对象是有PublicExponent + Modulus 生成的,私钥对象是有rivateExponent + Modulus生成的)

/**
* 根据系数和指数生成公钥
* @param Modulus BigInteger
* @param PublicExponent BigInteger
* @return void
*/
private static RSAPublicKey generateRSAPublicKey(BigInteger Modulus, BigInteger PublicExponent) throws Exception {

KeyFactory keyFac = null;

try {

keyFac = KeyFactory.getInstance("RSA", new org.bouncycastle.jce.provider.BouncyCastleProvider());

} catch (NoSuchAlgorithmException ex) {

throw new Exception(ex.getMessage());

}

RSAPublicKeySpec pubKeySpec = new RSAPublicKeySpec(Modulus, PublicExponent);

try {

return (RSAPublicKey) keyFac.generatePublic(pubKeySpec);

} catch (InvalidKeySpecException ex) {

throw new Exception(ex.getMessage());

}
}

/**
* 根据系数和指数生成私钥
* @param Modulus BigInteger
* @param PrivateExponent BigInteger
* @return void
*/
private static RSAPrivateKey generateRSAPrivateKey(BigInteger Modulus, BigInteger PrivateExponent) throws Exception {

KeyFactory keyFac = null;

try {
keyFac = KeyFactory.getInstance("RSA", new org.bouncycastle.jce.provider.BouncyCastleProvider());

} catch (NoSuchAlgorithmException ex) {

throw new Exception(ex.getMessage());

}

RSAPrivateKeySpec priKeySpec = new RSAPrivateKeySpec(Modulus, PrivateExponent);

try {

return (RSAPrivateKey) keyFac.generatePrivate(priKeySpec);

} catch (InvalidKeySpecException ex) {

throw new Exception(ex.getMessage());
}
}


/**
* RSA加密
* Encrypt method
*
* @return byte[]
*/
protected byte[] encrypt(RSAPublicKey publicKey, byte[] data) {
if (publicKey != null) {
try {
Cipher cipher = Cipher.getInstance("RSA", new org.bouncycastle.jce.provider.BouncyCastleProvider());
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
return cipher.doFinal(data);
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}

/**
* RSA解密
* decrypt method
*
* @return byte[]
*/
protected byte[] decrypt(RSAPrivateKey privateKey, byte[] raw) {
if (privateKey != null) {
try {
Cipher cipher = Cipher.getInstance("RSA", new org.bouncycastle.jce.provider.BouncyCastleProvider());
cipher.init(Cipher.DECRYPT_MODE, privateKey);
return cipher.doFinal(raw);
} catch (Exception e) {
e.printStackTrace();
}
}

return null;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值