java 用rsa 和AES加密

  rsa工具类:

 

 

package com.sh.util;

import com.alibaba.druid.util.StringUtils;
import org.apache.commons.codec.binary.Base64;

import javax.crypto.Cipher;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.security.*;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.HashMap;
import java.util.Map;

public class RSAUtil {
    private static Map<Integer, String> keyMap = new HashMap<Integer, String>();  //用于封装随机产生的公钥与私钥
    public static void main(String[] args) throws Exception {
        //生成公钥和私钥
        genKeyPair();
        //加密字符串
        String message = "df723820";
        System.out.println("随机生成的公钥为:" + keyMap.get(0));
        System.out.println("随机生成的私钥为:" + keyMap.get(1));
        String messageEn = encrypt(message,keyMap.get(0));
        System.out.println(message + "\t加密后的字符串为:" + messageEn);
        String messageDe = decrypt(messageEn,keyMap.get(1));
        System.out.println("还原后的字符串为:" + messageDe);
    }

    /**
     * 随机生成密钥对
     * @throws NoSuchAlgorithmException
     */
    public static void genKeyPair() throws NoSuchAlgorithmException {
        // KeyPairGenerator类用于生成公钥和私钥对,基于RSA算法生成对象
        KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
        // 初始化密钥对生成器,密钥大小为96-1024位
        keyPairGen.initialize(1024,new SecureRandom());
        // 生成一个密钥对,保存在keyPair中
        KeyPair keyPair = keyPairGen.generateKeyPair();
        RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();   // 得到私钥
        RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();  // 得到公钥
        String publicKeyString = new String(Base64.encodeBase64(publicKey.getEncoded()));
        // 得到私钥字符串
        String privateKeyString = new String(Base64.encodeBase64((privateKey.getEncoded())));
        // 将公钥和私钥保存到Map
        keyMap.put(0,publicKeyString);  //0表示公钥
        keyMap.put(1,privateKeyString);  //1表示私钥
    }
    /**
     * RSA公钥加密
     *
     * @param str
     *            加密字符串
     * @param publicKey
     *            公钥
     * @return 密文
     * @throws Exception
     *             加密过程中的异常信息
     */
    public static String encrypt( String str, String publicKey ) throws Exception{
        //base64编码的公钥
        byte[] decoded = Base64.decodeBase64(publicKey);
        RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded));
        //RSA加密
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, pubKey);
        String outStr = Base64.encodeBase64String(cipher.doFinal(str.getBytes("UTF-8")));
        return outStr;
    }

    /**
     * RSA私钥解密
     *
     * @param str
     *            加密字符串
     * @param privateKey
     *            私钥
     * @return 铭文
     * @throws Exception
     *             解密过程中的异常信息
     */
    public static String decrypt(String str, String privateKey) throws Exception{
        //64位解码加密后的字符串
        byte[] inputByte = Base64.decodeBase64(str.getBytes("UTF-8"));
        //base64编码的私钥
        byte[] decoded = Base64.decodeBase64(privateKey);
        RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded));
        //RSA解密
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE, priKey);
        String outStr = new String(cipher.doFinal(inputByte));
        return outStr;
    }


    public static String rsaDecrypt(String content, String privateKey, String charset) throws Exception {
        try {
            PrivateKey priKey = getPrivateKeyFromPKCS8("RSA", new ByteArrayInputStream(privateKey.getBytes()));
            Cipher cipher = Cipher.getInstance("RSA");
            cipher.init(2, priKey);
            byte[] encryptedData = StringUtils.isEmpty(charset) ? Base64.decodeBase64(content.getBytes()) : Base64.decodeBase64(content.getBytes(charset));
            int inputLen = encryptedData.length;
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            int offSet = 0;
            int i = 0;
            int maxDecryptBlock = 128;
            if (privateKey.length() > 1000) {
                maxDecryptBlock = 256;
            }
            while (inputLen - offSet > 0) {
                byte[] cache;
                if (inputLen - offSet > maxDecryptBlock) {
                    cache = cipher.doFinal(encryptedData, offSet, maxDecryptBlock);
                } else {
                    cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet);
                }
                out.write(cache, 0, cache.length);
                i++;
                offSet = i * maxDecryptBlock;
            }
            byte[] decryptedData = out.toByteArray();
            out.close();
            return StringUtils.isEmpty(charset) ? new String(decryptedData) : new String(decryptedData, charset);
        } catch (Exception e) {
            throw new Exception("EncodeContent = " + content + ",charset = " + charset, e);
        }
    }

    public static PrivateKey getPrivateKeyFromPKCS8(String algorithm, InputStream ins) throws Exception {
        if ((ins == null) || (StringUtils.isEmpty(algorithm))) {
            return null;
        }
        KeyFactory keyFactory = KeyFactory.getInstance(algorithm);
        byte[] encodedKey = StreamUtils.readText(ins).getBytes();
        encodedKey = Base64.decodeBase64(encodedKey);
        PKCS8EncodedKeySpec ps = new PKCS8EncodedKeySpec(encodedKey);
        return keyFactory.generatePrivate(ps);
    }

}

 

 

AES加密工具类L:

 

package com.sh.util;

import org.apache.commons.codec.binary.Base64;

import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;

/***
 * AES加密解密算法
 * @author Qfh
 * 地址:http://blog.csdn.net/hbcui1984/article/details/5201247
 */

public class AESUtil {


    public static String AesKey = "duanRon!@"; //秘钥

    /**
     * 加密
     *
     * @param content 需要加密的内容
     * @param password  加密密码
     * @return
     */
    public static byte[] encrypt(String content, String password) {
        try {

            SecretKeySpec key = new SecretKeySpec(password.getBytes(), "AES");
            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");// 创建密码器

            //这种加密方式不对
//            KeyGenerator kgen = KeyGenerator.getInstance("AES");
//            kgen.init(128, new SecureRandom(password.getBytes()));
//            SecretKey secretKey = kgen.generateKey();
//            byte[] enCodeFormat = secretKey.getEncoded();
//            SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
//            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");// 创建密码器
            byte[] byteContent = content.getBytes("utf-8");
            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 解密密钥
     * @return
     */
    public static byte[] decrypt(byte[] content, String password) {
        try {
            SecretKeySpec key = new SecretKeySpec(password.getBytes(), "AES");
            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");// 创建密码器
            cipher.init(Cipher.DECRYPT_MODE, key);// 初始化
            int length = content.length;
            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;
    }

    public static void main(String[] args) throws Exception {
        String content = "小明学会了123456,但是他喜欢abcdeef,可是!@######未知";
        String password = "duanRon!@";
        //加密
        System.out.println("加密前:" + content);
        byte[] encryptResult = encrypt(content, password);
        System.out.println("密文:" + new String(encryptResult));
        //解密
        byte[] decryptResult = decrypt(encryptResult,password);
        System.out.println("解密后:" + new String(decryptResult));
    }


    /**
     * base64编码字符串
     *
     * @param data
     * @return
     */
    public static String bytetobase64(byte[] data) {
        return Base64.encodeBase64String(data);
    }

    public static byte[] base64StoByte(String base64Str){
        return Base64.decodeBase64(base64Str);
    }




    ///附加

    /**将二进制转换成16进制
     * @param buf
//     * @return
//     */
//    public 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();
//    }
//
//    /**将16进制转换为二进制
//     * @param hexStr
//     * @return
//     */
//    public 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;
//    }
//
//    /**
//     * 使用ASE加密后
//     * 加密后返回16进制数据
//     * @param temp
//     * @return
//     */
//    public static String encode(String temp){
//        byte[] tempByte = ASEUtil.encrypt(temp, ASEUtil.AesKey);  //加密
//        temp = ASEUtil.parseByte2HexStr(tempByte);   //将二进制转换成16进制
//        return temp;
//    }
//
//    /**
//     * 解密返回UTF-8字符串
//     * @param temp
//     * @return
//     */
//    public static String decode(String temp){
//        byte[] tempByte = ASEUtil.parseHexStr2Byte(temp);  //将16进制转换为二进制
//        tempByte = ASEUtil.decrypt(tempByte, ASEUtil.AesKey);  //解密
//        try {
//            temp = new String(tempByte,"UTF-8");
//        }catch(UnsupportedEncodingException e) {
//            e.printStackTrace();
//        }
//        return temp;
//    }





}

 

 

 

测试方法:
 

 

 

package com.sh.util;

import com.alibaba.fastjson.JSONObject;

import java.net.URLEncoder;

public class JiaMiUtil {

    /**
     *
     * @param js
     * @param i
     * @return
     * @throws Exception
     *
     * 1.在这个类里面,进行加解密
     * 当调用接口时,首先调用本类 进行解密 参数为0
     * 在返回值得时候,先加密后解密
     *
     */

    public static JSONObject  Encode(JSONObject js,int i,String key) throws Exception {

        if(i==0){//等于0时 拿到数据

            // RSA加密后的AES密码
            String sign = js.get("sign") != null ? js.get("sign").toString() : "";
            //AES加密后的业务数据
            String data = js.get("data") != null ? js.get("data").toString() : "";
           //解密  AES密码  私钥
          
              String privateKey=""私钥自定义"";
            //RSA解密  得到加密前的  ASE明文密码
            String aesPassword = RSAUtil.decrypt(sign, privateKey);

            byte[] bytes = AESUtil.base64StoByte(data);//先将 data 进行base64解码

            //ASE解密 得到业务数据
            System.out.println("jjjjjjjjjjjjjjjjjjjjjjjjjjjjj");
            byte[] decrypt = AESUtil.decrypt(bytes, aesPassword);
            System.out.println(decrypt);
            byte[] data2 = AESUtil.decrypt(bytes, aesPassword);

            //得到业务数据  返回实现类
            JSONObject js2 = JSONObject.parseObject(new String(data2));
                return js2;

        } else if(i==1){ //返回数据  进行加密

            //公钥
         
              String publicKey="公钥 自定义";
            //使用AES  对业务数据加密
            //一定要注意 这个passeord一定是十六位的  大坑
            byte[] data = AESUtil.encrypt(String.valueOf(js), key);
            //base64转码
            String data2 = AESUtil.bytetobase64(data);

            //使用RSA  对AES密码加密  得到singn
            //一定要注意 这个passeord一定是十六位的
            String sign = RSAUtil.encrypt(key, publicKey);

            JSONObject jsonObject = new JSONObject();
            jsonObject.put("sign",sign);
            jsonObject.put("data",data2);
            return jsonObject;
        }
         return null;
    }

    public static String  getSign(JSONObject js) throws Exception {
        String privateKey="私钥自定义";

        //RSA解密  得到加密前的  ASE明文密码
        String sign = js.get("sign") != null ? js.get("sign").toString() : "";
        String aesPassword = RSAUtil.decrypt(sign, privateKey);
        return aesPassword;
    }
    public static void main(String[] args) throws Exception {
        JSONObject aa = new JSONObject();
        aa.put("idcard","45646");
        aa.put("bdczmh","就好好看好看好看");

        Object encode = JiaMiUtil.Encode(aa, 1,"U0JJTG758AZhh28z");
        System.out.println(encode);

        JSONObject jsonObject = JSONObject.parseObject(String.valueOf(encode));



        Object encode2 = JiaMiUtil.Encode(jsonObject, 0,"U0JJTG758AZhh28z");

        System.out.println(encode2);
//



    }



}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: RSA(Rivest-Shamir-Adleman)和AES(Advanced Encryption Standard)是两种流行的加密算法。RSA是一种非对称加密算法,可以用于加密和数字签名。AES是一种对称加密算法,用于加密和解密数据。 如果想要了解RSA和AES的加密原理和实现方式,可以下载相应的加密demo进行学习和实践。网上有很多网站提供这些demo的下载,比如GitHub和其他软件开发社区。 对于RSA加密,可以下载Java, Python和C++等不同语言的demo进行学习。这些demo通常会包含RSA密钥的生成、数据加密和解密等操作,通过实践可以更好地理解RSA算法在实际应用中的工作原理。 同样地,对于AES加密,也可以下载不同语言的demo来学习。在实践中,可以使用不同的AES加密模式,如ECB、CBC、CFB和OFB,掌握它们的优缺点以及在不同场景下的应用。 总之,通过下载和实践RSAAES加密的demo,可以更好地了解这两种加密算法的原理和应用,提高对数据加密和安全保护的认识和能力。 ### 回答2: RSA和AES都是常用的加密算法,RSA用于加密和解密数据,AES用于对称加密。这两种加密算法都有其独特的优点和缺点,用于不同的场景。 如果你想学习RSA和AES的加密和解密原理,可以下载相关的加密示例程序进行学习。这些示例程序通常包括两个部分:加密和解密。 加密部分通常需要输入明文和密钥,通过RSA或AES算法对明文进行加密加密后的结果可作为密文传输或保存。 解密部分通常需要输入密文和密钥,通过RSA或AES算法对密文进行解密,得到明文。 在下载RSAAES加密示例程序之前,需要先了解一些基本概念和原理。需要了解密钥的概念,密钥的长度和安全性等问题。此外,针对不同的加密算法和加密场景,还需要了解不同的加密策略和实现方法。 总之,下载RSAAES加密示例程序是为了更好地学习和深入理解这两种常用的加密算法。通过学习加密思想和方法,我们可以更好地保护数据安全和隐私。 ### 回答3: RSA和AES是两种常见的加密算法,分别用于数据传输加密和数据存储加密。为了方便开发人员理解这两种算法的使用,许多网站或书籍上都提供了RSA和AES的加密DEMO下载。 对于初学者来说,下载和运行这些DEMO可以帮助他们快速了解RSA和AES的加密方式,并通过实际的操作加深对这两种算法的理解。在下载DEMO时需要注意一些问题:首先要选择可信的下载渠道,确保下载到的文件不含有恶意代码。其次要选择适合自己的编程语言版本,以便更好地理解和运用。 对于开发人员来说,下载和使用RSA和AES的加密DEMO是非常有益的。例如,在使用RSA加密过程中,可以通过调整不同的参数来控制公钥和私钥的长度,从而实现更高的加密强度。在使用AES加密过程中,可以探究不同的加密模式(如ECB,CBC等),以及不同的加密密钥长度对加密强度的影响。 总之,下载和使用RSA和AES的加密DEMO是一种非常好的学习和实践加密算法的方法。希望广大开发者能够充分掌握这两种算法的原理和使用方法,增强数据安全意识,提高数据加密能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值