关于RSA加密算法的工具类
程序员文章站
2022-07-04 16:01:32
...
关于RSA加密算法的工具类
最近在捣鼓SSO(单点登录),就是一个在应用(系统)登录之后,当切换其他应用(系统)的时候,可以省去登录,提高用户的使用的便捷。(具体有时间在写)
期间涉及的安全问题,发送数据涉及账户密码以及分布系统之间的信息安全问题。
Have a nice day~
最近在捣鼓SSO(单点登录),就是一个在应用(系统)登录之后,当切换其他应用(系统)的时候,可以省去登录,提高用户的使用的便捷。(具体有时间在写)
期间涉及的安全问题,发送数据涉及账户密码以及分布系统之间的信息安全问题。
package test.rsa; import java.io.*; import java.math.BigInteger; import java.security.*; import java.security.interfaces.*; import java.security.spec.*; import javax.crypto.*; import org.bouncycastle.util.encoders.Hex; import sun.misc.*; public class TestRSA { /** * * 生成密钥对 * * * @return KeyPair * * @throws EncryptException */ public static KeyPair generateKeyPair() throws Exception { try { KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA", new org.bouncycastle.jce.provider.BouncyCastleProvider()); final int KEY_SIZE = 1024;// 块加密的大小,是不要太大,否则效率会低 keyPairGen.initialize(KEY_SIZE, new SecureRandom()); KeyPair keyPair = keyPairGen.generateKeyPair(); saveKeyPair(keyPair); return keyPair; } catch (Exception e) { throw new Exception(e.getMessage()); } } public static KeyPair getKeyPair() throws Exception { FileInputStream fis = new FileInputStream( "D:/javasoft/TempTest/RSAKey.txt"); ObjectInputStream oos = new ObjectInputStream(fis); KeyPair kp = (KeyPair) oos.readObject(); oos.close(); fis.close(); return kp; } public static void saveKeyPair(KeyPair kp) throws Exception { FileOutputStream fos = new FileOutputStream( "D:/javasoft/TempTest/RSAKey.txt"); ObjectOutputStream oos = new ObjectOutputStream(fos); // 生成密钥 oos.writeObject(kp); oos.close(); fos.close(); } /** * * 生成公钥 * * * @param modulus * * @param publicExponent * * @return RSAPublicKey * * @throws Exception */ public static RSAPublicKey generateRSAPublicKey(byte[] modulus, byte[] publicExponent) throws Exception { KeyFactory keyFac = null; try { keyFac = KeyFactory.getInstance("RSA", new org.bouncycastle.jce.provider.BouncyCastleProvider()); } catch (NoSuchAlgorithmException ex) { throw new Exception(ex.getMessage()); } RSAPublicKeySpec pubKeySpec = new RSAPublicKeySpec(new BigInteger( modulus), new BigInteger(publicExponent)); try { return (RSAPublicKey) keyFac.generatePublic(pubKeySpec); } catch (InvalidKeySpecException ex) { throw new Exception(ex.getMessage()); } } /** * * 生成私钥 * * * @param modulus * * @param privateExponent * * @return RSAPrivateKey * * @throws Exception */ public static RSAPrivateKey generateRSAPrivateKey(byte[] modulus, byte[] privateExponent) throws Exception { KeyFactory keyFac = null; try { keyFac = KeyFactory.getInstance("RSA", new org.bouncycastle.jce.provider.BouncyCastleProvider()); } catch (NoSuchAlgorithmException ex) { throw new Exception(ex.getMessage()); } RSAPrivateKeySpec priKeySpec = new RSAPrivateKeySpec(new BigInteger( modulus), new BigInteger(privateExponent)); try { return (RSAPrivateKey) keyFac.generatePrivate(priKeySpec); } catch (InvalidKeySpecException ex) { throw new Exception(ex.getMessage()); } } /** * 加密的方法 * @throws IOException * @throws NoSuchPaddingException * @throws NoSuchAlgorithmException */ private static String encrypt(PublicKey pk,String source) throws Exception{ Cipher cipher = Cipher.getInstance("RSA",new org.bouncycastle.jce.provider.BouncyCastleProvider()); cipher.init(Cipher.ENCRYPT_MODE, pk); byte[] sbt = source.getBytes(); byte[] epByte = cipher.doFinal(sbt); BASE64Encoder encoder = new BASE64Encoder(); String epStr = encoder.encode(epByte); return epStr; } private static String encrypt1(PublicKey pk,String source) throws Exception{ Cipher cipher = Cipher.getInstance("RSA",new org.bouncycastle.jce.provider.BouncyCastleProvider()); cipher.init(Cipher.ENCRYPT_MODE, pk); byte[] s = source.getBytes(); byte[] en_s = cipher.doFinal(s); return new String(Hex.encode(en_s)); } /** * 解密的方法 * @throws Exception */ public static String decrypt(PrivateKey pk,String source) throws Exception { /** 得到Cipher对象对已用公钥加密的数据进行RSA解密 */ Cipher cipher = Cipher.getInstance("RSA",new org.bouncycastle.jce.provider.BouncyCastleProvider()); cipher.init(Cipher.DECRYPT_MODE, pk); BASE64Decoder decoder = new BASE64Decoder(); byte[] b1 = decoder.decodeBuffer(source); /** 执行解密操作 */ byte[] b = cipher.doFinal(b1); return new String(b); } public static String decrypt1(PrivateKey pk,String source) throws Exception { /** 得到Cipher对象对已用公钥加密的数据进行RSA解密 */ Cipher cipher = Cipher.getInstance("RSA",new org.bouncycastle.jce.provider.BouncyCastleProvider()); cipher.init(Cipher.DECRYPT_MODE, pk); /** 执行解密操作 */ byte[] b = cipher.doFinal(Hex.decode(source)); return new String(b); } public static void main(String[] args) throws Exception { String s = "1-Test-我"; String en_s = encrypt1(getKeyPair().getPublic(), s); System.out.println("----------------分割线--------------------------"); System.out.println("加密之后:"); System.out.println(en_s); System.out.println("----------------分割线--------------------------"); String de_s = decrypt1(getKeyPair().getPrivate(),en_s); System.out.println("还原密文:"); System.out.println(de_s); } }
Have a nice day~