java 安全包_信息加密系统设计(依托Java平台安全包)
这是加密系统设计的一个示例
一、目的与要求
(一)目的
通过实践,了解运用相应密码算法,设计并实现一个加密系统的全过程,掌握设计和实现信息安全系统的基本手段和常用方法,提高学生的动手能力和分析、解决问题的能力。
(二)要求
选择具有代表性的密码算法,要求使用DES、3DES或AES作为对称密码算法,实现文件加密解密功能。密钥可以随机或人为生成,密钥的分配可以考虑使用公钥密码体制。使用散列函数确保文件的完整性。
二、实验内容:
使用Java平台所带的安全包,设计并实现一个加密系统,使之能够产生并管理密钥、加密文件、解密文件。
一、消息摘要方法设计
完整源代码:
/*
* @author W-nut
* FileInfo:验证数据完整性的方法一:消息摘要法
*/
package appFunction;
import java.security.MessageDigest;
public class CreateMessageDigest
{
//方法描述:将可变长度的消息映射为固定长度的Hash值或消息摘要
//方法参数:s_algorithm:映射时使用的安全哈希算法(SHA),可任意选择测试;s_message:待发送的信息
//方法返回:生成的消息摘要
public byte[] createMyMessageDigest(String s_algorithm,String s_message)
{
try
{
//生成一个MessageDigest类,确定计算方法
MessageDigest mda = MessageDigest.getInstance(s_algorithm);
//添加要进行计算摘要A的信息
mda.update(s_message.getBytes());
//保存摘要到字节数组中
byte[] digestA=mda.digest();
System.out.println("本信息摘要是:" Conversion.byteArrayToHexString(digestA));
//return Conversion.byteArrayToHexString(digestA);
return digestA;
}
catch (java.security.NoSuchAlgorithmException e)
{
System.out.println("非法摘要算法!");
}
return null;
}
//方法描述:验证消息摘要
//方法参数:s_algorithm:映射时使用的安全哈希算法(SHA);s_message:待发送的信息;s_digestA:别人生成的消息摘要
public void checkMessageDigest(String s_algorithm,String s_message,byte[] s_digestA)
{
try
{
//其他人通过相同方法计算出消息摘要,与原消息摘要比对,判断数据是否完整
MessageDigest mdb = MessageDigest.getInstance(s_algorithm);
//添加要进行计算摘要B的信息
mdb.update(s_message.getBytes());
byte[] digestB=mdb.digest();
//比较字节数组内容是否相等
if (MessageDigest.isEqual(s_digestA,digestB))
System.out.println("信息检查正常!\n");
else
System.out.println("摘要不相同!\n");
}
catch(java.security.NoSuchAlgorithmException e)
{
System.out.println("非法摘要算法!");
}
}
}
以上为交互接口,可以写一点代码测试一下:
/*
* @author W-nut
*/
package appEntrance;
import appFunction.*;
public class ProgramEntrance
{
public static void main(String[] args)
{
String algorithm_MessageDigest="SHA-1";//安全哈希算法
String message="info";//待验证的信息
byte []messageDigest;//生成的消息摘要数组
CreateMessageDigest messageAbstract=new CreateMessageDigest();
//生成自己的消息摘要
messageDigest= messageAbstract.createMyMessageDigest(algorithm_MessageDigest,message);
//消息发送给别人,别人验证消息是否完整
messageAbstract.checkMessageDigest(algorithm_MessageDigest,message,messageDigest);
}
}
运行结果:
二、数字签名方法设计
完整源代码:
/*
* @author W-nut
* FileInfo:验证数据完整性方法二:数字签名法
*/
package appFunction;
import java.security.*;
public class CreateDSA
{
//测试一下下
public void testKeyPair(String s_info,String s_algorithm)
{
KeyPair keyPair=generateKeyPair(s_algorithm);
byte [] signature=performSigning(s_info,s_algorithm,keyPair);
performVerification(s_info,s_algorithm,signature,keyPair.getPublic());
}
//方法说明:生成保存用户特定算法的密钥对生成器
//方法参数:algorithm:特定算法
//方法返回:生成的密钥对
private static KeyPair generateKeyPair(String algorithm)
{
try
{
//保存生成一个密钥对生成器KeyPairGenerator实例
KeyPairGenerator kg = KeyPairGenerator.getInstance(algorithm);
System.out.println("正在生成密钥对......");
kg.initialize(512);//初始化确定密钥大小的密钥对生成器
return kg.genKeyPair();//每次调用此方法都将生成新的密钥对
}
catch(Exception e)
{
System.exit(0);
}
return null;
}
//方法说明:用私钥和加密信息生成签名数组
//方法参数:info:加密信息,algorithm:生成密钥对使用的加密算法,keyPair:用户的密钥对
//方法返回:由私钥和信息组成的签名数组
private static byte[] performSigning(String info,String algorithm,KeyPair keyPair)
{
try
{
//生成密钥公钥publicKey和私钥privateKey
PrivateKey privateKey = keyPair.getPrivate();
PublicKey publicKey = keyPair.getPublic();
//用私人密钥(privateKey)对所确认的信息(info)进行数字签名产生一个签名数组
Signature sign = Signature.getInstance(algorithm);//特定算法签名
sign.initSign(privateKey); //用该用户的私钥初始一个Signature对象
sign.update(info.getBytes()); //用该用户的加密信息更新一个Signature对象
System.out.println("正在生成签名......");
byte[] b = sign.sign(); //生成签名数组
System.out.println("\nMessage: " info);
System.out.println("Private key:\n"
Conversion.byteArrayToBase64String(privateKey.getEncoded()));
System.out.println("Public key:\n"
Conversion.byteArrayToBase64String(publicKey.getEncoded()));
System.out.println("Signature:\n"
Conversion.byteArrayToBase64String(b));
return b;
}
catch(Exception e)
{
System.exit(0);
}
return null;
}
//方法说明:用公钥和加密信息验证签名数组
//方法参数:info:加密信息 ,algorithm:生成密钥对的特定算法,signature[]:该用户的签名数组,publicKey:该用户的公钥
private static void performVerification(String info, String algorithm,byte[] signature, PublicKey publicKey)
{
try
{
Signature sign = Signature.getInstance(algorithm);
System.out.println("\n正在验证签名......");
sign.initVerify(publicKey);//使用该用户的公钥初始化一个Signature对象
sign.update(info.getBytes());//使用该用户的加密信息更新一个Signature对象
if(sign.verify(signature))
System.out.println("Signature verified!");
else
System.out.println("Signature NOT verified!");
}
catch(Exception e)
{
System.exit(0);
}
}
}
测试一下下:
/*
* @author W-nut
*/
package appEntrance;
import appFunction.*;
public class ProgramEntrance
{
public static void main(String[] args)
{
String message="info";//待验证的信息
String algorithm_KeyPair="DSA";
//生成数字签名并验证
CreateDSA createDSA=new CreateDSA();
createDSA.testKeyPair(message,algorithm_KeyPair);
}
}
运行结果:
三、DES加密
献上小弟的源代码:
/*
* @author W-nut
*FileInfo:DES算法加密
*/
package appFunction;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import java.nio.charset.StandardCharsets;
import java.security.Key;
public class EncryptDES
{
public static void main(String[] args)
{
testEncryptDES("这真的是明文!");
}
public static void testEncryptDES(String s_plainText)
{
try
{
byte[] plainText =s_plainText.getBytes();
//获取DES密钥并保存
System.out.println("\n开始生成DES密钥!");
KeyGenerator keyGen = KeyGenerator.getInstance("DES");
keyGen.init(56);
Key key = keyGen.generateKey();
System.out.println("DES密钥生成结束!");
//获取DES密文实例并打印provider
Cipher cipher = Cipher.getInstance("DES");
System.out.println("\n" cipher.getProvider().getInfo());
//用DES密钥加密明文plainText,生成密文cipherText
System.out.println("\n加密开始\n");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] cipherText = cipher.doFinal(plainText);
System.out.println("加密结束: ");
System.out.println(new String(cipherText, StandardCharsets.UTF_8));
//用DES密钥解密密文
System.out.println("\n解密开始\n");
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] newPlainText = cipher.doFinal(cipherText);
System.out.println("解密结束: ");
System.out.println(new String(newPlainText, StandardCharsets.UTF_8));
}
catch(Exception e)
{
System.exit(0);
}
}
}
运行结果:
四、Diffie-Hellman密钥交换协议
/*
* @author W-nut
*/
package appFunction;
import javax.crypto.KeyAgreement;
import javax.crypto.SecretKey;
import javax.crypto.interfaces.DHPrivateKey;
import javax.crypto.interfaces.DHPublicKey;
import javax.crypto.spec.DHParameterSpec;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
public class KeyChange
{
public static void main(String[] args)
{
try
{
// Generate key pair for 1
System.out.println("1 is generating a key pair");
KeyPairGenerator kpg1 = KeyPairGenerator.getInstance("DH");
kpg1.initialize(512);
KeyPair kp1 = kpg1.generateKeyPair();
// Create a KeyAgreement object using the private key
System.out.println("1 is creating a key agreement object");
KeyAgreement ka1 = KeyAgreement.getInstance("DH");
DHPrivateKey privateKey1 = (DHPrivateKey) kp1.getPrivate();
DHPublicKey publicKey1 = (DHPublicKey) kp1.getPublic();
ka1.init(privateKey1);
System.out.println("1 is using " publicKey1.getY() " for its public key");
// Generate key pair for 2
System.out.println("2 is generating a key pair");
DHParameterSpec dhParamSpec = publicKey1.getParams();
KeyPairGenerator kpg2 = KeyPairGenerator.getInstance("DH");
kpg2.initialize(dhParamSpec);
KeyPair kp2 = kpg2.generateKeyPair();
// Create a KeyAgreement object using the private key
System.out.println("2 is creating a key agreement object");
KeyAgreement ka2 = KeyAgreement.getInstance("DH");
DHPrivateKey privateKey2 = (DHPrivateKey) kp2.getPrivate();
DHPublicKey publicKey2 = (DHPublicKey) kp2.getPublic();
ka2.init(privateKey2);
System.out.println("2 is using " publicKey2.getY() " for its public key");
// Use the KeyAgreement object of 1 to generate its shared key
ka1.doPhase(publicKey2,true);
SecretKey sharedKey1 = ka1.generateSecret("DES");
System.out.println("1 is using "
Conversion.byteArrayToHexString(sharedKey1.getEncoded()) " as its DES session key");
// Use the KeyAgreement object of 2 to generate its shared key
ka2.doPhase(publicKey1,true);
SecretKey sharedKey2 = ka2.generateSecret("DES");
System.out.println("2 is using "
Conversion.byteArrayToHexString(sharedKey2.getEncoded()) " as its DES session key");
}
catch(Exception e)
{
System.out.println("出错啦!!!");
}
}
}
这里小弟就不运行啦!
部分文件用到的Conversion类型转换类:
/*
* @author W-nut
*FileInfo:类型转换
*/
package appFunction;
import java.util.Base64;
public class Conversion
{
//方法说明:字节数组转换成字符串
public static String byteArrayToHexString(byte [] digestA)
{
StringBuilder sb =new StringBuilder();
for (byte value : digestA)
{
int temp = value & 0xFF;
sb.append(Integer.toHexString(temp));
}
return sb.toString();
}
//方法说明:base64编码转换成字符串
public static String byteArrayToBase64String(byte [] keyInfo)
{
return Base64.getEncoder().encodeToString(keyInfo);
}
}
mua~
来源:https://www.icode9.com/content-1-763701.html
java 安全包_信息加密系统设计(依托Java平台安全包)相关推荐
- 我的世界java版怎么加整合包_我的世界怎么制作整合包
冗余文件的清理 既然是制作较为纯净的整合包,这一步也很关键,在前面安装forge的过程中生成了很多垃圾文件,对于强迫症来说很难受,为了精简整合包的体积,我们得将其清理清理,以下用红框标注的皆为比较重要 ...
- java service包_利用 javaService 发布服务(jar包)
jar在java中作为一种项目的发布形式比较普遍,往往为了容易管理更需要作为一种系统服务发布--起码服务器重启了不用人工去重新打开你所以往运行的jar文件. 这里简单的介绍下怎么将jar发布到winN ...
- java 判断类型_如何快速入门Java编程学习(干货)
一.初识Java 1.生活中的程序: 从起床到教室上课的过程 穿衣打扮>起床>洗漱>出宿舍>>吃早餐>到教室 按照特定的顺序去完成某一件事的过程我们叫做生活中的程序 ...
- java python算法_用Python,Java和C ++示例解释的排序算法
java python算法 什么是排序算法? (What is a Sorting Algorithm?) Sorting algorithms are a set of instructions t ...
- 我的世java途径错误_我的世界JAVA路径错误的解决方法分享
我的世界JAVA路径错误该怎么解决呢?JAVA是Minecraft运行的虚拟环境必要条件,需要您安装后才开始游戏.很多童鞋在安装过程中都遇到了JAVA路径错误的提示,这是什么原因导致的?第一手游网必须 ...
- java delphi 三层_三层架构delphi+Java+Oracle模式的实现
[架构简介] *本架构以delphi作为客户端,Java作为服务端,oracle作为后台数据库数据.其中delphi客户端的封装为了保持与原来的开发方式兼容都是基于TclientDataSet实现的: ...
- 支持java虚拟主机_为何缺乏支持Java的虚拟主机
现在很多站长们,都青睐于香港虚拟主机建站.现在常见的是asp和PHP的程序空间很多,但是Java的少之又少,下面小编我给大家聊一聊! 一.香港Java虚拟主机成本高 使用Java程序建站,就必须要用支 ...
- java future用法_纯干货:Java学习过程中的21个知识点和技术点
我们在Java学习过程中要学会抓重点,善于总结,Java学习过程中常见的21个知识点和技术点你知道吗?下面和千锋广州小编一起来看看吧! 1. JVM相关 对于刚刚接触Java的人来说,JVM相关的知识 ...
- java实现报表_用存储过程和 JAVA 写报表数据源有什么弊端?
用存储过程和 JAVA 写报表数据源有什么弊端?跟着小编一起来一看一下吧! 我们在报表开发中经常会使用存储过程准备数据,存储过程支持分步计算,可以实现非常复杂的计算逻辑,为报表开发带来便利.所以,报表 ...
最新文章
- php面向对象静态常量,浅谈PHP面向对象编程(四、类常量和静态成员)
- 华为徐文伟:后香农时代,面向数学的十大挑战问题
- spring boot的热加载(hotswap)
- .NET Core微服务之基于Ocelot实现API网关服务(续)
- 以女朋友为例讲解 TCP/IP 三次握手与四次挥手
- redis缓存架构-02-两种持久化机制(RDB和AOF)
- android文件读写
- C-指针02 2017/11/24
- ARouter使用随记
- 子网掩码(subnet mask)与默认网关(default gateway)
- matlab函数小结----数组区
- FTP命令详解(含操作实例)
- 教你设置QQ空间个性签名档
- 如何快速有效的发散思维?
- 让无线路由器告别电源束缚
- 全新的小米,从更流畅,更安全,更智慧的MIUI 14开始
- CAD中把样条曲线改成多线段(转载请删除括号里的内容)
- EAS报表开发----收付明细
- 用 canvas 做一个 DVD 待机动画
- Python基础教程——1.5Python的输入输出
热门文章
- [创业-23]:财务报表 - 损益表(利润表)
- matlab画凸轮廓线,凸轮廓线绘制,layout of cam profile,音标,读音,翻译,英文例句,英语词典...
- js中new操作符具体做了什么
- 搭建微信小程序HTTPS服务器
- 【秒杀】一、系统设计要点,从卖病鹅说起
- 2022年网络安全行业的几个关注点
- 知网提供的“导出与分析”功能来确定论文主题
- UE《空山新雨后》总结笔记
- 二零零九年经典雷人语录总汇四百零五条[转的]
- IGraphicsContain 删除元素