信息安全实验2分组密码加密
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
分组密码加密
一、实习目的
1.理解对称加密算法的原理,熟悉常用的对称加密算法:DES、TripleDES、Blowfish;
2.以DES加密算法为例,掌握分组加密算法加、解密过程的实现。
二、实习内容
1.[基本要求]
以DES/DESede为例,利用java中的相关类实现对指定字符串的加、解密。
2.[实现提示]
(1) 可以利用java中的KeyGenerator类创建对称秘钥,利用工厂类KeyGenerator的静态方法getInstance()获得KeyGenerator()类对象;
(2) 方法getInstance()的参数为字符串类型,指定加密算法的名称如:Blowfish、DES、DESede、HmacMD5或HmacSHA1等;
(3) 利用工厂类Cipher的对象可以创建密码器。同样的,getInstance()的参数为字符串类型,指定加密算法的名称。
三、算法分析和流程图
DES算法为密码体制中的对称密码体制,又被成为美国数据加密标准,是1972年美国IBM公司研制的对称密码体制加密算法。其密钥长度为56位,明文按64位进行分组,将分组后的明文组和56位的密钥按位替代或交换的方法形成密文组的加密方法。DES加密算法特点:分组比较短、密钥太短、密码生命周期短、运算速度较慢。DES工作的基本原理是,其入口参数有三个:key、data、mode。 key为加密解密使用的密钥,data为加密解密的数据,mode为其工作模式。当模式为加密模式时,明文按照64位进行分组,形成明文组,key用于对数据加密,当模式为解密模式时,key用于对数据解密。
四、测试数据和预期结果
1按照规定,密钥输入移位的数字,明文输入字母,如下图所示,加密成功2加密yanglingmalasong+123
3测试*能否加密
加密
4 测试汉字能否加密
五、源程序
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
public class Skey_DES {
/**
* @param args
*/
public static void main(String args[])throws Exception { // TODO Auto-generated method stub
KeyGenerator kg=KeyGenerator.getInstance("DESede");
kg.init(168);
SecretKey k=kg.generateKey();
FileOutputStream f=new FileOutputStream("H:\\key1.dat");
ObjectOutputStream b=new ObjectOutputStream(f);
b.writeObject(k);
}
}
import java.io.*;
import java.security.*;
import javax.crypto.*;
public class SEnc {
/**
* @param args
*/
public static void main(String args[])throws Exception { // TODO Auto-generated method stub
String s="Hello123Hello123Hello123Hello123";
FileInputStream f=new FileInputStream("H:\\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 { System.out.print(ptext[i]+","); } System.out.println(""); byte ctext[]=cp.doFinal(ptext); for(int i=0;i { System.out.print(ctext[i]+","); } FileOutputStream f2=new FileOutputStream("H:\\SEnc.dat"); f2.write(ctext); } } import java.io.FileInputStream; import java.io.ObjectInputStream; import java.security.Key; import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; public class SDec { /** * @param args */ public static void main(String args[])throws Exception { // TODO Auto-generated method stub FileInputStream f=new FileInputStream("H:\\SEnc.dat"); int num=f.available(); byte[]ctext=new byte[num]; f.read(ctext); FileInputStream f2=new FileInputStream("H:\\key1.dat"); ObjectInputStream b=new ObjectInputStream(f2); Key k=(Key)b.readObject(); Cipher cp=Cipher.getInstance("DESede"); cp.init(Cipher.DECRYPT_MODE,k); byte []ptext=cp.doFinal(ctext); String p=new String(ptext,"UTF8"); System.out.println(p); }