DES加解密算法:含DES密钥生成、参数名ASCII码从小到大排序

简介: DES加解密算法:含DES密钥生成、参数名ASCII码从小到大排序

目录

DES加解密算法

需要的Maven依赖

使用的JDK版本:1.8.0_111

DES加解密算法:含DES密钥生成、参数名ASCII码从小到大排序

混合使用对称加密和非对称加密。



DES加解密算法

需要的Maven依赖


        <!-- 工具类 -->
        <!-- https://mvnrepository.com/artifact/commons-lang/commons-lang -->
        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.6</version>
        </dependency>
        <!-- FASTJSON -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.20</version>
        </dependency>

使用的JDK版本:1.8.0_111

 

DES加解密算法:含DES密钥生成、参数名ASCII码从小到大排序


import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang.StringUtils;
import javax.crypto.*;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
/**
 * @version V1.0
 * @Title: DES加解密算法
 * @ClassName: com.newcapec.util.encrypt.DLDesUtil.java
 * @Description:
 * SysConstant.CHARSET_UTF8 = "UTF-8";
 * @Copyright 2016-2018 - Powered By 研发中心
 * @author: 王延飞
 * @date: 2018-08-16 11:43
 */
public class DLDesUtil {
    private static final String algorithm = "DESede"; //算法名称
    private static final String fullAlg = algorithm + "/CBC/PKCS5Padding";
    /**
     * @param encryptSrc 待加密字符串
     * @param encodeFlag 是否URL编码 1-URL编码 0-不URL编码
     * @param keyData    DES密钥
     * @return java.lang.String
     * @Title: DES加密
     * @methodName: encrypt
     * @Description:
     * @author: 王延飞
     * @date: 2018-08-16 11:43
     */
    public static String encrypt(String encryptSrc, String encodeFlag, String keyData) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException {
        Cipher cipher1 = Cipher.getInstance(fullAlg);
        int blockSize = cipher1.getBlockSize();
        byte[] iv = new byte[blockSize];
        for (int i = 0; i < blockSize; ++i) {
            iv[i] = 0;
        }
        Cipher cipher = Cipher.getInstance(fullAlg);
        SecretKey secretKey = new SecretKeySpec(Base64.decode(keyData), StringUtils.substringBefore(fullAlg, "/"));
        IvParameterSpec ivSpec = new IvParameterSpec(iv);
        /**加密*/
        cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivSpec);
        byte[] cipherBytes = cipher.doFinal(encryptSrc.getBytes(SysConstant.CHARSET_UTF8));
        String cipherString = Base64.encode(cipherBytes);
        if (encodeFlag.equals("1")) {
            cipherString = URLEncoder.encode(cipherString, SysConstant.CHARSET_UTF8);
        }
        return cipherString;
    }
    /**
     * @param decryptSrc 待解密字符串
     * @param decodeFlag 是否URL解码 1-URL解码 0-不URL解码
     * @param keyData    DES密钥
     * @return java.lang.String
     * @Title: DES解密
     * @methodName: decrypt
     * @Description:
     * @author: 王延飞
     * @date: 2018-08-16 11:45
     */
    public static String decrypt(String decryptSrc, String decodeFlag, String keyData) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidAlgorithmParameterException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException {
        if (decodeFlag.equals("1")) {
            decryptSrc = URLDecoder.decode(decryptSrc, SysConstant.CHARSET_UTF8);
        }
        Cipher cipher1 = Cipher.getInstance(fullAlg);
        int blockSize = cipher1.getBlockSize();
        byte[] iv = new byte[blockSize];
        for (int i = 0; i < blockSize; ++i) {
            iv[i] = 0;
        }
        Cipher cipher = Cipher.getInstance(fullAlg);
        SecretKey secretKey = new SecretKeySpec(Base64.decode(keyData), StringUtils.substringBefore(fullAlg, "/"));
        IvParameterSpec ivSpec = new IvParameterSpec(iv);
        /**解密*/
        cipher.init(Cipher.DECRYPT_MODE, secretKey, ivSpec);
        byte[] resultBytes = cipher.doFinal(Base64.decode(decryptSrc));
        String resultStr = new String(resultBytes, SysConstant.CHARSET_UTF8);
        return resultStr;
    }
    private static final String[] keyArr = 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", "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", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0"};
    /**
     * @return java.lang.String
     * @Title: 生成密钥
     * @methodName: getDesPassword
     * @Description:
     * @author: 王延飞
     * @date: 2018-08-16 11:47
     */
    public static String getDesPassword() {
        StringBuffer sb = new StringBuffer();
        Random ran = new Random();
        for (int i = 0; i < 32; i++) {
            sb.append(keyArr[ran.nextInt(58)]);
        }
        return sb.toString();
    }
    /**
     * @param paramMap 参数
     * @return java.lang.String
     * @Title: 参数名ASCII码从小到大排序
     * @methodName: paramSort
     * @Description:
     * @author: 王延飞
     * @date: 2018-08-16 14:29
     */
    public static String paramSort(Map<String, String> paramMap) {
        List<String> list = new ArrayList<>();
        for (String mapkey : paramMap.keySet()) {
            String value = paramMap.get(mapkey);
            if (StringUtils.isNotEmpty(value)) {
                list.add(new StringBuilder(mapkey).append("=").append(value).toString());
            }
        }
        Collections.sort(list);
        String paramSorted = StringUtils.join(list, "&");
        return paramSorted;
    }
    /**
     * @param str URL键值对的格式(即key1=value1&key2=value2…)
     * @return java.util.Map<java.lang.String       ,       java.lang.String>
     * @Title: URL键值对的格式(即key1=value1&key2=value2…),转换为MAP
     * @methodName: paramToMAP
     * @Description:
     * @author: 王延飞
     * @date: 2018-08-16 16:41
     */
    public static Map<String, String> paramToMAP(String str) {
        String[] strs = str.split("&");
        Map<String, String> m = new HashMap<String, String>();
        for (String s : strs) {
            String[] ms = s.split("=");
            m.put(ms[0], ms[1]);
        }
        return m;
    }
    public static void main(String[] args) throws InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException {
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("hostUserId", "470143");
        jsonObject.put("hostCustomerCode", "6797");
        jsonObject.put("hostCustomerName", "114测试-t50");
        jsonObject.put("isBindEcard", "0");
        jsonObject.put("payUserIdNum", "201700001");
        jsonObject.put("payUserName", "张三1");
        jsonObject.put("payUserPhone", "15515822065");
        jsonObject.put("pluginType", "3");
        jsonObject.put("interurl", "fillcard");
        String jsonString = jsonObject.toJSONString();
        System.out.println("参数名<JSON>:" + jsonString);
        //String key = DLDesUtil.getDesPassword();
        String key = "X6kWEiP8BwjE3esQbIUQKST4iRHEtgKU";
        System.out.println("密钥:" + key);
        String en = DLDesUtil.encrypt(jsonString, "1", key);
        System.out.println("密文:" + en);
        String de = DLDesUtil.decrypt(en, "1", key);
        System.out.println("明文:" + de);
        JSONObject json = JSONObject.parseObject(de);
        String hostUserId = json.getString("hostUserId");
        System.out.println("hostUserId:" + hostUserId);
        /*String deskey = SysConstant.DL_CLOUD_DESKEY;
        String enStr = "gaZ7WbjF8Q1MY6%2BXldMDuP%2BCyiaBZndmbBe2hxqLqDDhiKnfSbGO%2BXbanwqqxkOKh9X2%2BuXX7YKpjVfBn6RPMWPus83sPnQtDHj2gXKvBcc%2Bys6m%2B8KQkpz3rYZBrQCKeKiAT69Su68KSr3JZCUlkB3Slh6dMJOPgACgvy7kXpNIlKHlMHshK6v7o%2FWmLCo73xC%2FwJRqn5wwJHnSiiKVZ0ub8VTKMRNpEUS0M3%2FBIc8%3D";
        String de = DLDesUtil.decrypt(enStr, "1", deskey);
        System.out.println("明文:" + de);
        JSONObject json = JSONObject.parseObject(de);*/
    }
}


混合使用对称加密和非对称加密

混合密码系统结合了非对称加密算法和对称加密算法的优势:

  • 利用非对称加密算法的“非对称性”,解决对称密钥的传递问题。
  • 利用对称加密算法的加解密速度,解决非对称加解密的速度问题。


混合密码系统的加密

混合加密

 

混合加密

  1. 发送者利用一个随机数生成器生成一个对称加密算法的会话密钥。
  2. 使用会话密钥加密会话消息,得到会话消息密文(对称加密)。
  3. 使用接受者的公钥加密会话密钥,得到会话密钥密文(非对称加密)。 4.组合会话密钥密文和会话消息密文。


混合密码系统的解密

混合解密

 

混合解密

  1. 分离密文,等到会话密钥密文和会话消息密文。
  2. 用私钥解密会话密钥密文,得到会话密钥(非对称加密)。
  3. 用会话密钥解密会话消息密文,得到会话消息(对称加密)。



目录
相关文章
|
5天前
|
算法
【算法】二分查找——在排序数组中查找元素的第一个和最后一个位置
【算法】二分查找——在排序数组中查找元素的第一个和最后一个位置
|
6天前
|
搜索推荐 算法 Java
现有一个接口DataOperation定义了排序方法sort(int[])和查找方法search(int[],int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法
该博客文章通过UML类图和Java源码示例,展示了如何使用适配器模式将QuickSort类和BinarySearch类的排序和查找功能适配到DataOperation接口中,实现算法的解耦和复用。
现有一个接口DataOperation定义了排序方法sort(int[])和查找方法search(int[],int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法
|
7天前
|
算法 JavaScript 前端开发
对称加密算法解析:DES、AES及其在`pycryptodome` 和 `crypto-js` 模块中的应用
对称加密算法解析:DES、AES及其在`pycryptodome` 和 `crypto-js` 模块中的应用
22 1
|
12天前
|
算法 关系型数据库 MySQL
揭秘MySQL中的版本号排序:这个超级算法将颠覆你的排序世界!
【8月更文挑战第8天】在软件开发与数据管理中,正确排序版本号对软件更新及数据分析至关重要。因MySQL默认按字符串排序版本号,可能出现&#39;1.20.0&#39;在&#39;1.10.0&#39;之前的不合理情况。解决办法是将版本号各部分转换为整数后排序。例如,使用`SUBSTRING_INDEX`和`CAST`函数从`software`表的`version`字段提取并转换版本号,再按这些整数排序。这种方法可确保版本号按逻辑正确排序,适用于&#39;major.minor.patch&#39;格式的版本号。对于更复杂格式,需调整处理逻辑。掌握此技巧可有效应对版本号排序需求。
38 3
|
1天前
|
算法 搜索推荐
支付宝商业化广告算法问题之基于pretrain—>finetune范式的知识迁移中,finetune阶段全参数训练与部分参数训练的效果如何比较
支付宝商业化广告算法问题之基于pretrain—>finetune范式的知识迁移中,finetune阶段全参数训练与部分参数训练的效果如何比较
|
4天前
|
算法 搜索推荐
算法设计 (分治法应用实验报告)基于分治法的合并排序、快速排序、最近对问题
这篇文章是关于分治法应用的实验报告,详细介绍了如何利用分治法实现合并排序和快速排序算法,并探讨了使用分治法解决二维平面上的最近对问题的方法,包括伪代码、源代码实现及时间效率分析,并附有运行结果和小结。
|
6天前
|
算法
基于EM期望最大化算法的GMM模型参数估计matlab仿真
此程序在MATLAB 2022a中实现了基于EM算法的GMM参数估计,用于分析由多个高斯分布组成的混合数据。程序通过迭代优化各高斯组件的权重、均值与协方差,直至收敛,并输出迭代过程的收敛曲线及最终参数估计结果。GMM假设数据由K个高斯分布混合而成,EM算法通过E步计算样本归属概率,M步更新参数,循环迭代直至收敛。
|
1月前
|
算法 数据安全/隐私保护
基于GA遗传优化算法的Okumura-Hata信道参数估计算法matlab仿真
在MATLAB 2022a中应用遗传算法进行无线通信优化,无水印仿真展示了算法性能。遗传算法源于Holland的理论,用于全局优化,常见于参数估计,如Okumura-Hata模型的传播损耗参数。该模型适用于150 MHz至1500 MHz的频段。算法流程包括选择、交叉、变异等步骤。MATLAB代码执行迭代,计算目标值,更新种群,并计算均方根误差(RMSE)以评估拟合质量。最终结果比较了优化前后的RMSE并显示了SNR估计值。
37 7
|
11天前
|
存储 算法 Java
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
10 0
|
1月前
|
存储 算法 搜索推荐
算法进阶之路:Python 归并排序深度剖析,让数据排序变得艺术起来!
【7月更文挑战第12天】归并排序是高效稳定的排序算法,采用分治策略。Python 实现包括递归地分割数组及合并已排序部分。示例代码展示了如何将 `[12, 11, 13, 5, 6]` 分割并归并成有序数组 `[5, 6, 11, 12, 13]`。虽然 $O(n log n)$ 时间复杂度优秀,但需额外空间,适合大规模数据排序。对于小规模数据,可考虑其他算法。**
57 4

热门文章

最新文章