资源描述
信息与网络安全
信息与网络安全实验报告
一、实验名称
设计数字签名
二、实验目得
理解数字签名,学会设计数字签名
三、实验原理
1:调用、NET2、0得MAKECERT创建含有私钥得数字证书,并存储到个人证书区;
2:将该证书导出为pfx文件,并为其指定一个用来打开pfx文件得password;
3:读取pfx文件,导出pfx中公钥和私钥;
4:用pfx证书中得公钥进行数据得加密,用私钥进行数据得解密。
四 、签名算法:
using System;
using System、Text;
using System、Security、Cryptography;
namespace DigitalSignature
{
//信息和签名得封包
public struct DS
{
public byte[] data;
public byte[] signature;
}
class Program
{
static DSACryptoServiceProvider dsa = new DSACryptoServiceProvider(); //创建了公钥和私钥对
//创建数字签名
DS CreateSignature(string strData)
{
SHA1Managed sha1 = new SHA1Managed();
{
SHA1Managed sha1 = new SHA1Managed();
DSASignatureFormatter sigFormatter = new DSASignatureFormatter(dsa);
byte[] data_Bytes = Encoding、ASCII、GetBytes(strData);
byte[] hash_Bytes = puteHash(data_Bytes);
sigFormatter、SetHashAlgorithm("SHA1");
byte[] signedHash = sigFormatter、CreateSignature(hash_Bytes);
DS ds = new DS();
ds、data = hash_Bytes;
ds、signature = signedHash;
return ds;
}
//验证数字签名
bool VerifySignature(DS ds)
{
byte[] remote_HashedValue = ds、data;
byte[] remote_SignedHash = ds、signature;
DSASignatureDeformatter sigDeformatter = new DSASignatureDeformatter(dsa);
sigDeformatter、SetHashAlgorithm("SHA1");
if (sigDeformatter、VerifySignature(remote_HashedValue, remote_SignedHash))
{
return true;
}
return false;
}
static void Main(string[] args)
{
string strMsg = "JGLRIEHDKVJFLHGJGYRKPYEVCNADWQKGLBUFOWDT"; //报文文本
DS ds = new DS();
Program prog = new Program();
ds = prog、CreateSignature(strMsg);
//模拟签名在传输途中遭到破坏或修改
//、、、
//ds、signature = new byte[40];
if (prog、VerifySignature(ds))
{
//验证通过
Console、WriteLine("The signature used to sign the hash has been verified、");
}
else
{
//验证未通过
Console、WriteLine("The signature used to sign the hash doesn't match the hash、");
}
Console、ReadLine();
}
}
}
五、对数字签名算法得理解
数字签名就就是非对称密钥加密技术与数字摘要技术得应用。数字签名有两种功效:一就就是能确定消息确实就就是由发送方签名并发出来得,因为别人假冒不了发送方得签名。二就就是数字签名能确定消息得完整性。因为数字签名得特点就就是她代表了文件得特征,文件如果发生改变,数字签名得值也将发生变化。不同得文件将得到不同得数字签名。 一次数字签名涉及到一个哈希函数、发送者得公钥、发送者得私钥。”
一 、实验名称
PGP算法
二、 实验目得
了解PGP得工作原理,掌握PGP算法得使用
三、 实验原理
1. 发送方创建消息
2. 发送方生成消息得160位得散列码
3. 用发送方私钥对散列进行RSA加密,加到消息上
4. 传输数据
5. 接收方用发送方得公钥对加密部分进行RSA解密
6. 接收方将剩余数据生成160位散列码
7. 生成散列与解密散列进行比较,如果匹配,则认证成功
四 源程序 :
import java、io、*;
import java、security、*;
import java、lang、reflect、*;
import javax、crypto、*;
import javax、crypto、spec、*;
public class DecryptStart extends ClassLoader
{
// 这些对象在构造函数中设置,
// 以后loadClass()方法将利用她们解密类
private SecretKey key;
private Cipher cipher;
// 构造函数:设置解密所需要得对象
public DecryptStart( SecretKey key ) throws GeneralSecurityException,
IOException {
this、key = key;
String algorithm = "DES";
SecureRandom sr = new SecureRandom();
System、err、println( "[DecryptStart: creating cipher]" );
cipher = Cipher、getInstance( algorithm );
cipher、init( Cipher、DECRYPT_MODE, key, sr );
}
// main过程:我们要在这里读入密匙,创建DecryptStart得
// 实例,她就就就是我们得定制ClassLoader。
// 设置好ClassLoader以后,我们用她装入应用实例,
// 最后,我们通过Java Reflection API调用应用实例得main方法
static public void main( String args[] ) throws Exception {
String key = args[0];
String appName = args[1];
// 这些就就是传递给应用本身得参数
String realArgs[] = new String[args、length-2];
System、arraycopy( args, 2, realArgs, 0, args、length-2 );
// 读取密匙
System、err、println( "[DecryptStart: reading key]" );
byte rawKey[] = Util、readFile( key );
DESKeySpec dks = new DESKeySpec( rawKey );
SecretKeyFactory keyFactory = SecretKeyFactory、getInstance( "DES" );
SecretKey key = keyFactory、generateSecret( dks );
// 创建解密得ClassLoader
DecryptStart dr = new DecryptStart( key );
// 创建应用主类得一个实例
// 通过ClassLoader装入她
System、err、println( "[DecryptStart: loading "+appName+"]" );
Class clasz = dr、loadClass( appName );
// 最后,通过Reflection API调用应用实例
// 得main()方法
// 获取一个对main()得引用
String proto[] = new String[1];
Class mainArgs[] = { (new String[1])、getClass() };
Method main = clasz、getMethod( "main", mainArgs );
// 创建一个包含main()方法参数得数组
Object argsArray[] = { realArgs };
System、err、println( "[DecryptStart: running "+appName+"、main()]" );
// 调用main()
main、invoke( null, argsArray );
}
public Class loadClass( String name, boolean resolve )
throws ClassNotFoundException {
try {
// 我们要创建得Class对象
Class clasz = null;
// 必需得步骤1:如果类已经在系统缓冲之中
// 我们不必再次装入她
clasz = findLoadedClass( name );
if (clasz != null)
return clasz;
// 下面就就是定制部分
try {
// 读取经过加密得类文件
byte classData[] = Util、readFile( name+"、class" );
if (classData != null) {
// 解密、、、
byte decryptedClassData[] = cipher、doFinal( classData );
// 、、、 再把她转换成一个类
clasz = defineClass( name, decryptedClassData,
0, decryptedClassData、length );
System、err、println( "[DecryptStart: decrypting class "+name+"]" );
}
} catch( fnfe ) {
}
// 必需得步骤2:如果上面没有成功
// 我们尝试用默认得ClassLoader装入她
if (clasz == null)
clasz = findSystemClass( name );
// 必需得步骤3:如有必要,则装入相关得类
if (resolve && clasz != null)
resolveClass( clasz );
// 把类返回给调用者
return clasz;
} catch( IOException ie ) {
throw new ClassNotFoundException( ie、toString()
);
} catch( GeneralSecurityException gse ) {
throw new ClassNotFoundException( gse、toString()
);
}
}
}
五、 对PGP得理解
PGP加密系统就就是采用公开密钥加密与传统密钥加密相结合得一种加密技术。她使用一对数学上相关得钥匙,其中一个(公钥)用来加密信息,另一个(私钥)用来解密信息。PGP采用得传统加密技术部分所使用得密钥称为“会话密钥”。每次使用时,PGP都随机产生一个128位得IDEA会话密钥,用来加密报文。公开密钥加密技术中得公钥和私钥则用来加密会话密钥,并通过她间接地保护报文内容。
展开阅读全文