最近做了一个小应用, 需要将发送的报文采用RSA, BASE64, MD5加密。写下这篇文章, 方便自己以后查看,同时也能与各位Java开发的同行交流。
------------------------------------------------------------------
1. RSA加密
import java.security.spec.RSAPublicKeySpec.RSAPublicKeySpec;
import java.security.KeyFactory;
import java.security.Key;
import javax.crypto.Cipher;
import org.apache.commons.codec.binary.Base64;
String encryptByPK(String data, BigInteger modulus, BigInteger exponent)
throws Exception {
//创建RSAPublicKeySpec 实例,用于取公钥.
//最开始我采用X509EncodedKeySpec作为keyFactory.generatePublic(pkSepc)的入参,
//结果报错:DerInputStream.getLength(): lengthTag=25, too big.,无法得到公钥。
RSAPublicKeySpec pkSpec = new RSAPublicKeySpec(modulus, exponent);
// 取公钥
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
Key publicKey = keyFactory.generatePublic(pkSpec);
// 加密数据
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
//采用Base64将数据加密成字符串
return Base64.encodeBase64String(cipher.doFinal(data.getBytes()));
}
Tips :
String.getBytes() : 将字符串转换成字节数组;
2. BASE64加密;
source code :
//加密
public static String encodeBase64String(byte[] binaryData) {
return StringUtils.newStringUtf8(encodeBase64(binaryData, false));
}
//解密
public static byte[] decodeBase64(String base64String) {
return new Base64().decode(base64String);
}
3. MD5加密 : MD5可用于生成数字证书(Signature)
import java.security.MessageDigest;
byte[] encryptMD5(byte[] data) throws Exception{
MessageDigest md5 = MessageDigest.getInstance(KEY_MD5);
md5.update(data);
return md5.digest();
}
Tips : 在传输密文时, 如果有中文, 记得在加密前对数据进行编码(具体采用的编码根据应用的需要),
否则server收到中文可能乱码,从而导致数字证书不匹配。