流行的加密技术,MD5、DES、DESede、Blowfish

本贴最后更新于 4496 天前,其中的信息可能已经天翻地覆

 

package com.xiucaike.common;
import java.security.MessageDigest;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import org.apache.log4j.Logger;
import org.junit.Test;
import sun.misc.BASE64Encoder;

/**

  • @author fnyexx

  • 加密、类型转换工具
    */
    @SuppressWarnings("restriction")
    public class UtilCrpts {

    private static final Logger logger = Logger.getLogger(UtilCrpts.class);

    /** 定义 加密算法,可用 DES,DESede,Blowfish- 默认 DES*/
    private String Algorithm ="DES";

    public String getAlgorithm() {
    return Algorithm;
    }

    public void setAlgorithm(String algorithm) {
    Algorithm = algorithm;
    }

    /** 生成密钥,随机生成 * @return byte[] 返回生成的密钥 */ public String createSecretKey() { KeyGenerator keygen = null; try { keygen = KeyGenerator.getInstance(Algorithm); } catch (Exception e) { logger.error("NoSuchAlgorithmException!"); } SecretKey deskey = keygen.generateKey(); return byte2hex(deskey.getEncoded()); } /** * 将指定的数据根据提供的密钥进行加密 * @param input 需要加密的数据 * @param key 密钥 * @return byte[] 加密后的数据 * @throws Exception */ public byte[] encryptData(String input, String key) { SecretKey deskey = new javax.crypto.spec.SecretKeySpec(stringToByte(key.replace(":", "")), Algorithm); Cipher c1 = null; byte[] cipherByte = null; try { c1 = Cipher.getInstance(Algorithm); c1.init(Cipher.ENCRYPT_MODE, deskey); cipherByte = c1.doFinal(input.getBytes()); } catch (Exception e) { logger.error("error!"); } return cipherByte; } /** * 将给定的已加密的数据通过指定的密钥进行解密 * @param input 待解密的数据 * @param key 密钥 * @return byte[] 解密后的数据 * @throws UnsupportedEncodingException * @throws Exception */ public String decryptData(String input, String key) { SecretKey deskey = new javax.crypto.spec.SecretKeySpec(stringToByte(key.replace(":", "")), Algorithm); Cipher c1 = null; byte[] clearByte = null; String decryptStr = null; try { c1 = Cipher.getInstance(Algorithm); c1.init(Cipher.DECRYPT_MODE, deskey); clearByte = c1.doFinal(stringToByte(input.replace(":", ""))); decryptStr = new String(clearByte,"utf-8"); } catch (Exception e) { logger.error("error"); } return decryptStr; } /** * 对密码进行MD5加密(非对称加密,不能解密,适用于密码匹配) * @param : String 原始密码 * @return: String 密码密文 */ public String MD5Encrypt(String pwd){ MessageDigest md = null; try { md = MessageDigest.getInstance("MD5"); } catch (Exception e) { logger.error("NoSuchAlgorithmException!"); } md.update(pwd.getBytes()); byte[] result = md.digest(); return byteToString(result); } /** * 字节码转换成16进制字符串 * @param byte[]b 输入要转换的字节码 * @return String 返回转换后的16进制字符串 */ public String byte2hex(byte[] b) { String hs = ""; String stmp = ""; for (int n = 0; n < b.length; n++) { stmp = (java.lang.Integer.toHexString(b[n] & 0XFF)); if (stmp.length() == 1) hs = hs + "0" + stmp; else hs = hs + stmp; if (n < b.length - 1) hs = hs + ":"; } return hs.toUpperCase(); } /** * 16进制字符串转换为byte数组 "1212"={12,12} * @param strIn * 需要转换的字符串 * @return 转换后的byte数组 * @throws IllegalArgumentException */ public byte[] stringToByte(String hex) throws IllegalArgumentException { if (hex.length() % 2 != 0) { throw new IllegalArgumentException(); } char[] arr = hex.toCharArray(); byte[] b = new byte[hex.length() / 2]; for (int i = 0, j = 0, l = hex.length(); i < l; i++, j++) { String swap = "" + arr[i++] + arr[i]; int byteint = Integer.parseInt(swap, 16) & 0xFF; b[j] = new Integer(byteint).byteValue(); } return b; } /** * 二进制 byte[] 转字符串 {12,12}="1212" * @param : byte[] * @return: String * @throws AppException */ public String byteToString(byte[] b) { String hs = ""; String stmp = ""; for (int n = 0; n < b.length; n++) { stmp = (Integer.toHexString(b[n] & 0XFF)); if (stmp.length() == 1) { hs = hs + "0" + stmp; } else { hs = hs + stmp; } if (n < (b.length - 1)) { hs = hs + ""; } } return hs; } /** * int类型转换为byte[]类型 * @param input 待转换的int值 * @return byte[] */ public byte[] intTobyte(int input) { byte[] output = new byte[4]; output[0] = (byte) (input & 0xff); output[1] = (byte) ((input >> 8) & 0xff); output[2] = (byte) ((input >> 16) & 0xff); output[3] = (byte) (input >>> 24); return output; } /** * byte[]类型转换为int类型 * @param input 待转换的byte值 * @return int */ public int byteToint(byte[] input) { int output = 0; if (input.length != 4) { logger.error("error!"); } output = (input[0] & 0xff) | ((input[1] << 8) & 0xff00) | ((input[2] << 24) >>> 8) | (input[3] << 24); return output; } /** * 字节数组使用Base64进行编码 * @param value 待编码的字节数组 * @return 使用Base64进行编码的字节数组 */ public String encdoeStrUsingBase64(byte[] value){ String encodeTxt = ""; if( value!=null && value.length>0 ){ encodeTxt= new BASE64Encoder().encode(value); } return encodeTxt; } //DES测试 DESede,Blowfish操作一样 @Test public void test(){ String key = createSecretKey(); String text = "123asdf んぁ”●☆我是好人/.,"; String crpt = byte2hex(encryptData(text , key)); System.out.println("生成KEY:" + key); System.out.println("末加密原文 :" + text); System.out.println("MD5加密后密文:" + MD5Encrypt(text)); System.out.println("DES加密后密文:" + crpt); System.out.println("DES解密后的原文:" + decryptData(crpt, key)); }

}

 

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3195 引用 • 8215 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • BookxNote

    BookxNote 是一款全新的电子书学习工具,助力您的学习与思考,让您的大脑更高效的记忆。

    笔记整理交给我,一心只读圣贤书。

    1 引用 • 1 回帖
  • 黑曜石

    黑曜石是一款强大的知识库工具,支持本地 Markdown 文件编辑,支持双向链接和关系图。

    A second brain, for you, forever.

    21 引用 • 204 回帖
  • Openfire

    Openfire 是开源的、基于可拓展通讯和表示协议 (XMPP)、采用 Java 编程语言开发的实时协作服务器。Openfire 的效率很高,单台服务器可支持上万并发用户。

    6 引用 • 7 回帖 • 102 关注
  • 音乐

    你听到信仰的声音了么?

    62 引用 • 512 回帖
  • JWT

    JWT(JSON Web Token)是一种用于双方之间传递信息的简洁的、安全的表述性声明规范。JWT 作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以 JSON 的形式安全的传递信息。

    20 引用 • 15 回帖 • 19 关注
  • Visio
    1 引用 • 2 回帖
  • React

    React 是 Facebook 开源的一个用于构建 UI 的 JavaScript 库。

    192 引用 • 291 回帖 • 385 关注
  • Tomcat

    Tomcat 最早是由 Sun Microsystems 开发的一个 Servlet 容器,在 1999 年被捐献给 ASF(Apache Software Foundation),隶属于 Jakarta 项目,现在已经独立为一个顶级项目。Tomcat 主要实现了 JavaEE 中的 Servlet、JSP 规范,同时也提供 HTTP 服务,是市场上非常流行的 Java Web 容器。

    162 引用 • 529 回帖 • 4 关注
  • Latke

    Latke 是一款以 JSON 为主的 Java Web 框架。

    71 引用 • 535 回帖 • 821 关注
  • TGIF

    Thank God It's Friday! 感谢老天,总算到星期五啦!

    289 引用 • 4492 回帖 • 651 关注
  • 架构

    我们平时所说的“架构”主要是指软件架构,这是有关软件整体结构与组件的抽象描述,用于指导软件系统各个方面的设计。另外还有“业务架构”、“网络架构”、“硬件架构”等细分领域。

    143 引用 • 442 回帖
  • Office

    Office 现已更名为 Microsoft 365. Microsoft 365 将高级 Office 应用(如 Word、Excel 和 PowerPoint)与 1 TB 的 OneDrive 云存储空间、高级安全性等结合在一起,可帮助你在任何设备上完成操作。

    5 引用 • 34 回帖
  • 工具

    子曰:“工欲善其事,必先利其器。”

    297 引用 • 755 回帖
  • flomo

    flomo 是新一代 「卡片笔记」 ,专注在碎片化时代,促进你的记录,帮你积累更多知识资产。

    6 引用 • 140 回帖
  • FreeMarker

    FreeMarker 是一款好用且功能强大的 Java 模版引擎。

    23 引用 • 20 回帖 • 457 关注
  • 服务

    提供一个服务绝不仅仅是简单的把硬件和软件累加在一起,它包括了服务的可靠性、服务的标准化、以及对服务的监控、维护、技术支持等。

    41 引用 • 24 回帖 • 2 关注
  • 开源

    Open Source, Open Mind, Open Sight, Open Future!

    410 引用 • 3588 回帖
  • Sublime

    Sublime Text 是一款可以用来写代码、写文章的文本编辑器。支持代码高亮、自动完成,还支持通过插件进行扩展。

    10 引用 • 5 回帖
  • 30Seconds

    📙 前端知识精选集,包含 HTML、CSS、JavaScript、React、Node、安全等方面,每天仅需 30 秒。

    • 精选常见面试题,帮助您准备下一次面试
    • 精选常见交互,帮助您拥有简洁酷炫的站点
    • 精选有用的 React 片段,帮助你获取最佳实践
    • 精选常见代码集,帮助您提高打码效率
    • 整理前端界的最新资讯,邀您一同探索新世界
    488 引用 • 384 回帖 • 6 关注
  • OpenResty

    OpenResty 是一个基于 NGINX 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

    17 引用 • 55 关注
  • etcd

    etcd 是一个分布式、高可用的 key-value 数据存储,专门用于在分布式系统中保存关键数据。

    6 引用 • 26 回帖 • 547 关注
  • 链书

    链书(Chainbook)是 B3log 开源社区提供的区块链纸质书交易平台,通过 B3T 实现共享激励与价值链。可将你的闲置书籍上架到链书,我们共同构建这个全新的交易平台,让闲置书籍继续发挥它的价值。

    链书社

    链书目前已经下线,也许以后还有计划重制上线。

    14 引用 • 257 回帖 • 2 关注
  • 程序员

    程序员是从事程序开发、程序维护的专业人员。

    586 引用 • 3538 回帖 • 1 关注
  • SQLite

    SQLite 是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是全世界使用最为广泛的数据库引擎。

    5 引用 • 7 回帖
  • 招聘

    哪里都缺人,哪里都不缺人。

    189 引用 • 1057 回帖
  • 电影

    这是一个不能说的秘密。

    122 引用 • 608 回帖
  • SpaceVim

    SpaceVim 是一个社区驱动的模块化 vim/neovim 配置集合,以模块的方式组织管理插件以
    及相关配置,为不同的语言开发量身定制了相关的开发模块,该模块提供代码自动补全,
    语法检查、格式化、调试、REPL 等特性。用户仅需载入相关语言的模块即可得到一个开箱
    即用的 Vim-IDE。

    3 引用 • 31 回帖 • 118 关注