拒绝数据裸奔,进行3DES加密很重要!(Java,JavaScript)

2023-11-09

一、前言

对于3DES加密百度上大部分都有很详细的解释这里就不再赘述,本文只针对Java以及JavaScript进行使用3DES加密的过程进行详细的解答,并对容易采坑以及容易疑惑的地方进行详细解释;

注意点
1、3DES加密key 必须为24字节,随便用一个字符串然后获取其byte作为key是会报错的
2、3DES有多重加密工作模式ECBOFBCTRCFBCBC,本文采用CBC模式加密,需要对各个工作模式进行详细了解的可查看这篇帖子http://blog.51cto.com/aubdiy/815434
3、实现3DES是需要IV偏移量的,偏移量长度必须为8字节
4、3DES有多重填充方式,本文采用***PKCS5Padding***,需要了解详细可自行百度

二、Java实现

  • 一、生成随机加解密key秘钥image.pngimage.png完整代码如下
package com.test;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
import javax.crypto.spec.IvParameterSpec;
import java.security.Key;


public class Crypto3DesUtil {

    private static final String KEY_STRING="isiGuRWo36Gny+Y0yOU+rhYfL4kvUiOD";
    private static final byte[] KEY_IV="99999999".getBytes();//加密IV偏移量,必须为8为字节
    private static final String KEY_ALGORITHM = "DESede";//3DES加密算法
    private static final String PADDING_PATTERN="DESede/CBC/PKCS5Padding";//填充模式

    /**
     * 3Des CBC 模式加密
     * @param data 明文
     * @return Base64编码字符串密文
     * @throws Exception
     */
    public static String Encrypt3DesCBC(String data)throws Exception{
        Cipher cipher = Cipher.getInstance(PADDING_PATTERN);
        IvParameterSpec ips = new IvParameterSpec(KEY_IV);
        cipher.init(Cipher.ENCRYPT_MODE, get3DesKey(), ips);
        byte[] bOut = cipher.doFinal(data.getBytes());
        return new BASE64Encoder().encode(bOut);
    }

    /**
     * 3DES解密
     * @param cipherBase64Str Base64编码字符串密文
     * @return 解密后内容
     * @throws Exception
     */
    public static String Decrypt3DesCBC(String cipherBase64Str) throws Exception {
        byte[] cipherStrByte= new BASE64Decoder().decodeBuffer(cipherBase64Str);
        Cipher cipher = Cipher.getInstance(PADDING_PATTERN);
        IvParameterSpec ips = new IvParameterSpec(KEY_IV);
        cipher.init(Cipher.DECRYPT_MODE, get3DesKey(), ips);
        byte[] bOut = cipher.doFinal(cipherStrByte);
        return new String(bOut, "UTF-8");

    }

    /**
     * 获取3Des秘钥对象
     * @return
     * @throws Exception
     */
    public static Key get3DesKey()throws Exception{
        //将keyString从Base64编码字符串转为原始正常的byte[]
        byte[] key= new BASE64Decoder().decodeBuffer(KEY_STRING);
        //实例化DES密钥规则
        DESedeKeySpec spec = new DESedeKeySpec(key);
        //实例化3DES(desede)密钥工厂
        SecretKeyFactory keyfactory = SecretKeyFactory.getInstance(KEY_ALGORITHM);
        //生成秘钥
        return keyfactory.generateSecret(spec);
    }


    public static void main(String[] args)throws Exception {
//        //生成指定算法的秘密密钥的生成器
//        KeyGenerator kg = KeyGenerator.getInstance(KEY_ALGORITHM);
//        //初始化此密钥生成器,使其具有确定的密钥大小
//        kg.init(168);
//        //生成一个密钥
//        SecretKey secretKey = kg.generateKey();
//        //将秘钥转为Base64编码字符串
//        String keyStr= new BASE64Encoder().encode(secretKey.getEncoded());
//        System.out.println(keyStr);


        //加密
        String cipherStr= Crypto3DesUtil.Encrypt3DesCBC("testtttest");
        System.out.println(cipherStr);
        //解密
        String dataStr= Crypto3DesUtil.Decrypt3DesCBC(cipherStr);
        System.out.println(dataStr);

    }
}
  • 二、加解密实现

三、JavaScript实现

  • 1、JavaScript采用开源的CryptoJS来实现,GitHub地址https://github.com/sytelus/CryptoJS,下载下来后找到rollups/tripledes.js并将其引用
        var key = CryptoJS.enc.Base64.parse("isiGuRWo36Gny+Y0yOU+rhYfL4kvUiOD"); //将Base64编码字符串解码为原始二进制byte
		var ivs=CryptoJS.enc.Utf8.parse('99999999');//得到偏移量的二进制byte字节
		//**加密**
		var encrypted = CryptoJS.TripleDES.encrypt("testtttest", key, {
			iv: ivs,
			mode: CryptoJS.mode.CBC,
			padding: CryptoJS.pad.Pkcs7
		}); 
		var cipherStr = encrypted.toString();//得到base64编码字符串密文 
		console.log(cipherStr); 

		//**解密**
		var decrypted = CryptoJS.TripleDES.decrypt({
			ciphertext: CryptoJS.enc.Base64.parse(cipherStr)
		}, key, {
			iv: ivs,
			mode: CryptoJS.mode.CBC,
			padding: CryptoJS.pad.Pkcs7
		});
		var data=decrypted.toString(CryptoJS.enc.Utf8);//转为UTF-8的原始数据
		console.log(data);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

拒绝数据裸奔,进行3DES加密很重要!(Java,JavaScript) 的相关文章

  • 如何在日期选择器中设置不在当前月份的单元格的样式

    我目前正在为我的 JavaFX 应用程序制作注册表 问题是 当日期选择器中的单元格不在页面的月份上时 我想让该单元格变灰 让我们看看我当前的日期选择器 我的日期选择器 正如您所看到的 我希望下个月的日期 27 日 28 日 30 日以及 1
  • 如果测试用例失败,Selenium Web 驱动程序无法关闭 Firefox 实例

    我各位 我正在使用 junit 和 selenium web 驱动程序 2 28 问题是 如果我运行成功的测试用例 Web 驱动器能够关闭 Firefox 实例 但是当测试用例失败时 Selenium Web 驱动器无法关闭 Firefox
  • JavaMail Gmail 问题。 “准备启动 TLS”然后失败

    mailServerProperties System getProperties mailServerProperties put mail smtp port 587 mailServerProperties put mail smtp
  • 如何在 JFace 的 TableViewer 中创建复选框?

    我创建了一个包含两列的 tableViewer 我想将其中一列设为复选框 为此 我创建了一个 CheckBoxCellEditor 但我不知道为什么它不起作用 名为 tableName 的列显示其值正常 色谱柱规格如下 String COL
  • 线程自动利用多个CPU核心?

    假设我的应用程序运行 2 个线程 例如渲染线程和游戏更新线程 如果它在具有多核 CPU 当今典型 的移动设备上运行 我是否可以期望线程在可能的情况下自动分配给不同的核心 我知道底层操作系统内核 Android linux内核 决定调度 我的
  • JNI 不满意链接错误

    我想创建一个简单的 JNI 层 我使用Visual studio 2008创建了一个dll Win 32控制台应用程序项目类型 带有DLL作为选项 当我调用本机方法时 出现此异常 Exception occurred during even
  • 使用 ANTLR 为 java 源代码生成抽象语法树

    如何使用 ANTLR 从 java src 代码生成 AST 有什么帮助吗 好的 步骤如下 前往ANTLR站点 http www antlr org 并下载最新版本 下载Java g和JavaTreeParser g文件来自here htt
  • Convert.FromBase64String 方法的 Java 等效项

    Java 中是否有相当于Convert FromBase64String http msdn microsoft com en us library system convert frombase64string aspx which 将指
  • HDFS:使用 Java / Scala API 移动多个文件

    我需要使用 Java Scala 程序移动 HDFS 中对应于给定正则表达式的多个文件 例如 我必须移动所有名称为 xml从文件夹a到文件夹b 使用 shell 命令我可以使用以下命令 bin hdfs dfs mv a xml b 我可以
  • hibernate总是自己删除表中的所有数据

    您好 我正在开发一个 spring mvc 应用程序 它使用 hibernate 连接到存储文件的 mysql 数据库 我有两个方法 一个方法添加我选择的特定文件路径中的所有文件 另一种方法调用查询以返回从 mysql 存储的文件列表 问题
  • 无法理解 Java 地图条目集

    我正在看一个 java 刽子手游戏 https github com leleah EvilHangman blob master EvilHangman java https github com leleah EvilHangman b
  • 如何将文件透明地传输到浏览器?

    受控环境 IE8 IIS 7 ColdFusion 当从 IE 发出指向媒体文件 例如 mp3 mpeg 等 的 GET 请求时 浏览器将启动关联的应用程序 Window Media Player 我猜测 IIS 提供文件的方式允许应用程序
  • 检查 protobuf 消息 - 如何按名称获取字段值?

    我似乎无法找到一种方法来验证 protobuf 消息中字段的值 而无需显式调用其 getter 我看到周围的例子使用Descriptors FieldDescriptor实例到达消息映射内部 但它们要么基于迭代器 要么由字段号驱动 一旦我有
  • 尝试使用 Ruby Java Bridge (RJB) gem 时出现错误“无法创建 Java VM”

    我正在尝试实现 Ruby Java Bridge RJB gem 来与 JVM 通信 以便我可以运行 Open NLP gem 我在 Windows 8 上安装并运行了 Java 所有迹象 至少我所知道的 都表明 Java 已安装并可运行
  • 使用 AWS Java SDK 为现有 S3 对象设置 Expires 标头

    我正在更新 Amazon S3 存储桶中的现有对象以设置一些元数据 我想设置 HTTPExpires每个对象的标头以更好地处理 HTTP 1 0 客户端 我们正在使用AWS Java SDK http aws amazon com sdkf
  • 将多模块 Maven 项目导入 Eclipse 时出现问题 (STS 2.5.2)

    我刚刚花了最后一个小时查看 Stackoverflow com 上的线程 尝试将 Maven 项目导入到 Spring ToolSuite 2 5 2 中 Maven 项目有多个模块 当我使用 STS 中的 Import 向导导入项目时 所
  • 使用 Flyway 和 Hibernate 的 hbm2ddl 在应用程序的生命周期中管理数据库模式

    我正在开发 Spring Hibernate MySql 应用程序 该应用程序尚未投入生产 我目前使用 Hibernatehbm2ddl该功能对于管理域上的更改非常方便 我也打算用Flyway用于数据库迁移 在未来的某个时候 该应用程序将首
  • Java - 不要用 bufferedwriter 覆盖

    我有一个程序可以将人员添加到数组列表中 我想做的是将这些人也添加到文本文件中 但程序会覆盖第一行 因此这些人会被删除 如何告诉编译器在下一个空闲行写入 import java io import java util import javax
  • 将 JTextArea 内容写入文件

    我在 Java Swing 中有一个 JTextArea 和一个 提交 按钮 需要将textarea的内容写入一个带有换行符的文件中 我得到的输出是这样的 它被写为文件中的一个字符串 try BufferedWriter fileOut n
  • android Accessibility-service 突然停止触发事件

    我有一个 AccessibilityService 工作正常 但由于开发过程中的某些原因它停止工作 我似乎找不到这个原因 请看一下我的代码并告诉我为什么它不起作用 public class MyServicee extends Access

随机推荐

  • 特殊区域标注:使用R语言进行数据分析和可视化

    特殊区域标注 使用R语言进行数据分析和可视化 在数据分析和可视化的过程中 我们经常需要对特定的数据区域进行标注 以便更好地理解和传达数据的含义 而R语言作为一种功能强大的数据分析工具 提供了多种方法来实现这一目的 本文将介绍几种常用的技术和
  • 用python让excel飞起来 pdf_讯飞智能键盘K710 一款无网络实力依然在线的黑科技产品...

    科大讯飞一直在人工智能领域创新有佳 产品不断 前一阵子了解科大讯飞发布一款新的智能硬件 讯飞智能键盘K710 居然是键盘和智能语音的神仙组合 究竟是怎样的黑科技 我迫不及待入手看看 下面 就看看这款主打语音的键盘到底是不是如我所想 从选购键
  • 质量检测

    更多详情请查看原文 质量检测 对一份中国工商企业注册数据库的质量考察 Part1 前言 在当前这个信息泛滥的时代 及时 可靠和尽量精准的数据对我们获取知识 理解现实和解决问题变得越来越关键 这催生了一批面对政商学 产学研各个领域专业数据服务
  • Python_RuntimeError问题的解决

    implement array function method already has a docstring 本人开发使用的是apache2 4 python3 6和django 在配置Apache的时候 内外网同时访问就会报错 只能有一
  • 我所理解的设计模式(C++实现)——迭代器模式(Iterator Pattern)

    概述 在现在的电视机中 我们使用 后一个 和 前一个 按钮可以很方便的换台 当按下 后一个 按钮时 将切换到下一个预置的频道 想象一下在陌生的城市中的旅店中看电视 当改变频道时 重要的不是几频道 而是节目内容 如果对一个频道的节目不感兴趣
  • 统一潮流控制器 (UPFC) 的应用,以增强电力系统中的电压稳定性(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 本文详细介绍了统一功率流控制器 UPFC
  • Latex大括号花括号用法之多个子公式分别编号(a)(b)

    latex中想要给每种情况分别编号成 a b 如下所示 首先需要引入的包有 大括号子公式编号需要用到的包 usepackage CJK usepackage indentfirst usepackage amsmath usepackage
  • 使用Python和OpenCV进行多尺度模板匹配

    使用Python和OpenCV进行多尺度模板匹配 1 效果图 2 原理 3 步骤 4 源码 5 参考 这篇博文将实现如何将标准模板匹配扩展到多尺度 从而使其更加健壮 使其可以处理模板和输入图像大小不同的匹配 1 效果图 模板匹配问题 对于模
  • 你好,你的小程序涉及收集、使用和存储用户信息,请增加《用户服务协议》及《隐私政策》最新解决方法

    此文章只合适小白发布小程序给拦截关于 用户协议 隐私协议 2023年的解决方法 当你发布被此原因回退的话你就需要去官方建议你修改提示的页面添加一个复选框即可实现例如我的问题 官方给我提示审核没有过 跳转到这一个页面 3 注意 注意 注意 是
  • SRTM数据介绍与说明

    一 SRTM 的背景引言 美国利用航天飞机搭载成像雷达对地进行观测始于20 世纪80 年代初 1982 年11 月和1985 年10 月 美国分别进行了两次称为S IR2A 与S IR2B 的航天飞机成像雷达实验 结果证明合成孔径雷达 SA
  • 一种基于Arnold变换的数字图像加密算法(Matlab代码实现)

    目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码 1 概述 Arnold变换因其具有周期性 在图像加密方面得到了广泛的应用 但在解密过程中 若要利用其周期性 则显得很费时 因此提出了一种新的Arnold反变换算法 该算法通过
  • Python 类的构造方法

    视频版教程 Python3零基础7天入门实战视频教程 Python类里的 init 方法就是类的构造方法 用作构造对象 同时还可以给对象初始化属性值用 假如类里面没有写init构造方法 默认会提供一个空的构造方法 我们写上空的init构造方
  • Arduino和LabVIEW射频校园火警系统

    该项目的目的是设计一个用于校园火灾警报的监控系统 该系统分为两个部分 1 发射器部分和 2 接收器部分 其方式是 它将在发射器部分的火灾传感器的帮助下感应周围的火灾 并与接收器进行通信 使用2 4 GHz RF调制解调器无线连接 在接收端
  • 前端调用电脑摄像头

    项目中需要前端调用 所以做了如下操作 先看一下效果吧 主要是基于vue3 通过canvas把画面转成base64的形式 然后是把base64转成 file文件 最后调用了一下上传接口 但是这个得开启浏览器的摄像头权限 不然会报错 以下是代码
  • C++类 ——初始化列表

    目录 前言 一 什么是初始化列表 二 为什么要有初始化列表 三 怎么使用初始化列表 前言 我们今天要解决三个问题 什么是初始化列表 为什么要有初始化列表 怎么用初始化列表 一 什么是初始化列表 初始化列表是一种初始化类的成员变量的方式 用于
  • STM32——CAN通信

    1 CAN通信概述 STM32F103有两个CAN 都分别有自己的发送接收邮箱 发送邮箱共有3个来发送报文 发送调度器根据优先级决定哪个邮箱的报文先被发送 共有2个接收FIFO 每个FIFO都可以存放3个完整的报文 它们完全由硬件来管理 C
  • 物体识别实例,抠图

    本示例演示了玉米图像识别的部分 处理步骤如下 首先 读取图像 灰度 然后 二值化固定物体 最后 画出物体 读取图像 灰度 read image Image XXXXX bmp decompose3 Image Image1 Image2 I
  • 关于antd table组件中,数据渲染条数跟后台传入数据不一致的问题

    如果出现表格数据渲染 跟后台传过来的数据的条数不一致的情况 绝大概率的rowkey的问题 我这边当时调试的时候 后台的数据我是存在store中的 包括在table重新渲染的时候 我这边传过来的数据条数都是跟后台的保持一致的 但是渲染的时候
  • solver_factory.hpp:76] Check failed: registry.count(type) == 1 (0 vs. 1) Unknown solver type: SGD

    问题描述 本人遇到这个问题的环境 Ubuntu16 CUDA8 Caffe Matlab2015b 具体环境安装可见个人博客 在编译matlab版本caffe时遇到 安装正常 编译caffe正常 编译matcaffe正常 测试matcaff
  • 拒绝数据裸奔,进行3DES加密很重要!(Java,JavaScript)

    一 前言 对于3DES加密百度上大部分都有很详细的解释这里就不再赘述 本文只针对Java以及JavaScript进行使用3DES加密的过程进行详细的解答 并对容易采坑以及容易疑惑的地方进行详细解释 注意点 1 3DES加密key 必须为24