RSA加密解密、MD5/SHA1值计算
作者:源码世界时间:2014-03-13分类:程序员碎语评论:0浏览:7529
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生成随机数字和字母组合
- 上一篇:文件复制工具