Java中创建对称密钥的步骤
来源:互联网 发布:淘宝上买小口栓输什么 编辑:程序博客网 时间:2024/05/19 03:24
★ 实例说明
本实例给出Java中创建对称密钥的步骤,并通过对象序列化方式保存在文件中。
★ 编程思路:
(1) 获取密钥生成器
KeyGenerator kg=KeyGenerator.getInstance("DESede");
分析:Java中KeyGenerator类中提供了创建对称密钥的方法。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”,则可以是112或168位,其中112位有效;若是“AES”,可以是128, 192或256位;若是“Blowfish”,则可以是32至448之间可以被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类型的对象k的getEncoded( )方法,返回的编码放在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,看到的不是上面的数字而是类似下面的字符: 这是因为keykb1.dat是一个二进制文件,存放的是任意二进制数。 读者运行时肯定结果和上面会有所不同,实际上2.2.1小节的程序每次运行时生成的密钥都不会相同,这就保证了密钥的唯一性。作为对称密钥,只要保证若加密某段文字用的是某个密钥,则解密这段密文时用同样的密钥即可。 以字节保存对称密钥
棄2 ?&驊馤禖??僪*
- Java中创建对称密钥的步骤
- Java中创建对称密钥的步骤
- Java中创建对称密钥的代码
- Java中对称密钥、非对称密钥和数字签名的用法
- Java安全笔记(二)-创建对称密钥
- Java中创建口令密钥的代码
- JAVA实现DES对称密钥的方法
- Java安全学习笔记(二)--创建对称密钥
- Java中RSA非对称密钥加解密使用示例
- Java中RSA非对称密钥加解密使用
- Java中RSA非对称密钥加解密使用示例
- Java中RSA非对称密钥加解密使用示例
- Java中RSA非对称密钥加解密使用示例
- Java中RSA非对称密钥加解密使用示例
- Java中RSA非对称密钥加解密使用示例
- ocx中对称密钥加密解密的简单实例
- 对称加密的对称密钥分发
- 对称密码学的密钥交换
- Oracle数据库定期自动备份
- 渗透IT基础架构 虚拟化应用的7大趋势
- 利用反射来做算、逻运算
- Java异常摘要
- Symbian 文件扫描和查找文件
- Java中创建对称密钥的步骤
- 贺新郎 (老大那堪说)
- 钱!钱!钱!
- 巨磁阻效应
- DataViewRow
- 分享我的一些SEO经验
- Windows 7播放各大视频网站Flash视频没有声音
- log4net1.2.10 在asp.net 2.0当中的使用
- JAVA中的8中基本数据类型