RSA加密解密、MD5/SHA1值计算

作者:源码世界时间:2014-03-13分类:程序员碎语评论:0浏览:5992
try {
			/**************************************
			 * 生成密钥以供加密解密                                   *
			 **************************************/
			/* 密钥生成器 */
			KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
			/* 密钥对生成 */
			KeyPair keyPair = generator.genKeyPair();
			/* 获取公钥 */
			RSAPublicKey publicKey = (RSAPublicKey)keyPair.getPublic();
			/* 获取私钥 */
			RSAPrivateKey privateKey = (RSAPrivateKey)keyPair.getPrivate();
			/* 获取密钥的 Modules 和 Exponent 值以供密钥还原 */
			BigInteger publicModules = publicKey.getModulus();
			BigInteger privateModules = privateKey.getModulus();
			BigInteger publicExponent = publicKey.getPublicExponent();
			BigInteger privateExponent = privateKey.getPrivateExponent();
			System.out.println("Public Modules == " + publicModules);
			System.out.println("Private Modules == " + privateModules);
			System.out.println("Public Exponent == " + publicExponent);
			System.out.println("Private Exponent == " + privateExponent);
			/**************************************
			 * 通过 modules 和 exponent 还原密钥          *
			 **************************************/
			/* 通过 Modules 和 Exponent 值生成 KeySpec */
			RSAPublicKeySpec publicSpec = new RSAPublicKeySpec(publicModules, publicExponent);
			RSAPrivateKeySpec privateSpec = new RSAPrivateKeySpec(privateModules, privateExponent);
			/* 通过 KeySpec还原密钥,还原工具是 KeyFactory */
			KeyFactory keyFactory = KeyFactory.getInstance("RSA");
			RSAPublicKey rPublicKey = null;
			RSAPrivateKey rPrivateKey = null;
			try {
				rPublicKey = (RSAPublicKey) keyFactory.generatePublic(publicSpec);
				rPrivateKey = (RSAPrivateKey) keyFactory.generatePrivate(privateSpec);
			} catch (InvalidKeySpecException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			/**************************************
			 * 通过密钥进行简单的加密解密测试                  *
			 * 加密解密使用Cipher类进行                           *
			 **************************************/
			String secret = "这是一个秘密,不允许无关人士查看";
			byte[] bSecret = secret.getBytes();
			byte[] dSecret = null;
			System.out.print("加密前byte数组:");
			for (byte b : bSecret) {
				System.out.print(b);
			}
			System.out.println();
			System.out.println("加密前: " + new String(bSecret));
			/* Cipher加密数据及还原数据 */
			Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
			/* 加密初始化,通过私钥加密,指定的参数决定了加密还是解密 */
			cipher.init(Cipher.ENCRYPT_MODE, privateKey);
			/* 可以通过 doFinal 或 update 进行加解密,String太短使用update可能会失败,可以选择 onFinal */
			dSecret = cipher.doFinal(bSecret);
			System.out.print("加密后byte数组: ");
			for (byte b : dSecret) {
				System.out.print(b);
			}
			System.out.println();
			System.out.println("加密后: " + new String(dSecret));
			/* 重新初始化进行解密,参数为DECRYPT_MODE */
			cipher.init(Cipher.DECRYPT_MODE, publicKey);
			dSecret = cipher.doFinal(dSecret);
			System.out.print("解密后byte数组: ");
			for (byte b : dSecret) {
				System.out.print(b);
			}
			System.out.println();
			System.out.println("解密后: " + new String(dSecret));
			/**************************************
			 * 计算MD5值                                                      *
			 * 使用  MessageDigest计算                            *
			 **************************************/
			/* MessageDigest 计算 MD5 值,参数输入 SHA1 则是计算 SHA1 值 */
			MessageDigest digest = MessageDigest.getInstance("MD5");
			/* 计算 */
			digest.update(bSecret);
			/* 取结果 */
			dSecret = digest.digest();
			/* 处理数组,把byte数组转为16进制字符串 */
			StringBuilder md5 = new StringBuilder();
			/* 二进制转十六进制,先把二进制转成十进制,再从数组中取对应的char */
			char[] hexDigits = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
			byte b;
			char hex;
			for (int i = 0; i < dSecret.length; i ++) {
				b = dSecret[i];
				/* 
				 * 取byte二进制的4位出来计算成16进制 ,
				 * 系统将二进制转10进制,再去从hexDigits中找出对应的16进制char就实现了二进制转16进制 
				 * 0xf是16进制中的16,在二进制中是1111,byte和二进制的1111进行运算得到byte中低四位的二进制值
				 * 16位是取32位中间16位
				 */
				hex = hexDigits[b >>> 4 & 0xf];
				md5.append(hex);
				/* 如果是32位md5字符串则需要以下 */
				hex = hexDigits[b & 0xf];
				md5.append(hex);
			}
			System.out.println("32位md5 == " + md5);
			System.out.println("16位md5 == " + md5.substring(8, 24));
		} catch (NoSuchAlgorithmException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NoSuchPaddingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvalidKeyException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalBlockSizeException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (BadPaddingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
标签:Java  
返回顶部
分享按钮