常用加密工具类:RSA加密、DES加密、MD5加密

本文介绍了RSA公钥私钥的生成、加密和验签过程,包括使用SHA1WithRSA算法,以及DES算法的加密解密操作,还涉及了MD5签名的原理和验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.RSA公私钥生成器、签名、验签

public class RSAUtils {

	/**
     * RSA公私钥生成器
     * @return 生成的Map对象(包含PublicKey、PrivateKey)
     */
	public static Map genKey() throws Exception{
	  KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
	  kpg.initialize(1024);
	  KeyPair kep = kpg.generateKeyPair();
	  Provider p  = kpg.getProvider();
	  PrivateKey pkey = kep.getPrivate();
	  PublicKey pubkey = kep.getPublic();
	  Map<String,Object> param=new HashMap<String,Object>();
	  param.put("PublicKey", new String(Base64Utils.encode(pubkey.getEncoded())));
	  param.put("PrivateKey", new String(Base64Utils.encode(pkey.getEncoded())));
	  return param;
	}

	/**
     * RSA签名
     * @param content     需要签名的字符串
     * @param privateKey  RSA私钥
     * @return 签名结果
     */
	public static String sign(String content, String privateKey) throws Exception {
        byte[] str=Base64Utils.decode(privateKey.getBytes("UTF-8"));
        PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(str);
        KeyFactory keyf = KeyFactory.getInstance("RSA");
        PrivateKey priKey = keyf.generatePrivate(priPKCS8);
        java.security.Signature signature = java.security.Signature.getInstance("SHA1WithRSA");
        signature.initSign(priKey);
        signature.update(content.getBytes("UTF-8"));
        byte[] signed = signature.sign();
        return new String(Base64Utils.encode(signed),"UTF-8");
    }

	/**
     * RSA验签
     * @param content     原文
     * @param sign        待验证的签名
     * @param public_key  RSA公钥
     * @return 签名结果
     */
    public static boolean verify(String content, String sign, String public_key)
            throws Exception {
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        byte[] encodedKey = Base64Utils.decode(public_key.getBytes("UTF-8"));
        PublicKey pubKey = keyFactory.generatePublic(new X509EncodedKeySpec(encodedKey));
        java.security.Signature signature = java.security.Signature.getInstance("SHA1WithRSA");
        signature.initVerify(pubKey);
        signature.update(content.getBytes("UTF-8"));
        boolean bverify = signature.verify(Base64Utils.decode(sign.getBytes("UTF-8")));
        return bverify;
    }

}

2.DES加密、解密

public class DESUtils {
	/**
     * 加密字符串
     * @param plainText 需要加密的byte数组
     * @param desKey    密钥
     * @return 加密结果
     */
	public static byte[] encrypt(byte plainText[],String desKey) throws Exception {
        SecureRandom sr = new SecureRandom();
        byte rawKeyData[] = desKey.getBytes();
        DESKeySpec dks = new DESKeySpec(rawKeyData);
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
        javax.crypto.SecretKey key = keyFactory.generateSecret(dks);
        Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
        cipher.init(1, key, sr);
        byte data[] = plainText;
        byte encryptedData[] = cipher.doFinal(data);
        return encryptedData;
    }

	/**
     * 加密字符串
     * @param encryptText 需要解密的byte数组
     * @param desKey    密钥
     * @return 解密结果
     */
    public static byte[] decrypt(byte encryptText[],String desKey) throws Exception {
        SecureRandom sr = new SecureRandom();
        byte rawKeyData[] = desKey.getBytes();
        DESKeySpec dks = new DESKeySpec(rawKeyData);
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
        javax.crypto.SecretKey key = keyFactory.generateSecret(dks);
        Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
        cipher.init(2, key, sr);
        byte encryptedData[] = encryptText;
        byte decryptedData[] = cipher.doFinal(encryptedData);
        return decryptedData;
    }

3.MD5签名、验签

public class MD5Utils {

    /**
     * 签名字符串
     * @param text 需要签名的字符串
     * @param key 密钥
     * @param input_charset 编码格式
     * @return 签名结果
     */
    public static String sign(String text, String key, String input_charset) {
    	text = text + key;
        return DigestUtils.md5Hex(getContentBytes(text, input_charset));
    }
    
    /**
     * 签名字符串
     * @param text 需要签名的字符串
     * @param sign 签名结果
     * @param key 密钥
     * @param input_charset 编码格式
     * @return 签名结果
     */
    public static boolean verify(String text, String sign, String key, String input_charset) {
    	text = text + key;
    	String mysign = DigestUtils.md5Hex(getContentBytes(text, input_charset));
    	if(mysign.equals(sign)) {
    		return true;
    	}
    	else {
    		return false;
    	}
    }

    /**
     * @param content
     * @param charset
     * @return
     * @throws SignatureException
     * @throws UnsupportedEncodingException 
     */
    private static byte[] getContentBytes(String content, String charset) {
        if (charset == null || "".equals(charset)) {
            return content.getBytes();
        }
        try {
            return content.getBytes(charset);
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException("MD5签名过程中出现错误,指定的编码集不对,您目前指定的编码集是:" + charset);
        }
    }
    
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值