Java创建对称密钥的步骤

2023-10-29

实例说明

本实例给出Java中创建对称密钥的步骤,并通过对象序列化方式保存在文件中。

编程思路:

(1)       获取密钥生成器

KeyGenerator kg=KeyGenerator.getInstance("DESede");

分析:JavaKeyGenerator类中提供了创建对称密钥的方法。Java中的类一般使用new操作符通过构造器创建对象,但KeyGenerator类不是这样,它预定义了一个静态方法getInstance(),通过它获得KeyGenerator类型的对象。这种类成为工厂类或工厂。

方法getInstance( )的参数为字符串类型,指定加密算法的名称。可以是 “Blowfish、“DES”、“DESede”、“HmacMD5”或“HmacSHA1”等。这些算法都可以实现加密,这里我们不关心这些算法的细节,只要知道其使用上的特点即可。其中“DES”是目前最常用的对称加密算法,但安全性较差。针对DES安全性的改进产生了能满足当前安全需要的TripleDES算法,即“DESede”。“Blowfish”的密钥长度可达448位,安全性很好。“AES”是一种替代DES算法的新算法,可提供很好的安全性。

(2)       初始化密钥生成器

kg.init(168);

分析:该步骤一般指定密钥的长度。如果该步骤省略的话,会根据算法自动使用默认的密钥长度。指定长度时,若第一步密钥生成器使用的是“DES”算法,则密钥长度必须是56位;若是“DESede”,则可以是112168位,其中112位有效;若是“AES”,可以是128, 192256位;若是“Blowfish”,则可以是32448之间可以被8整除的数;“HmacMD5”和“HmacSHA1”默认的密钥长度都是64个字节。

(3)       生成密钥

         SecretKey k=kg.generateKey( );

分析:使用第一步获得的KeyGenerator类型的对象中generateKey( )方法可以获得密钥。其类型为SecretKey类型,可用于以后的加密和解密。

(4)       通过对象序列化方式将密钥保存在文件中

            FileOutputStream  f=new FileOutputStream("key1.dat");

               ObjectOutputStream b=new  ObjectOutputStream(f);

               b.writeObject(k);

分析:ObjectOutputStream类中提供的writeObject方法可以将对象序列化,以流的方式进行处理。这里将文件输出流作为参数传递给ObjectOutputStream类的构造器,这样创建好的密钥将保存在文件key1.data中。

代码与分析

import java.io.*;

import javax.crypto.*;

public class Skey_DES{

 public static void main(String args[])

 throws Exception{

KeyGenerator kg=KeyGenerator.getInstance("DESede");

            kg.init(168);

            SecretKey k=kg.generateKey( );

            FileOutputStream  f=new FileOutputStream("key1.dat");

            ObjectOutputStream b=new  ObjectOutputStream(f);

            b.writeObject(k);

         }

}

运行java  Skey_DES,在当前目录下将生成文件key1.dat,其中包含的密钥可以用于使用Triple DES算法的加密和解密。

 

 

以字节保存对称密钥

实例说明

2.2.1小节的实例将密钥通过对象序列化方式保存在文件中,在文件中保存的是对象,本实例以另一种方式保存在文件中,即以字节保存在文件中。

编程思路:

Java中所有的密钥类都有一个getEncoded( )方法,通过它可以从密钥对象中获取主要编码格式,其返回值是字节数组。其主要步骤为:

(1)       获取密钥

FileInputStream f=new FileInputStream("key1.dat");

ObjectInputStream b=new ObjectInputStream(f);

Key k=(Key)b.readObject( );

 

分析:该步骤与2.2.1小节的第4步是相对应的,2.2.1小节的第4步将密钥对象以对象流的方式存入文件,而这一步则将文件中保存的对象读取出来以便使用。首先创建文件输入流,然后将其作为参数传递给对象输入流,最后执行对象输入流的readObject( )方法读取密钥对象。由于readObject( )返回的是Object类型,因此需要强制转换成Key类型。

这里使用的是已有的密钥,也可以不使用这里的三行代码,而使用2.1.1小节中的前三步的代码生成新的密钥再继续下面的步骤。

(2)       获取主要编码格式

byte[ ] kb=k.getEncoded( );

 

分析:执行SecretKey类型的对象kgetEncoded( )方法,返回的编码放在byte类型的数组中。

(3)       保存密钥编码格式

FileOutputStream  f2=new FileOutputStream("keykb1.dat");

    f2.write(kb);

分析:先创建文件输出流对象,在其参数中指定文件名,如keykb1.dat。然后执行文件输出流的write( )方法将第2步中得到的字节数组中的内容写入文件。

 

代码与分析

import java.io.*;

import java.security.*;

public class Skey_kb{

   public static void main(String args[]) throws Exception{

FileInputStream f=new FileInputStream("key1.dat");

ObjectInputStream b=new ObjectInputStream(f);

Key k=(Key)b.readObject( );

        byte[ ] kb=k.getEncoded( );

        FileOutputStream  f2=new FileOutputStream("keykb1.dat");

       f2.write(kb);

        // 打印密钥编码中的内容

        for(int i=0;i<kb.length;i++){

             System.out.print(kb[i]+",");

        }

   }

}

 

程序中在保存了密钥编码后,又使用循环语句将字节数组中的内容打印出来。这样可以较为直观地看到密钥编码的内容。

 

运行程序

输入java  Skey_kb 运行程序,在程序的当前目录中将产生文件名为keykb1.dat的文件,屏幕输出如下:

 

11,-105,-119,50,4,-105,16,38,-14,-111,21,-95,70,-15,76,-74,67,-88,59,-71,55,-125,104,42,

 

此即程序中创建的密钥的编码内容,如果用文本编辑器打开keykb1.dat,看到的不是上面的数字而是类似下面的字符:


2?&

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

Java创建对称密钥的步骤 的相关文章

随机推荐

  • Quick Search —— 快速匹配字符串

    注 正确性有待考察 因为没有题试试水 转载 https blog csdn net superhackerzhang article details 6432559 算法说明 令模式串为p p 0 p 1 p m 1 长度为m 文本串为T
  • ELK-日志服务【kafka-配置使用】

    kafka 01 10 0 0 21 kafka 02 10 0 0 22 kafka 03 10 0 0 23 1 安装zk集群 配置 root es 01 yum y install java maven root es 01 tar
  • Geoserver 重启后引起的事故

    1 geoserver作用来由 geoserver有两种 一种作为单独一个程序来运行 另一种使用geoserver war放到容器中启动使用 Geoserver是用来发布图层 其他的服务使用链接将图层与地图嵌套可以得到想要的数据的直观页面比
  • Android 混淆使用及其字典混淆(Proguard)

    1 使用背景 ProGuard能够通过压缩 优化 混淆 预检等操作 检测并删除未使用的类 字段 方法和属性 分析和优化字节码 使用简短无意义的名称来重命名类 字段和方法 从而使代码更小 更高效 更难进行逆向工程 Android代码混淆 又称
  • 5 款逆向工具,7 款代码分析工具,11 项优化建议

    本文作者 小木箱 原文发布于 小木箱成长营 小木箱成长营 包体积优化系列文章 包体积优化 实战论 怎么做包体积优化 做好能晋升吗 能涨多少钱 包体积优化 方法论 揭开包体积优化神秘面纱 1 引言 Hello 我是小木箱 欢迎来到小木箱成长营
  • Android Jetpack组件DataStore之Proto与Preferences存储详解与使用

    一 介绍 Jetpack DataStore 是一种数据存储解决方案 允许您使用协议缓冲区存储键值对或类型化对象 DataStore 使用 Kotlin 协程和 Flow 以异步 一致的事务方式存储数据 如果您当前在使用 SharedPre
  • CentOS下GitLab的安装部署

    转载来源 https mp weixin qq com s kUwZja0xK1IfqGU6R2f1EA 一 GitLab Server的搭建 参考 https about gitlab com install 1 准备工作 以centos
  • DRRN(Image Super-Resolution via Deep Recursive Residual Network)超分辨网络-详细分析

    Contents 1 Introduction References 1 Introduction 这篇文章可以在一定程度上看做是DRCN的改良版 保留了DRCN的全局跳层连接和循环块提升网络深度但限制参数量的思想 增加了ResNet的局部
  • WiFi的Channel是个啥玩意

    今天下载了一个监控周围WiFi状态的app WiFi Explorer 打开app首页 如下图 其中有一栏名为Channel 看了下自己所用WiFi的Channel为1 是里面数值最低的 这是不是就代表通道很少 所以很卡呢 查阅资料后发现这
  • Unity用相机实现的镜子效果

    首先登场 场景中的元素 mirror是镜子 挂着我们的脚本 Quad是一个面片 Camera是用来生成RenderTexture给面片的 里面的test1是我用来调试位置的球 镜子size是大小 x是 2 为了反转一下贴图 相机直接可以禁用
  • centos7桥接模式,ip突然消失,ping不通电脑

    方法一 百度了很多方法都不行 然后尝试将路由器重启 得以解决
  • Unity URP 渲染管线着色器编程 104 之 镜头光晕(lensflare)的实现

    在SRP管线中是不支持Unity原有的LensFlare配置的 也就是说如果在URP或者HDRP管线下要使用Lens Flare 需要自己实现改功能 本节介绍一个HDRP的官方DEMO工程 FontainebleauDemo 中使用到的Le
  • Vue使用ElementUI的el-dropdown点击事件问题

    Vue使用ElementUI的el dropdown点击事件问题 el dropdown介绍 问题重述 问题解决 后续 el dropdown介绍 el dropdown是ElementUI提供的响应式的实现下拉菜单的功能组件 详细用法可见
  • 【牛客·字节】ZJ2 编程题1 球队比赛是否能打平

    描述 有三只球队 每只球队编号分别为球队1 球队2 球队3 这三只球队一共需要进行 n 场比赛 现在已经踢完了k场比赛 每场比赛不能打平 踢赢一场比赛得一分 输了不得分不减分 已知球队1和球队2的比分相差d1分 球队2和球队3的比分相差d2
  • 探索高级UI、源码解析与性能优化,了解开源框架及Flutter,助力Java和Kotlin筑基,揭秘NDK的魅力!

    课程链接 链接 https pan baidu com s 13cR0Ip6lzgFoz0rcmgYGZA pwd y7hp 提取码 y7hp 复制这段内容后打开百度网盘手机App 操作更方便哦 来自百度网盘超级会员v4的分享 课程介绍 0
  • 如何将父盒子分成三份

    floor list image float left width 33 33 margin top 5px 第二句的意思就是将父盒子均分成三份 这里面不能用flex 因为那样是将子元素全部变为一排 其样式会发生改变
  • 通过HttpUrlConnect调用Https asmx soap接口(绕过证书)

    import org springframework http HttpStatus import javax net ssl import java io IOException import java io InputStream im
  • 大写字母转小写字母

    输入一个大写英文字母 输出相应的小写字母 例 输入 G 输出 g int main char g scanf c g if g gt A g lt Z g g 32 printf c g else if g gt a g lt z g g
  • Java基础知识点梳理

    Java基础知识点梳理 摘要 虽然已经在实际工作中经常与java打交道 但是一直没系统地对java这门语言进行梳理和总结 掌握的知识也比较零散 恰好利用这段时间重新认识下java 并对一些常见的语法和知识点做个总结与回顾 一方面为了加深印象
  • Java创建对称密钥的步骤

    实例说明 本实例给出Java中创建对称密钥的步骤 并通过对象序列化方式保存在文件中 编程思路 1 获取密钥生成器 KeyGenerator kg KeyGenerator getInstance DESede 分析 Java中KeyGene