1、RSA和DES加密解密实验实验一 加密解密实验一、实验目的:通过JAVA语言,来实现对称密钥加密算法,非对称秘钥加密算法对信息的加密解密,通过实际操作加深学生对对称密钥加密、非对称秘钥加密解密的理解。二、实验内容:安装JDK,配置Java开发环境,加压eclipse,编写对称秘钥的生成、对称密钥加密、解密的程序。编写非对称秘钥加密解密的程序,用私钥对信息进行加密,用公钥对信息进行解密,然后用公钥对信息进行加密,用私钥对信息进行解密。三、实验用到的主要技术及工具主要技术:Java、Bouncy Castle主要工具:Eclipse四、开发步骤:1、安装JDK,配置JAVA环境变量。2、解压ecl
2、ipse。3、在eclipse中新建项目4、编写使用DES算法生成秘钥的程序。 1.初始化密钥,并对密钥进行Base64位编码5、使用生成的秘钥对“电子商务安全技术”进行加密。加密,使用生成的密钥和明文作为参数进行传递,并使用密钥对明文加密以下是对明文进行初始化,在第4点中已对密钥初始化已下是加密算法6、用第4步骤中生成的秘钥对第5部中生成的加密后的内容进行解密。inputData为第五步中出现的加密过后的明文,由于DES 为对称加密,所以解密密钥key和加密密钥key使用的是同一把密钥以下是解密算法: 以下是DES加密与解密算法的结果7、使用AES算法重复4-6步骤。8、使用RSA算法生成公
3、钥和私钥。对密钥进行初始化取得公钥取得私钥对密钥进行编码并输出到控制台获取明文,并对明文进行编码9、用公钥对“电子商务安全技术RSA”进行加密。以下是加密算法 10、用私钥对第九步中加密的信息进行解密。私钥解密:以下是解密算法11、用生成的私钥对“电子商务安全技术RSA”进行加密。12、用公钥对11步中的信息进行解密。私钥加密算法公钥解密算法:以下是其中一次进行加密与解密的情况13、请把你的公钥发送给你旁边的同学,让该同学用公钥进行加密,然后再把加密后的信息发送给你,你再用你的私钥对信息进行解密。使用其中的一对公钥和私钥,并对公钥加密的数据进行私钥解密,对私钥加密的数据进行公钥解密以下是固定公
4、钥和私钥,公钥加密的密文,私钥加密的密钥以公钥解密为例对私钥加密的密文进行解码,同时也对传输过来的公钥进行同样的解码byte encodedData1 = Base64.decodeBase64(PriMi);publicKey = Base64.decodeBase64(pubKey);使用解码的密文和公钥对数据进行解密byte pri_pub_Data = Demo.decryptByPublicKey(encodedData1, publicKey);以下附上完整代码:DESDemo.javapackage cn.xupt.YVCB.code;import java.security.K
5、ey;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 mons.codec.binary.Base64;import org.bouncycastle.jce.provider.BouncyCastleProvider;public class D
6、ESDemo /加密算法 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); /
7、初始化的密钥的长度 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 =
8、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); retur
9、n 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); /初始化,设置为解密模式
10、 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);
11、 /打印转换后的字节码 /初始化密钥 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, ke
12、y); String outputStr = new String(outputData); System.err.println(解密后: + outputStr); System.err.println(=DES加密与解密完成=); RSADemo.javapackage cn.xupt.YVCB.code;import java.security.*;import java.security.interfaces.*;import java.security.spec.*;import java.util.*;import javax.crypto.Cipher;import mons.
13、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 PRIVATE_KEY = RSAPrivateKey; / 密钥长度 priv
14、ate 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
15、.generateKeyPair(); / 生成密钥对 RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); / 生成公钥 RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); / 生成私钥 Map keyMap = new HashMap(2); / 封闭密钥 keyMap.put(PUBLIC_KEY, publicKey); keyMap.put(PRIVATE_KEY, privateKey); return keyMap; /* * 获取私钥
16、 * * param keyMap * 密钥Map * return 返回私钥二进制 * throws Exception */ public static byte getPrivateKey(Map keyMap) throws Exception Key key = (Key) keyMap.get(PRIVATE_KEY); return key.getEncoded(); /* * 取得公钥 * * param keyMap * 公钥Map * return * throws Exception */ public static byte getPublicKey(Map keyMa
17、p) 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(
18、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); /* * 公钥解密 *
19、 * 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 = keyFac
20、tory.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, byt
21、e 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(
22、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
23、 = 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 Excepti
24、on System.err.println(nnn=使用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); Syste
25、m.err.println(=密钥生成完成=); public void test(String str) throws Exception System.err .println(nnn = RSA加密算法:私钥加密公钥 解密=); String inputStr1 = str + :RSA加密算法 :私钥加密私钥解密; byte data1 = inputStr1.getBytes(); System.err.println(原文: + inputStr1); / 私钥加密 byte encodedData1 = RSADemo.encryptByPrivateKey(data1, pri
26、vateKey); System.err.println(加密后: + Base64.encodeBase64String(encodedData1); / 公钥解密 byte decodedData1 = RSADemo.decryptByPublicKey(encodedData1, publicKey); String outputStr1 = new String(decodedData1); System.err.println(解密后: + outputStr1); System.err.println(nnn=公钥加密私钥解密=); String inputStr2 = str
27、+ :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(encodedData
28、2, privateKey); String outputStr2 = new String(decodedData2); System.err.println(解密后: + outputStr2); /* * 对别人已经加密进行解密 * * throws Exception */ public void test() throws Exception / 公钥 String pubKey = MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIswBjSKnOZcaqc1fnz2SQPw1K3EzMoFa8WPfRq3c/Z/G+FafjY/Cy1t0mekmpS20szhz5MVyqg2C1WjO1oda3kCAwEAAQ=; / 私钥 String priKey = MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAizAGNIqc5lxq