整理之前笔记1:使用对称密钥进行加密和解密,记录与2016.9

★ 编程思路:

首先要从文件中获取已经生成的密钥,然后考虑如何使用密钥进行加密。这涉及到各 种算法。Java 中已经提供了常用的加密算法,我们执行 Java 中 Cipher 类的各个方法就可以 完成加密过程

主要步骤:

(1) 从文件中获取密钥

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

ObjectInputStream b=new ObjectInputStream(f);

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

(2) 创建密码器(Cipher 对象)

Cipher cp=Cipher.getInstance("DESede");

分析:Cipher 类是一个工 厂类,它不是通过new方法创建对象,而是通过其中预定义的一个静态方法getInstance ( )获取 Cipher 对象。

getInstance( )方法的参数是一个字符串,该字符串给出 Cipher 对象应该执行 哪些操作,因此把传入的字符串称为转换(transformation)。通常通过它指定加密算 法或解密所用的算法的名字,如本例的"DESede"。此外还可以同时指定反馈模式及填充 方案等,如"DESede/ECB/PKCS5Padding"。

(3) 初始化密码器

cp.init(Cipher.ENCRYPT_MODE, k);

分析:该步骤执行 Cipher 对象的 init()方法对 Cipher 对象进行初始化。

该方 法包括两个参数,

第一个参数指定密码器准备进行加密还是解密,若传入 Cipher.ENCRYPT_MODE 则进入加密模式。

第二个参数则传入加密或解密所使用的密钥, 即第 1 步从文件中读取的密钥对象 k。

(4) 获取等待加密的明文

String s="Hello World!";

byte ptext[]=s.getBytes("UTF8");

分析:Cipher 对象所作的操作是针对字节数组的,因此需要将要加密的内容转换 成字节数组。本例中要加密的是一个字符串 s,可以使用字符串的 getBytes( )方法获 得对应的字节数组。getBytes( )方法中必须使用参数"UTF8"指定…,否则…

(5) 执行加密

byte ctext[]=cp.doFinal(ptext);

分析:执行 Cipher 对象的 doFinal( )方法,该方法的参数中传入待加密的明文, 从而按照前面几步设置的算法及各种模式对所传入的明文进行加密操作,该方法返回加 密的结果。

(6) 处理加密结果

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

f2.write(ctext);

分析:第 5 步得到的加密结果是字节数组,对其可作各种处理,如在网上传递、保 存在文件中等。这里将其保存在文件 Senc.dat 中。

★代码与分析:

import java.io.*;

import java.security.*;

import javax.crypto.*;

public class SEnc{

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

String s="Hello World!";

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

ObjectInputStream b=new ObjectInputStream(f);

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

Cipher cp=Cipher.getInstance("DESede");

cp.init(Cipher.ENCRYPT_MODE, k);

byte ptext[]=s.getBytes("UTF8");

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

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

}

System.out.println("");

byte ctext[]=cp.doFinal(ptext);

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

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

}

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

f2.write(ctext);

}

}

程序中使用两个循环语句将字节数组加密前后加密后的内容打印出来,可作为对比。

★运行程序

当前目录下必须有 2.2.1 小节中生成的密钥文件 key1.dat,输入 java SEnc 运行程序,

在程序的当前目录中将产生文件名为 SEnc.dat 的文件,屏幕输出如下:

72,101,108,108,111,32,87,111,114,108,100,33,

-57,119,0,-45,-9,23,37,-56,-60,-34,-99,105,99,113,-17,76,

其中第一行为字符串"Hello World!"的字节数组编码方式,第二行为加密后的内容,第

二行的内容会随着密钥的不同而不同。

第一行的内容没有加过密,任何人若得到第一行数据,只要将其用二进制方式写入文本

文件,用文本编辑器打开文件就可以看到对应的字符串“ Hello World!”。而第二行的内容由

于是加密过的,没有密钥的人即使得到第二行的内容也无法知道其内容。

密文同时保存在 SEnc.dat 文件中,将其提供给需要的人时,需要同时提供加密时使用

的密钥( key1.dat,或 keykb1.dat),这样收到 SEnc.dat 中密文的人才能够解密文件中的内容。

发布了19 篇原创文章 · 获赞 11 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/sweet__queen/article/details/105605171