问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

有什么好的java加密解密方法,求共享

发布网友 发布时间:2022-04-25 02:39

我来回答

1个回答

热心网友 时间:2023-10-21 18:34

下面是我的一个工具类,你看下:


package com.sojson.common.utils;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
/**
 * 
 * 开发公司:SOJSON在线工具 <p>
 * 版权所有:© www.sojson.com
 * 博客地址:http://www.sojson.com/blog/
 * <p>
 * 
 * 注释写这里
 * 
 * <p>
 * 
 * 区分 责任人 日期    说明<br/>
 * 创建 周柏成 2017年3月13日  <br/>
 *
 * @author zhou-cheng
 * @email  so@sojson.com
 * @version 1.0,2015年1月18日 <br/>
 * 
 */
public class Encrypt {
    public static final String getMD5(String text) {
        // return text;
        byte[] intext = text.getBytes();
        MessageDigest md5 = null;
        try {
            md5 = MessageDigest.getInstance("MD5");
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException(e);
        }
        byte[] md5rslt = md5.digest(intext);
        StringBuffer verifyMsg = new StringBuffer();
        for (int i = 0; i < md5rslt.length; i++) {
            int hexChar = 0xFF & md5rslt[i];
            String hexString = Integer.toHexString(hexChar);
            hexString = (hexString.length() == 1) ? "0" + hexString : hexString;
            verifyMsg.append(hexString);
        }
        return verifyMsg.toString().toLowerCase();
    }

    public static byte[] key = { -42, 1, 25, 25, -57, 84, 67, 32 };

    static byte[] encrypt(byte[] data, byte[] b) throws Exception {
        DESKeySpec dks = new DESKeySpec(b);
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
        SecretKey key = keyFactory.generateSecret(dks);
        SecureRandom sr = new SecureRandom();
        Cipher cipher = Cipher.getInstance("DES");
        cipher.init(Cipher.ENCRYPT_MODE, key, sr);
        byte[] encryptedData = cipher.doFinal(data);
        return encryptedData;
    }

    static byte[] decrypt(byte[] data, byte[] b) throws Exception {
        DESKeySpec dks = new DESKeySpec(b);
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
        SecretKey key = keyFactory.generateSecret(dks);
        SecureRandom sr = new SecureRandom();
        Cipher cipher = Cipher.getInstance("DES");
        cipher.init(Cipher.DECRYPT_MODE, key, sr);
        byte[] decryptedData = cipher.doFinal(data);
        return decryptedData;
    }

    static byte[] getKey() throws Exception {
        SecureRandom sr = new SecureRandom();
        KeyGenerator kg = KeyGenerator.getInstance("DES");
        kg.init(sr);
        SecretKey key = kg.generateKey();
        byte[] b = key.getEncoded();
        return b;
    }

    public static String shortUrl(String url, int random) {
        // 可以自定义生成 MD5 加密字符传前的混合 KEY
        String key = "gohome";
        // 要使用生成 URL 的字符
        String[] chars = new String[] { "a", "b", "c", "d", "e", "f", "g", "h",
                "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t",
                "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5",
                "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H",
                "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T",
                "U", "V", "W", "X", "Y", "Z" };

        // 对传入网址进行 MD5 加密
        String sMD5EncryptResult = getMD5(key + url);
        String hex = sMD5EncryptResult;
        String[] resUrl = new String[4];
        for (int i = 0; i < 4; i++) {
            // 把加密字符按照 8 位一组 16 进制与 0x3FFFFFFF 进行位与运算
            String sTempSubString = hex.substring(i * 8, i * 8 + 8);
            // 这里需要使用 long 型来转换,因为 Inteper .parseInt() 只能处理 31 位 , 首位为符号位 , 如果不用
            // long ,则会越界
            long lHexLong = 0x3FFFFFFF & Long.parseLong(sTempSubString, 16);
            String outChars = "";
            for (int j = 0; j < 6; j++) {
                // 把得到的值与 0x0000003D 进行位与运算,取得字符数组 chars 索引
                long index = 0x0000003D & lHexLong;
                // 把取得的字符相加
                outChars += chars[(int) index];
                // 每次循环按位右移 5 位
                lHexLong = lHexLong >> 5;
            }
            // 把字符串存入对应索引的输出数组
            resUrl[i] = outChars;
        }
        return resUrl[random];
    }

    // 6位短连接
    public static String shortUrl(String url) {
        // 可以自定义生成 MD5 加密字符传前的混合 KEY
        String key = String.valueOf(System.currentTimeMillis());
        // 要使用生成 URL 的字符
        String[] chars = new String[] { "a", "b", "c", "d", "e", "f", "g", "h",
                "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t",
                "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5",
                "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H",
                "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T",
                "U", "V", "W", "X", "Y", "Z"

        };
        // 对传入网址进行 MD5 加密
        String sMD5EncryptResult = getMD5(key + url);
        String hex = sMD5EncryptResult;
        String resUrl = "";
        // 把加密字符按照 8 位一组 16 进制与 0x3FFFFFFF 进行位与运算
        String sTempSubString = hex.substring(0 * 8, 0 * 8 + 8);
        // 这里需要使用 long 型来转换,因为 Inteper .parseInt() 只能处理 31 位 , 首位为符号位 , 如果不用
        // long ,则会越界
        long lHexLong = 0x3FFFFFFF & Long.parseLong(sTempSubString, 16);
        String outChars = "";
        for (int j = 0; j < 6; j++) {
            // 把得到的值与 0x0000003D 进行位与运算,取得字符数组 chars 索引
            long index = 0x0000003D & lHexLong;
            // 把取得的字符相加
            outChars += chars[(int) index];
            // 每次循环按位右移 5 位
            lHexLong = lHexLong >> 5;
        }
        // 把字符串存入对应索引的输出数组
        resUrl = outChars;
        return resUrl;
    }

    /**
     * 方法描述: md5签名
     * 
     * @param src
     * @return
     * @throws Exception
     */
    public static String md5Digest(String src) throws Exception {
        MessageDigest md = MessageDigest.getInstance("MD5");
        byte[] b = md.digest(src.getBytes("UTF-8"));
        return byte2HexStr(b);
    }

    /**
     * 字节数组转化为大写16进制字符串
     * 
     * @param b
     * @return
     */
    public static String byte2HexStr(byte[] b) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < b.length; i++) {
            String s = Integer.toHexString(b[i] & 0xFF);
            if (s.length() == 1) {
                sb.append("0");
            }
            sb.append(s.toUpperCase());
        }
        return sb.toString();
    }

}

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
!这叫什么号 百万医疗赔付后是否可以续保 前一年理赔过医疗险还能续保吗? 医疗住院险理赔后还能购买吗? 女生多大后可以不在长身高? 如何不用软件把手机投屏到电脑上手机屏幕怎样投放到电脑上 战时拒绝、故意延误军事订货罪既遂的处罚? 战时故意延误军事订货罪处罚标准 名师1+1导读方案:汤姆·索亚历险记目录 三星sm-g7200打开微信慢,无法正常收看,网速不慢。 被狗咬伤,意外险可以理赔吗 请问瑶柱瘦肉粥怎么煲? 90年代都有哪些武侠电视剧呀 !? 离婚期间前妻交往过多个新男友,现在提出复婚要求我是否应该接受? 石头的比重一立方多少吨? 9岁女孩检查骨龄5.9岁,身高1米14这样的情况,需要打生长激素吗? 炉肉淮山粥能放瑶柱吗? 形容花椒的句子 对爱情有幻想 90年代的时装潮流都有哪些?90年代流行什么服饰? 这个卡通头像叫什么名字? 前妻有男朋友了,我还要和她保持联系吗? 我国目前有多少个税种? 一立方石头大约多重 大学有寒假作业暑假作业吗? 地铁怎么坐?流程 糖尿病人能吃梨和桃子吗 充电器上写着2.5A250v,是多少瓦?从晚上十点半左右插上的到凌晨一点半左右才拔下来费多少电? 无线网络中的TKIP和AES有区别么? 视尔如荍,贻我握椒。请问这句诗的意思是什么? 9岁女童骨龄正常激素高是性早熟吗?拜托各位了 3Q 这个动漫头像叫什么名字?有吗? 对爱情的幻想该不该有... 一个女人晚上十点半左右给一个男人发微信说 我充电器掉了,今天晚上充不了电了,男的跟对方(女的)聊天 中国总共有多少种税收税目 90年代都有些什么保险公司? 短网址可以在短信内容里面提供什么功能呢? 寒假作文有木有啊!我需要四篇 被狗咬伤意外险给报吗? 9岁女孩骨龄长的太快,做什么运动可以长高 我总是对爱情充满着幻想,并且是不切实际的幻想。。。该怎么办呢?总是把爱情想的很完美很浪漫 淮山、瑶柱能天天吃吗?大神们帮帮忙 键盘各个区域分别叫什么?(如图) 白天的清晨、早上、上午、中午、下午、傍晚具体指几点钟?夜晚的上夜、下夜、深夜、凌晨具体指几点钟? 以下图片的两个卡通头像人物的名称。 男子不满前妻交往新男友,将其绑在副驾驶6小时并*,到底怎么回事? 坐地铁的步骤? 形容药到病除的诗句 尼采对于爱情的观点 被女朋友甩了,分手期间她骗我说去睡觉了,我发现有问题,就被我逮了个正着。我还爱着她,我该怎么办?