java util - MD5/AES/RSA快速调用工具

测试代码

package cn.java.security;

import java.security.Key;
import java.util.Base64;
import org.junit.Assert;
import cn.java.codec.hex.HexUtil;
import cn.java.security.SecurityUtil.RsaUtil.RsaKeyPair;

public class Test {

    public static void main(String[] args)  throws Exception{
        System.out.println("-----------<<< testDigest >>>------------------");
        testDigest();
        System.out.println();

        System.out.println("-----------<<< testAes >>>------------------");
        testAes();
        System.out.println();

        System.out.println("-----------<<< testRsa >>>------------------");
        testRsa();
        System.out.println();
    }

    /**
     * 对称加密算法
     * @throws Exception
     */
    public static void testAes() throws Exception {
        String content = "testAes";
        String secretKeyStr = SecurityUtil.AesUtil.generaterKey();
        System.out.println("-----------secretKeyStr------------------");
        System.out.println(secretKeyStr);
        String encryptStr = SecurityUtil.AesUtil.encrypt(content, secretKeyStr);
        String decryptStr = SecurityUtil.AesUtil.decrypt(encryptStr, secretKeyStr);
        System.out.println("-----------encryptStr------------------");
        System.out.println(encryptStr);
        System.out.println("-----------decryptStr------------------");
        System.out.println(decryptStr);
    }

    /**
     * 非对称加密算法
     * @throws Exception
     */
    public static void testRsa() throws Exception {

        String content = "testRsa";
        // 生成秘钥对
        RsaKeyPair mRsaKeyPair = SecurityUtil.RsaUtil.generaterKeyPair();
        String privateKeyStr = mRsaKeyPair.getPrivateKey();
        String publicKeyStr = mRsaKeyPair.getPublicKey();
        System.out.println("-----------privateKeyStr------------------");
        System.out.println(privateKeyStr);
        System.out.println("-----------publicKeyStr------------------");
        System.out.println(publicKeyStr);

        // test sign
        {
            String signStr = SecurityUtil.RsaUtil.sign(content, privateKeyStr,true);
            boolean isValid = SecurityUtil.RsaUtil.verify(content,signStr, publicKeyStr,true);
            System.out.println("-----------signStr------------------");
            System.out.println(signStr);
            System.out.println("-----------isValid------------------");
            System.out.println(isValid);
        }

        // test codec
        {
            Key privateKey = SecurityUtil.RsaUtil.getPrivateKey(privateKeyStr);
            Key publicKey = SecurityUtil.RsaUtil.getPublicKey(publicKeyStr);

            // 私钥加密、公钥解密
            String encryptStr = SecurityUtil.RsaUtil.encrypt(content, privateKey);
            String decryptStr = SecurityUtil.RsaUtil.decrypt(encryptStr, publicKey);
//            Assert.assertEquals(content, decryptStr);
            System.out.println("-----------encryptStr------------------");
            System.out.println(encryptStr);
            System.out.println("-----------decryptStr------------------");
            System.out.println(decryptStr);

            // 公钥加密、私钥解密
            encryptStr = SecurityUtil.RsaUtil.encrypt(content, privateKey);
            decryptStr = SecurityUtil.RsaUtil.decrypt(encryptStr, publicKey);
            Assert.assertEquals(content, decryptStr);
        }

    }

    /**
     * 签名
     */
    public static void testDigest() throws Exception {
        byte[] bytes = SecurityUtil.MessageDigestUtil.digest("test", true);
        String hexEncode = HexUtil.encode(bytes);
        System.out.println(hexEncode);

        byte[] hexDecode = HexUtil.decode(hexEncode);
        System.out.println(Base64.getEncoder().encodeToString(bytes));
        System.out.println(Base64.getEncoder().encodeToString(hexDecode));
    }

}

数据内容

-----------<<< testDigest >>>------------------
098f6bcd4621d373cade4e832627b4f6
CY9rzUYh03PK3k6DJie09g==
CY9rzUYh03PK3k6DJie09g==

-----------<<< testAes >>>------------------
-----------secretKeyStr------------------
BREMlyKxuMP2Qc7wIVa9Hg==
16
16
-----------encryptStr------------------
W+47ylkmqZ3G2Wq95esUEg==
-----------decryptStr------------------
testAes

-----------<<< testRsa >>>------------------
-----------privateKeyStr------------------
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCQsWH5fsMj03Ja2W5pxvCz5JBrOUF43yZCenUuBB9gMcJH9oySOeQVWWiAQJ+sVqI4QqMLrYsZJuNnuHFWr+uIFyXV7doQDFysvPmbMeQ1UPR9Bv+60QC47YRpVzAR3x0bGRbB3cCJ2U+t55xDV0CuljqR7X4CyfVSDvqaRV08uRn+b/vIvC0e623Uidez1IwGbobWYXBL6WRS0ooOm8AcSy84+c+mahuOUQFjJak18fBwJYnPTHWQnpxtnPYQ028LY05Njnux6DY2tEqeavvFuGQ4jXEhLEqTQL0dT2/auM39wErLkgfwX6OPPgCM/AcUKaM/pdzbZG1In2sVjFUlAgMBAAECggEAP6u+6FJOvqoiTTYW7zca3p56qqRUWkMgC+rlO62WvPbIfnBQ5VvSMU7ZvG4zlVu+ILG6G75vUk8ZjJ/OSA47v/Qnsx7qcVtvQJgb4p4uxQNtwsLcr7Ge9sGWHeC/B2492ZnNuNvDCSX2eRlNWxi/HtR+y45NgB6s9EIhJtfVMo27/a4qEKoyxB9kUOQ+EWXEEGDt8ERYnJfuG6doZ/NI+T8caziKqnmR1pj30B7ASSsFUKoH1YbV71ftBPEvUsyqIOZgLokWfNq3QSWzFoskslJAOxATMcGD+HVt8QQfX92nfd4odpxZNqeS/Qc0MRj+zvltN0LsOBATYq6sRw0StQKBgQDJ3u3p1htpL0DZTgas39hp1qiA3BA9xmD4QZfHQydntDMzLSHDssM/yX1TJuaO6TLFVG9KNqf5UtgKt3QTImm6vU3rsITShAiYKcdbyyEIxpITC89JNqKFop8w77xlYxZc02iS4I4he1rcZFx+14dIJwTCBXUyrkzHxWehmPbDZwKBgQC3fZMrUcJQ7LV8Z4t+gS7ViJh0oE/kvjc8qN5VnW4/YwrAiqsIeM1/J65wQZpl0OcgtRVXhfo2yX+xa8CCh1W22QCGGpuGfSjuM3FSB/QJaBnyW7CZQey0VOICAXAiMf7I8bGO6vaxaK6ECQgcN4bxuFVfV/9U7D6F8tXLsMk3kwKBgFyujlqio3kaadKbITNznj+Rf1GSN561GsZADzg8G7ZgJHWlje/0ffImRvTLUmVgqZ+xkVroVxyALZJWAePbE+HZkhHYvFKOrgd2fwIk86i8ykoWTPgXLmzeaeok10FRSe4aXdO5Z2f145R2O4U83O6Cg4u0x8caAURi3J5zxS+XAoGBAKxbx/dkKGyNvXirZwwg2tZ4JgU/ZWzQBOD1G0w+woXGSh5M45Xkq9uqcaA+74J+de1yTCbX0g7OviTxu3ahG7HTKzvNGJR/UwhVyDevAtwnLmBLIpsDow5NwbLymNt2LQeiiRBfw/UoCO478aNXwWmjpoYWCeFCvQRj89IPMSQDAoGBAIYlxX5FcfColAT3Ams4cjXqVMiwH2O+Ka7bkeQMfWuLTpGAcgM/f6vMoQ1NHUgu+M70pyyrV48pBHxIqAP0PYn6piMMfk7S6yORDF9riFh8D30up3O0Bfe8PbTyModCdhaGNWvhSqMs/ijDVclAXWeuKtA6A8GFuWvxgKdONey9
-----------publicKeyStr------------------
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAkLFh+X7DI9NyWtluacbws+SQazlBeN8mQnp1LgQfYDHCR/aMkjnkFVlogECfrFaiOEKjC62LGSbjZ7hxVq/riBcl1e3aEAxcrLz5mzHkNVD0fQb/utEAuO2EaVcwEd8dGxkWwd3AidlPreecQ1dArpY6ke1+Asn1Ug76mkVdPLkZ/m/7yLwtHutt1InXs9SMBm6G1mFwS+lkUtKKDpvAHEsvOPnPpmobjlEBYyWpNfHwcCWJz0x1kJ6cbZz2ENNvC2NOTY57seg2NrRKnmr7xbhkOI1xISxKk0C9HU9v2rjN/cBKy5IH8F+jjz4AjPwHFCmjP6Xc22RtSJ9rFYxVJQIDAQAB
-----------signStr------------------
ZZuYMdl58w2TCBaUMfU0p+XUL6Irix9/nD0gPm83P/xqlY18GROztZmat5XLKA5Wu373/2l2WhIKdp7DYoQm0Cnmr/0PDGz9PHw2Hhd9I52OVkcDqSPqgmo0U9uE02Urlt3C2moVS08b3VhLHOOzSq8lcsicqis17p0KY33k2he2XMbHEJEbxRMkPCDubDWqwnS/fKiXbNn3u+jni7zdX/Phaq41V2lMMMjdIP8Pm7OxlxdNP3aoTAu6eHaCvakganQE2cz6Y1HwfgXgA8EzaTCcE+weGBbfy9umcMfK0/Pnsqp+jTiz3c8O0p0C8QwogGwIOLBzbeu4d9svC8JA9Q==
-----------isValid------------------
true
-----------encryptStr------------------
dJGhdeCaK/gw52NkD+z1BPoooKYgHqMWUn+tvyPndrq1f5oqaqc8mn/ZclWCLg/hN4PE9zi7gCD9xgp/KEPWOc6XNzOXA/92LVBERpGGtYLQmZnOS8ZrrD4xxxMmra5qD2j03T9Cu4xrICCVZ/Qcp7l05/tZt6tFXJqSDG5uSN9I/en+Mbza9aGwBiTWm6rpv+E5F3sMVk9XDMMgVTMVu6DeT4jZ7HjQ+GATlYFHReVFWmyTv8ijKdnhgMhVvOrGToRAu/ExbNuF99l6FB5I5ZQQMU0wyQDlpXm4GYoRIMmT5wweWJy2f0yO4BnkTje8oNMz7pXnuhNdEulZ5S86sA==
-----------decryptStr------------------
testRsa

工具类

package cn.java.security;

import java.security.Key;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.SecureRandom;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

public class SecurityUtil {

    /**
     * 消息摘要
     * @author zhouzhian
     *
     */
    public static class MessageDigestUtil {

        public static byte[] digest(String content, boolean isMd5) throws Exception {
            MessageDigest messageDigest = null;
            String algorithm = isMd5 ? "MD5" : "SHA";
            messageDigest = MessageDigest.getInstance(algorithm);
            return messageDigest.digest(content.getBytes());
        }

        public static byte[] digest1(String content, boolean isMd5) throws Exception {
            MessageDigest messageDigest = null;
            String algorithm = isMd5 ? "MD5" : "SHA";
            messageDigest = MessageDigest.getInstance(algorithm);
            messageDigest.update(content.getBytes());
            return messageDigest.digest();
        }
    }

    /**
     * 对称加密算法
     * @author zhouzhian
     *
     */
    public static class AesUtil {
        private static final String ALGORITHM = "AES";
        private static final String DEFAULT_CHARSET = "UTF-8";

        /**
         * 生成秘钥
         * @return
         * @throws NoSuchAlgorithmException
         */
        public static String generaterKey() throws NoSuchAlgorithmException {
            KeyGenerator keygen = KeyGenerator.getInstance(ALGORITHM);
            keygen.init(128, new SecureRandom()); // 16 字节 == 128 bit
            //            keygen.init(128, new SecureRandom(seedStr.getBytes())); // 随机因子一样,生成出来的秘钥会一样
            SecretKey secretKey = keygen.generateKey();
            return Base64.getEncoder().encodeToString(secretKey.getEncoded());
        }

        /**
         */
        public static SecretKeySpec getSecretKeySpec(String secretKeyStr){
            byte[] secretKey = Base64.getDecoder().decode(secretKeyStr);
            System.out.println(secretKey.length);
            return new SecretKeySpec(secretKey, ALGORITHM);
        }

        /**
         * 加密
         */
        public static String encrypt(String content,String secretKey) throws Exception{
            Key key = getSecretKeySpec(secretKey);
            Cipher cipher = Cipher.getInstance(ALGORITHM);// 创建密码器
            cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化
            byte[] result = cipher.doFinal(content.getBytes(DEFAULT_CHARSET));
            return Base64.getEncoder().encodeToString(result);
        }

        /**
         * 解密
         */
        public static String decrypt(String content, String secretKey) throws Exception{
            Key key = getSecretKeySpec(secretKey);
            Cipher cipher = Cipher.getInstance(ALGORITHM);
            cipher.init(Cipher.DECRYPT_MODE, key);
            byte[] result = cipher.doFinal(Base64.getDecoder().decode(content));
            return new String(result);
        }
    }

    /**
     * 非对称加密算法
     * @author zhouzhian
     *
     */
    public static class RsaUtil {

        public static class RsaKeyPair {
            private String publicKey ="";
            private String privateKey ="";

            public RsaKeyPair(String publicKey, String privateKey) {
                super();
                this.publicKey = publicKey;
                this.privateKey = privateKey;
            }

            public String getPublicKey() {
                return publicKey;
            }
            public String getPrivateKey() {
                return privateKey;
            }
        }

        private static final String ALGORITHM = "RSA";
        private static final String ALGORITHMS_SHA1WithRSA = "SHA1WithRSA";
        private static final String ALGORITHMS_SHA256WithRSA = "SHA256WithRSA";
        private static final String DEFAULT_CHARSET = "UTF-8";
        private static String getAlgorithms(boolean isRsa2) {
            return isRsa2 ? ALGORITHMS_SHA256WithRSA : ALGORITHMS_SHA1WithRSA;
        }

        /**
         * 生成秘钥对
         * @return
         * @throws NoSuchAlgorithmException
         */
        public static RsaKeyPair generaterKeyPair() throws NoSuchAlgorithmException{
            KeyPairGenerator keygen = KeyPairGenerator.getInstance(ALGORITHM);
            SecureRandom random = new SecureRandom();
            //            SecureRandom random = new SecureRandom(seedStr.getBytes()); // 随机因子一样,生成出来的秘钥会一样
            // 512位已被破解,用1024位,最好用2048位
            keygen.initialize(2048, random);
            // 生成密钥对
            KeyPair keyPair = keygen.generateKeyPair();
            RSAPrivateKey privateKey = (RSAPrivateKey)keyPair.getPrivate();
            RSAPublicKey publicKey = (RSAPublicKey)keyPair.getPublic();
            String privateKeyStr = Base64.getEncoder().encodeToString(privateKey.getEncoded());
            String publicKeyStr = Base64.getEncoder().encodeToString(publicKey.getEncoded());
            return new RsaKeyPair(publicKeyStr,privateKeyStr);
        }

        /**
         * 获取公钥
         * @param publicKey
         * @return
         * @throws Exception
         */
        public static RSAPublicKey getPublicKey(String publicKey) throws Exception{
            byte[] keyBytes = Base64.getDecoder().decode(publicKey);
            X509EncodedKeySpec spec = new X509EncodedKeySpec(keyBytes);
            KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM);
            return (RSAPublicKey) keyFactory.generatePublic(spec);
        }

        /**
         * 获取私钥
         * @param privateKey
         * @return
         * @throws NoSuchAlgorithmException
         * @throws InvalidKeySpecException
         * @throws Exception
         */
        public static RSAPrivateKey getPrivateKey(String privateKey) throws Exception{
            byte[] keyBytes = Base64.getDecoder().decode(privateKey);
            PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes);
            KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM);
            return (RSAPrivateKey) keyFactory.generatePrivate(spec);
        }

        /**
         * 要私钥签名
         * @throws InvalidKeySpecException
         * @throws Exception
         */
        public static String sign(String content, String privateKey, boolean isRsa2) throws Exception {
            PrivateKey priKey = getPrivateKey(privateKey);
            java.security.Signature signature = java.security.Signature.getInstance(getAlgorithms(isRsa2));
            signature.initSign(priKey);
            signature.update(content.getBytes(DEFAULT_CHARSET));
            byte[] signed = signature.sign();
            return Base64.getEncoder().encodeToString(signed);
        }

        /**
         * 要公钥签名
         */
        public static boolean verify(String content,String sign,String publicKey,boolean isRsa2) throws Exception {
            PublicKey pubKey = getPublicKey(publicKey);
            java.security.Signature signature = java.security.Signature.getInstance(getAlgorithms(isRsa2));
            signature.initVerify(pubKey);
            signature.update(content.getBytes(DEFAULT_CHARSET));
            return signature.verify(Base64.getDecoder().decode(sign));
        }

        /**
         * 加密
         * @param input
         * @param pubOrPrikey
         * @return
         */
        public static String encrypt(String content, Key pubOrPrikey) throws Exception{
            Cipher cipher = null;
            cipher = Cipher.getInstance(ALGORITHM);
            cipher.init(Cipher.ENCRYPT_MODE, pubOrPrikey);
            byte[] result = cipher.doFinal(content.getBytes(DEFAULT_CHARSET));
            return Base64.getEncoder().encodeToString(result);
        }

        /**
         * 解密
         * @param input
         * @param pubOrPrikey
         * @return
         */
        public static String decrypt(String content, Key pubOrPrikey) throws Exception {
            Cipher cipher = null;
            cipher = Cipher.getInstance(ALGORITHM);
            cipher.init(Cipher.DECRYPT_MODE, pubOrPrikey);
            byte[] result = cipher.doFinal(Base64.getDecoder().decode(content));
            return new String(result);
        }
    }

}
时间: 2024-08-10 23:29:21

java util - MD5/AES/RSA快速调用工具的相关文章

java.util.Math类--数学相关的工具类

Math类--数学相关的工具类 java.util.Math类是数学相关的工具类,里面提供了大量的静态方法,完成与数学运算相关的操作. public static double abs(double num);获取绝对值.有多种重载: public static double ceil(double num);向上取整. public static double floor(double num);向下取整. public static long round(double num);四舍五入.

我的Android进阶之旅------&gt;Android采用AES+RSA的加密机制对http请求进行加密

前言 未加密的抓包截图 加密之后的抓包截图 基本需求及概念 AES算法 AES基本原理及算法流程 AES算法流程 RSA算法 RSA算法基本原理及流程 RSA算法实现流程 AES与RSA相结合数据加密方案 Android端 AESRSA结合实践 基本要求 基本流程 Android端 服务器端 java版示例 更多参考 前言 最近维护公司APP应用的登录模块,由于测试人员用Fiddler抓包工具抓取到了公司关于登录时候的明文登录信息.虽然使用的是HTTPS的方式进行http请求的,但还是被Fidd

[转载] java多线程学习-java.util.concurrent详解(一) Latch/Barrier

转载自http://janeky.iteye.com/blog/769965 Java1.5提供了一个非常高效实用的多线程包:java.util.concurrent, 提供了大量高级工具,可以帮助开发者编写高效.易维护.结构清晰的Java多线程程序.从这篇blog起,我将跟大家一起共同学习这些新的Java多线程构件 1. CountDownLatch     我们先来学习一下JDK1.5 API中关于这个类的详细介绍: “一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个

Java 加密解密 对称加密算法 非对称加密算法 MD5 BASE64 AES RSA

[前言] 本文简单的介绍了加密技术相关概念,最后总结了java中现有的加密技术以及用法和样例 [最简单的加密] 1.简单的概念 明文:加密前的信息 密文:机密后的信息 算法:加密或解密的算法 密钥:算法使用的钥匙(读作miyao.正确应该是miyue,可是大家都读miyao) 2.简单的样例 将123456每位数字都加1后得到234567, 当中123456就是明文.234567就是密文.加密密钥就是1,加密算法是每位加 3.对称加密和非对称加密 以上为例. 123456-->234567的加密

Android网络传输中必用的两个加密算法:MD5 和 RSA (附java完成测试代码)

MD5和RSA是网络传输中最常用的两个算法,了解这两个算法原理后就能大致知道加密是怎么一回事了.但这两种算法使用环境有差异,刚好互补. 一.MD5算法 首先MD5是不可逆的,只能加密而不能解密.比如明文是yanzi1225627,得到MD5加密后的字符串是:14F2AE15259E2C276A095E7394DA0CA9  但不能由后面一大串倒推出yanzi1225627.因此可以用来存储用户输入的密码在服务器上.现在下载文件校验文件是否中途被篡改也是用的它,原理参见:http://blog.c

集合-强大的集合工具类:java.util.Collections中未包含的集合工具

任何对JDK集合框架有经验的程序员都熟悉和喜欢java.util.Collections包含的工具方法.Guava沿着这些路线提供了更多的工具方法:适用于所有集合的静态方法.这是Guava最流行和成熟的部分之一. 我们用相对直观的方式把工具类与特定集合接口的对应关系归纳如下: 集合接口 属于JDK还是Guava 对应的Guava工具类 Collection JDK Collections2:不要和java.util.Collections混淆 List JDK Lists Set JDK Set

Java 常用的日志工具——JDK自带的java.util.logging包、APACHE 的log4j 与 slf4j日志处理接口

考虑以下情况: (1).根据程序输出可以很好地帮助程序员调试程序.在编写小型程序时,可以在程序中不断增加 System.out.print() 语句来查看程序运行状态:在大型系统中,显然这一做法非常不对,可以考虑将调试信息通过日志处理工具,输出到一个文本文件中,然后查看文件内容. (2).在系统开始线上运行后,系统管理人员需要获知系统的运行情况,包括但不限于系统开始运行时间.系统关闭时间.系统目前处理任务等,这些状态需要输出到一个经过格式化的日志文件中,供管理人员查看: (3).在编写系统,甚至

密码技术应用设计实践-安全信息传输系统(SITS)(用Java实现DES、RSA、MD5算法)

本系统包括五个模块,注册模块.登录模块.RSA算法模块.DES算法模块.MD5算法模块.这五个模块每一个实现不同的功能.注册模块实现将用户名和密码写入文件中,登录模块则负责将其读入并且判断其是否正确.RSA算法模块实现生成密钥对.加密和解密功能.DES算法模块实现加密和解密功能.MD5算法模块是实现生成摘要的功能. (1).首先为注册界面: package test; import javax.swing.*; import java.awt.*;   //导入必要的包 import java.

自己写的AES和RSA加密解密工具

4 package com.sdyy.common.utils; 5 6 import java.security.Key; 7 import java.security.KeyFactory; 8 import java.security.KeyPair; 9 import java.security.KeyPairGenerator; 10 import java.security.NoSuchAlgorithmException; 11 import java.security.Priva