Java加密技术(三)——PBE算法

2023-11-13

 除了DES,我们还知道有DESede(TripleDES,就是3DES)、AES、Blowfish、RC2、RC4(ARCFOUR)等多种对称加密方式,其实现方式大同小异,这里介绍对称加密的另一个算法——PBE 

PBE  
    PBE——Password-based encryption(基于密码加密)。其特点在于口令由用户自己掌管,不借助任何物理媒体;采用随机数(这里我们叫做盐)杂凑多重加密等方法保证数据的安全性。是一种简便的加密方式。 

通过java代码实现如下: Coder类见 Java加密技术(一)  
Java代码   收藏代码
  1. import java.security.Key;  
  2. import java.util.Random;  
  3.   
  4. import javax.crypto.Cipher;  
  5. import javax.crypto.SecretKey;  
  6. import javax.crypto.SecretKeyFactory;  
  7. import javax.crypto.spec.PBEKeySpec;  
  8. import javax.crypto.spec.PBEParameterSpec;  
  9.   
  10. /** 
  11.  * PBE安全编码组件 
  12.  *  
  13.  * @author 梁栋 
  14.  * @version 1.0 
  15.  * @since 1.0 
  16.  */  
  17. public abstract class PBECoder extends Coder {  
  18.     /** 
  19.      * 支持以下任意一种算法 
  20.      *  
  21.      * <pre> 
  22.      * PBEWithMD5AndDES  
  23.      * PBEWithMD5AndTripleDES  
  24.      * PBEWithSHA1AndDESede 
  25.      * PBEWithSHA1AndRC2_40 
  26.      * </pre> 
  27.      */  
  28.     public static final String ALGORITHM = "PBEWITHMD5andDES";  
  29.   
  30.     /** 
  31.      * 盐初始化 
  32.      *  
  33.      * @return 
  34.      * @throws Exception 
  35.      */  
  36.     public static byte[] initSalt() throws Exception {  
  37.         byte[] salt = new byte[8];  
  38.         Random random = new Random();  
  39.         random.nextBytes(salt);  
  40.         return salt;  
  41.     }  
  42.   
  43.     /** 
  44.      * 转换密钥<br> 
  45.      *  
  46.      * @param password 
  47.      * @return 
  48.      * @throws Exception 
  49.      */  
  50.     private static Key toKey(String password) throws Exception {  
  51.         PBEKeySpec keySpec = new PBEKeySpec(password.toCharArray());  
  52.         SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM);  
  53.         SecretKey secretKey = keyFactory.generateSecret(keySpec);  
  54.   
  55.         return secretKey;  
  56.     }  
  57.   
  58.     /** 
  59.      * 加密 
  60.      *  
  61.      * @param data 
  62.      *            数据 
  63.      * @param password 
  64.      *            密码 
  65.      * @param salt 
  66.      *            盐 
  67.      * @return 
  68.      * @throws Exception 
  69.      */  
  70.     public static byte[] encrypt(byte[] data, String password, byte[] salt)  
  71.             throws Exception {  
  72.   
  73.         Key key = toKey(password);  
  74.   
  75.         PBEParameterSpec paramSpec = new PBEParameterSpec(salt, 100);  
  76.         Cipher cipher = Cipher.getInstance(ALGORITHM);  
  77.         cipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);  
  78.   
  79.         return cipher.doFinal(data);  
  80.   
  81.     }  
  82.   
  83.     /** 
  84.      * 解密 
  85.      *  
  86.      * @param data 
  87.      *            数据 
  88.      * @param password 
  89.      *            密码 
  90.      * @param salt 
  91.      *            盐 
  92.      * @return 
  93.      * @throws Exception 
  94.      */  
  95.     public static byte[] decrypt(byte[] data, String password, byte[] salt)  
  96.             throws Exception {  
  97.   
  98.         Key key = toKey(password);  
  99.   
  100.         PBEParameterSpec paramSpec = new PBEParameterSpec(salt, 100);  
  101.         Cipher cipher = Cipher.getInstance(ALGORITHM);  
  102.         cipher.init(Cipher.DECRYPT_MODE, key, paramSpec);  
  103.   
  104.         return cipher.doFinal(data);  
  105.   
  106.     }  
  107. }  


再给出一个测试类: 
Java代码   收藏代码
  1. import static org.junit.Assert.*;  
  2.   
  3. import org.junit.Test;  
  4.   
  5. /** 
  6.  *  
  7.  * @author 梁栋 
  8.  * @version 1.0 
  9.  * @since 1.0 
  10.  */  
  11. public class PBECoderTest {  
  12.   
  13.     @Test  
  14.     public void test() throws Exception {  
  15.         String inputStr = "abc";  
  16.         System.err.println("原文: " + inputStr);  
  17.         byte[] input = inputStr.getBytes();  
  18.   
  19.         String pwd = "efg";  
  20.         System.err.println("密码: " + pwd);  
  21.   
  22.         byte[] salt = PBECoder.initSalt();  
  23.   
  24.         byte[] data = PBECoder.encrypt(input, pwd, salt);  
  25.   
  26.         System.err.println("加密后: " + PBECoder.encryptBASE64(data));  
  27.   
  28.         byte[] output = PBECoder.decrypt(data, pwd, salt);  
  29.         String outputStr = new String(output);  
  30.   
  31.         System.err.println("解密后: " + outputStr);  
  32.         assertEquals(inputStr, outputStr);  
  33.     }  
  34.   
  35. }  


控制台输出: 
Console代码   收藏代码
  1. 原文: abc  
  2. 密码: efg  
  3. 加密后: iCZ0uRtaAhE=  
  4.   
  5. 解密后: abc  

    后续我们会介绍非对称加密算法,如RSA、DSA、DH、ECC等。 

转载自:http://snowolf.iteye.com/blog/380761

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java加密技术(三)——PBE算法 的相关文章

随机推荐

  • STM32 C++编程系列一:STM32 C++编程介绍

    一 STM32及其他单片机开发现状 在目前绝大部分的单片机开发当中 C语言占据着主流的地位 但由于C语言本身是一种面向过程的语言 因此在当前利用面向对象思想构建可复用代码为主流的今天显得比较麻烦 很多人写单片机程序时都会遇到一个问题 明明写
  • 大数据采集概述

    文章目录 大数据采集概述 1 互联网大数据与采集 1 1互联网大数据来源 1 社交媒体 2 社交网络 3 百科知识库 4 新闻网站 5 评论信息 6 位置型信息 1 2 互联网大数据的特征 1 大数据类型和语义更加丰富 2 数据的规范化程度
  • 内存溢出问题解决思路

    内存溢出问题解决 一 常规解决思路 首先 在JVM参数配置时需要配置内存溢出后dump出内存的快照来 配置如下 XX HeapDumpOnOutOfMemoryError XX HeapDumpPath 内存快照 hprof输出路径 然后
  • 理解Java类加载的步骤

    前言 与在编译时需要进行 连接 工作的语言不同 在Java语言里 类的加载 连接 初始化过程都是在程序运行期间完成的 这种策略虽然牺牲了一小部分性能 但是大大增加了Java的灵活性 Java里天生可以动态拓展的语言特性就是依赖运行期动态加载
  • Linux线程同步(二)---互斥锁实现线程同步

    一 why 先给自己打个广告 本人的微信公众号 嵌入式Linux江湖 主要关注嵌入式软件开发 股票基金定投 足球等等 希望大家多多关注 有问题可以直接留言给我 一定尽心尽力回答大家的问题 在博客 Linux线程同步 一 初识篇 中 介绍了为
  • 基于STM32F407的人脸追踪

    整体概述 本项目采用两个舵机构成的二自由度的电动云台作为执行机构 控制摄像头在水平和垂直方向的运动 舵机带动摄像头进行二维平面的运动的同时 摄像头进行实时人脸检测 一旦检测到人脸 则进行人脸跟踪 摄像头采用星瞳openMV H7 主控采用的
  • (C语言)打印菱形图案 (15分)

    本题要求编写程序 打印一个高度为n的 由 组成的正菱形图案 输入格式 输入在一行中给出一个正的奇数n 输出格式 输出由n行星号 组成的菱形 如样例所示 每个星号后跟一个空格 输入样例 7 输出样例 通过点 模拟 include
  • EM算法估计beta混合模型参数

    1 用 network memerisation 造成的 clean noisy 数据 loss 差异来区分 clean noisy data 当得到一批数据的 normalised loss l i 0
  • android 填充,Android Drawable部分填充

    是的 如果您使用Layer List并定义重叠的项目 则是可能的 这是一个例子 android height 30dp gt android height 30dp gt 您可能需要尝试这些值 并根据需要进行调整 编辑 我认为您无法指定相对
  • MATLAB 添加自有的工具包

    我们经常会用到一些专业的MATLAB工具包 这些工具包下载好后应该如何添加呢 下面简单介绍 1 在命令行中敲入 pathtool 启动 设置路径 窗口 如下图所示 2 根据自己的需求 选择 添加文件夹 或者 添加并包含子文件夹 然后选择自己
  • linux 串口调试助手,COMTool: Cross platform Serial Assistant ( 跨平台 串口 调试 助手 串口助手 串口调试助手 linux windows mac R...

    COMTool A cross platform serial debug tools written by python Windows Linux Elementry OS Raspberry Pi3 screenshot shows
  • Mediapipe+OpenCV图像识别技术与Unity引擎的结合-Part2

    前言 之前写了一篇文章 Mediapipe OpenCV图像识别技术与Unity引擎的结合 其中的技术是Python利用OpenCV图像捕捉 配合强大的Mediapipe库来实现人体动作检测与识别 将识别结果实时同步至Unity中 实现人物
  • 开机出现文件windows root\system32\ntoskrnl.exe的另类解决办法

    一般的复制文件方法就不说了 我的这个是因为拷贝ntoskrnl exe还提示错误的解决办法 发生这种问 题主要可能有以下原因 Boot ini 文件的 Boot Loader 部分中的 Default 值丢失或无效 Ntoskrnl exe
  • JavaScript之变量和类型

    变量和类型 用处 1 让代码可以重复使用 重用性 2 修改代码方便 灵活 灵活性 1 上面 i love you 要写4次 2 把 love 改成 hate 要写4次 改成使用变量
  • 解决Windows因D3DCompiler_47.dll文件找不到等问题

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或者损坏了 这时你只需下载这个D3DCompiler 47 dll文件进行安装
  • 基于RBAC模型的权限设计思路

    一 RBAC模型 进行设计前 最好能够理解技术模型 在业界接受度较高的功能权限模型是RBAC Role Based Access Control 模型 其基本理念是将 角色 这个概念赋予用户 在系统中用户与权限之间通过角色进行关联 以这样的
  • 解决: 0x803f7001 在运行Microsoft Windows 非核心版本的计算机上,运行“ slui.exe 0x2a 0x803f7001 “以显示错误文本,激活win10步骤流程。

    一 解决 0x803F7001在运行Microsoft Windows非核心版本的计算机错误 首先 按下win R打开 运行 输入 regedit 后回车 打开注册表 然后再注册表下输入地址HKEY LOCAL MACHINE SOFTWA
  • 有计算机考试励志的文案,抖音冲刺高考励志文案

    不知不觉就是2021年的高考了 其实高考也没有什么可怕的 保证心态好 就可能考出比平时更好的成绩 冲刺高考励志句子怎么写有哪些你知道吗 今天小编在这给大家整理了一些关于冲刺高考励志句子 我们一起来看看吧 冲刺高考励志句子 1 再苦再难 也要
  • js 中map()方法和reduce()方法

    js中的map是映射的意思 即原数组被映射成新的数组 而这个数组是由原数组中的每个元素调用一个特定的方法返回值组成的新数组 比如 首先定义一个方法F 然后map F 那么执行结果就是所有输入的值执行完F这个方法后产生的新数组 注意 map
  • Java加密技术(三)——PBE算法

    除了DES 我们还知道有DESede TripleDES 就是3DES AES Blowfish RC2 RC4 ARCFOUR 等多种对称加密方式 其实现方式大同小异 这里介绍对称加密的另一个算法 PBE PBE PBE Password