RSA和DES加密解密实验

RSA和DES加密解密实验
RSA和DES加密解密实验

实验一加密解密实验

一、实验目的:

通过JAVA语言,来实现对称密钥加密算法,非对称秘钥加密算法对信息的加密解密,通过实际操作加深学生对对称密钥加密、非对称秘钥加密解密的理解。

二、实验内容:

安装JDK,配置Java开发环境,加压eclipse,编写对称秘钥的生成、对称密钥加密、解密的程序。编写非对称秘钥加密解密的程序,用私钥对信息进行加密,用公钥对信息进行解密,然后用公钥对信息进行加密,用私钥对信息进行解密。

三、实验用到的主要技术及工具

主要技术:Java、Bouncy Castle

主要工具:Eclipse

四、开发步骤:

1、安装JDK,配置JAVA环境变量。

2、解压eclipse。

3、在eclipse中新建项目

4、编写使用DES算法生成秘钥的程序。

1.初始化密钥,并对密钥进行Base64位编码

5、使用生成的秘钥对“电子商务安全技术”进行加密。

加密,使用生成的密钥和明文作为参数进行传递,并使用密钥对明文加密

以下是对明文进行初始化,在第4点中已对密钥初始化

已下是加密算法

6、用第4步骤中生成的秘钥对第5部中生成的加密后的内容进行解密。

inputData为第五步中出现的加密过后的明文,由于DES 为对称加密,所以解密密钥key和加密密钥key使用的是同一把密钥

以下是解密算法:

以下是DES加密与解密算法的结果

7、使用AES算法重复4-6步骤。

8、使用RSA算法生成公钥和私钥。

对密钥进行初始化

取得公钥

取得私钥

对密钥进行编码并输出到控制台

获取明文,并对明文进行编码

9、用公钥对“电子商务安全技术RSA”进行加密。

以下是加密算法

10、用私钥对第九步中加密的信息进行解密。

私钥解密:

以下是解密算法

11、用生成的私钥对“电子商务安全技术RSA”进行加密。

12、用公钥对11步中的信息进行解密。

私钥加密算法

公钥解密算法:

以下是其中一次进行加密与解密的情况

13、请把你的公钥发送给你旁边的同学,让该同学用公钥进行加密,

然后再把加密后的信息发送给你,你再用你的私钥对信息进行解密。

使用其中的一对公钥和私钥,并对公钥加密的数据进行私钥解密,对私钥加密的数据进行公钥解密

以下是固定公钥和私钥,公钥加密的密文,私钥加密的密钥

以公钥解密为例

对私钥加密的密文进行解码,同时也对传输过来的公钥进行同样的解码

byte[] encodedData1 = Base64.decodeBase64(PriMi);

publicKey = Base64.decodeBase64(pubKey);

使用解码的密文和公钥对数据进行解密

byte[] pri_pub_Data = Demo.decryptByPublicKey(encodedData1, publicKey);

以下附上完整代码:

DESDemo.java

package cn.xupt.YVCB.code;

import java.security.Key;

import java.security.Security;

import javax.crypto.Cipher;

import javax.crypto.KeyGenerator;

import javax.crypto.SecretKey;

import javax.crypto.SecretKeyFactory;

import javax.crypto.spec.DESKeySpec;

import https://www.360docs.net/doc/d512875977.html,mons.codec.binary.Base64;

import org.bouncycastle.jce.provider.BouncyCastleProvider;

public class DESDemo {

//加密算法

public static final String KEY_ALGORITHM = "DES";

public static final String CIPHER_ALGORITHM = "DES/ECB/PKCS5Padding";

/**

* 对密钥进行初始化,并返回字节码

* @return

* @throws Exception

*/

public static byte[] initKey() throws Exception{

KeyGenerator kg = KeyGenerator.getInstance(KEY_ALGORITHM);

kg.init(64); //初始化的密钥的长度

SecretKey secretKey = kg.generateKey();

return secretKey.getEncoded();

}

public static Key toKey(byte[] key) throws Exception{

//实例化DES密钥材料

DESKeySpec dks = new DESKeySpec(key);

//实例化秘密密钥莞式服务

SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(KEY_ALGORITHM);

//生成秘密密钥

SecretKey secretKey = keyFactory.generateSecret(dks);

return secretKey;

}

/**

* 解密

* @param data

* @param key

* @return

* @throws Exception

*/

public static byte[] decrypt(byte[] data, byte[] key) throws Exception{

Key k = toKey(key); //还原密钥

Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);

cipher.init(Cipher.DECRYPT_MODE,k);

return cipher.doFinal(data);

}

/**

* 加密

* @param data 需要加密的数据

* @param key 加密密钥

* @return

* @throws Exception

*/

public static byte[] encrypt(byte[] data, byte[] key) throws Exception{

Key k = toKey(key); //还原密钥

Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); //实例化

cipher.init(Cipher.ENCRYPT_MODE, k); //初始化,设置为解密模式

return cipher.doFinal(data); //执行操作

}

public static void test(String str) throws Exception{

Security.addProvider(new BouncyCastleProvider());

String inputStr = str + "使用DES加密与解密"; //获取字符串

byte[] inputData = inputStr.getBytes(); //将字符转换成二风景进制

System.err.println("\n============使用DES加密与解密==================");

System.err.println("原文:"+inputStr); //打印转换后的字节码

//初始化密钥

byte[] key = DESDemo.initKey();

System.err.println("密钥编码前:"+key);

System.err.println("密钥:" +Base64.encodeBase64String(key));

//加密

inputData = DESDemo.encrypt(inputData,key);

System.err.println("加密后:" + Base64.encodeBase64String(inputData));

//解密

byte[] outputData = DESDemo.decrypt(inputData, key);

String outputStr = new String(outputData);

System.err.println("解密后:" + outputStr);

System.err.println("===========DES加密与解密完成========");

}

}

RSADemo.java

package cn.xupt.YVCB.code;

import java.security.*;

import java.security.interfaces.*;

import java.security.spec.*;

import java.util.*;

import javax.crypto.Cipher;

import https://www.360docs.net/doc/d512875977.html,mons.codec.binary.Base64;

public class RSADemo {

private static byte[] publicKey;

private static byte[] privateKey;

// 非对称加密算法:RSA

public static final String KEY_ALGORITHM = "RSA";

// 公钥

private static final String PUBLIC_KEY = "RSAPublicKey";

// 私钥

private static final String PRIV ATE_KEY = "RSAPrivateKey";

// 密钥长度

private static final int KEY_SIZE = 512;

/**

* 初始化密钥

*

* @return keyMap 密钥Map

* @throws Exception

*/

public static Map initKey() throws Exception {

KeyPairGenerator keyPairgen = KeyPairGenerator

.getInstance(KEY_ALGORITHM); // 实例化密钥对生成器keyPairgen.initialize(KEY_SIZE); // 初始化密钥对生成器

KeyPair keyPair = keyPairgen.generateKeyPair(); // 生成密钥对

RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); // 生成公钥

RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); // 生成私钥

Map keyMap = new HashMap(2); // 封闭密钥keyMap.put(PUBLIC_KEY, publicKey);

keyMap.put(PRIV ATE_KEY, privateKey);

return keyMap;

}

/**

* 获取私钥

*

* @param keyMap

* 密钥Map

* @return 返回私钥二进制

* @throws Exception

*/

public static byte[] getPrivateKey(Map keyMap)

throws Exception {

Key key = (Key) keyMap.get(PRIV ATE_KEY);

return key.getEncoded();

}

/**

* 取得公钥

*

* @param keyMap

* 公钥Map

* @return

* @throws Exception

*/

public static byte[] getPublicKey(Map keyMap)

throws Exception {

Key key = (Key) keyMap.get(PUBLIC_KEY);

return key.getEncoded();

}

/**

* 使用私钥进行加密

*

* @param data

* @param key

* @return

* @throws Exception

*/

public static byte[] decryptByPrivateKey(byte[] data, byte[] key)

throws Exception {

// 取得私钥

PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(key);

KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);

// 生成私钥

PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec);

// 对数据进行加密

Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());

cipher.init(Cipher.DECRYPT_MODE, privateKey);

return cipher.doFinal(data);

}

/**

* 公钥解密

*

* @param data

* @param key

* @return

* @throws Exception

*/

public static byte[] decryptByPublicKey(byte[] data, byte[] key)

throws Exception {

// 获取公钥

X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(key);

KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);

// 生成公钥

PublicKey publicKey = keyFactory.generatePublic(x509KeySpec);

// 对数据进行加密

Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());

cipher.init(Cipher.DECRYPT_MODE, publicKey);

return cipher.doFinal(data);

}

/**

* 公钥加密

*

* @param data

* @param key

* @return

* @throws Exception

*/

public static byte[] encryptByPublicKey(byte[] data, byte[] key)

throws Exception {

// 取得公钥

X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(key);

KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);

PublicKey publicKey = keyFactory.generatePublic(x509KeySpec);

// 对数据加密

Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());

cipher.init(Cipher.ENCRYPT_MODE, publicKey);

return cipher.doFinal(data);

}

/**

* 私钥加密

*

* @param data

* @param key

* @return

* @throws Exception

*/

public static byte[] encryptByPrivateKey(byte[] data, byte[] key)

throws Exception {

// 取得私钥

PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(key);

KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);

PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec);

// 对数据进行加密

Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());

cipher.init(Cipher.ENCRYPT_MODE, privateKey);

return cipher.doFinal(data);

}

public static void printCode() throws Exception {

System.err.println("\n\n\n===========使用RSA生成公钥与私钥

================");

// 初始化密钥

Map keyMap = RSADemo.initKey();

publicKey = RSADemo.getPublicKey(keyMap);

privateKey = RSADemo.getPrivateKey(keyMap);

System.err.println("公钥:" + Base64.encodeBase64String(publicKey));

System.err.println("私钥:" + Base64.encodeBase64String(privateKey));

System.err.println("=================密钥生成完成=========================");

}

public void test(String str) throws Exception {

System.err

.println("\n\n\n ================= RSA加密算法:私钥加密——公钥解密=============");

String inputStr1 = str + " :RSA加密算法:私钥加密——私钥解密";

byte[] data1 = inputStr1.getBytes();

System.err.println("原文:" + inputStr1);

// 私钥加密

byte[] encodedData1 = RSADemo.encryptByPrivateKey(data1, privateKey);

System.err.println("加密后:" + Base64.encodeBase64String(encodedData1));

// 公钥解密

byte[] decodedData1 = RSADemo.decryptByPublicKey(encodedData1,

publicKey);

String outputStr1 = new String(decodedData1);

System.err.println("解密后:" + outputStr1);

System.err.println("\n\n\n========公钥加密——私钥解密=============");

String inputStr2 = str + " :RSA加密算法:公钥加密——私钥解密";

byte[] data2 = inputStr2.getBytes();

System.err.println("原文:" + inputStr2);

// 公钥加密

byte[] encodedData2 = RSADemo.encryptByPublicKey(data2, publicKey);

System.err.println("加密后:" + Base64.encodeBase64String(encodedData2));

// 私钥解密

byte[] decodedData2 = RSADemo.decryptByPrivateKey(encodedData2,

privateKey);

String outputStr2 = new String(decodedData2);

System.err.println("解密后:" + outputStr2);

}

/**

* 对别人已经加密进行解密

*

* @throws Exception

*/

public void test() throws Exception {

// 公钥

String pubKey = "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIswBjSKnOZcaqc1fnz2SQPw1K3EzMoFa8 WPfRq3c/Z/G+FafjY/Cy1t0mekmpS20szhz5MVyqg2C1WjO1oda3kCAwEAAQ==";

// 私钥

String priKey = "MIIBV AIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAizAGNIqc5lxqpzV+fPZJ A/DUrcTMygVrxY99Grdz9n8b4Vp+Nj8LLW3SZ6SalLbSzOHPkxXKqDYLVaM7Wh1reQIDA QABAkByUwHlyizRsfsQWIoKjiivCfNGv60OCqHY5eD2PtULE2L8u7gDEC7J7UB6MdMbyX mIAkVN1pp6SHEdHWMV+GPhAiEA6v14HJzJ5c6uIBwM7jDO/TjWzTFsw/pp07aKJiimm90C IQCXocuqF4CIJ756IgkelhXJh589FeIX18H8YH3MXgcSTQIgMFZtY61Y1p3aMZ6zhjeiDHKpt NHK5tFW/YbaChlolD0CIGgOQiNxiWTmUVKi9Lsmp8Dq7x4OXF+cUqUM2odap2OpAiEAiw o8yK6oWncDnXwv7naXB9WZbO3DCFmXYBngLiLLnak=";

// 公钥加密后的密文

String PubMi = "fDUU1gCNwWJ9j7LfBLQI65h9IoQ6bQaWPIlnYc4ZM4wcVj01Yo8HNXJ25yiv2PrH/iEczV99 QC0pZkJ4huIiCA==";

// 私钥加密后的密文

String PriMi = "He0OOcxzcHSUHZofSczVCKqnWk3OSG1tUpdU7SPKZvYXY+/UjzdjuW8I84hYtovUqSspRa Xd1Ou0wVqc8QTX4Q==";

// 指定公钥加密

// pubKey =

// "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJdGLmHuUxgOtGoRoyYoeLXWT+HcLaK ONSgJq8TssOWIAk9pf+LUDjyUqPbGm7cMZAgrJuDi58Bc+PpsFK6iiwcCAwEAAQ==";

System.out.println("\n\n\n===========对别人的数据进行解密===========");

String str = "用**的公钥加密";

// 公钥解密

System.out.println("\n===========公钥解密===========");

byte[] encodedData1 = Base64.decodeBase64(PriMi);

publicKey = Base64.decodeBase64(pubKey);

byte[] pri_pub_Data = Demo.decryptByPublicKey(encodedData1, publicKey);

String outputStr1 = new String(pri_pub_Data);

System.out.println("解密后:" + outputStr1);

// 私钥解密

System.out.println("\n===========私钥解密==========");

byte[] encodedData2 = Base64.decodeBase64(PubMi);

privateKey = Base64.decodeBase64(priKey);

byte[] pub_pri_Data = Demo

.decryptByPrivateKey(encodedData2, privateKey);

String outputSt2 = new String(pub_pri_Data);

System.out.println("解密后:" + outputSt2);

// 用指定的公钥对明文加密

System.out.println("====用指定的公钥对数据进行加密====");

System.out.println("原明文为:"+str);

byte[] data2 = str.getBytes();

byte[] encodedData3 = RSADemo.encryptByPublicKey(data2, publicKey);

System.err.println("加密后:" + Base64.encodeBase64String(encodedData2));

}

}

CodeDemo.java

package cn.xupt.YVCB.code;

public class CodeDemo {

public static void main(String[] args) throws Exception { String str = "海浪之心加密";

// 使用DES加密与解密

DESDemo.test(str);

// 使用AES加密与解密

// AESDemo.test();

// 使用RSA加密与解密

RSADemo rsa = new RSADemo();

RSADemo.printCode();

rsa.test(str);

//对别人加密的数据进行解密

rsa.test();

}

}

相关主题
相关文档
最新文档