RSA加密介绍

来源:互联网 发布:软件项目成果总结报告 编辑:程序博客网 时间:2024/05/21 10:32

RSA 算法:  RSA是目前最有影响力的公钥加密算法,


明文--->公钥--->密文   密文-->密钥-->明文

通过这个我们可知  他是公钥对内容进行加密   进而借助密钥对文件进行解密   因为公钥和密钥是不一样的    所以 我们将其称为

非对称加密。

RSA由于public key<公钥> 和private key<密钥>的不同<也叫非对称算法加解密>,极大的提高了文件的安全性。 


代码如下


KeyPairGenerator是一个引擎类可以生成私钥及其相关利用公钥算法初始化。

1:

  1. //设置使用何种加密算法
  2.                 KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
                                  构造一个新实例的KeyPairGenerator算法使用的名称。

  1.                 // 密钥位数
  2.                 keyPairGen.initialize(1024);
  3.                 // 密钥对
  4.                 KeyPair keyPair = keyPairGen.generateKeyPair();
  5.                 // 公钥
  6.                 PublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
  7.                 // 私钥
  8.                 PrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();

2:

为了公钥跟私钥可以传输和保存,因此可以设置为将他们转化成base64的编码,用到以下方法:


注意  这个地方就是将数据转化为base64编码


  1. /****************************************
  2.          * 函数说明:getKeyString 根据key得到64位加密字符串
  3.          * 
  4.          * @param key 密钥
  5.          * @throws Exception
  6.          * @return String 加密后的字符串
  7.          * @author 王洪贺 2013-8-21
  8.          ***************************************/

  1.   public static String getKeyString(Key key) throws Exception
  2.         {
  3.                 byte[] keyBytes = key.getEncoded();
  4.                 String s = base64Enc(keyBytes);
  5.                 return s;
  6.         }

但加密跟解密的时候需要将base64位的编码转化为key的对象,所以用到以下两个方法:


  1. /****************************************
  2.          * 函数说明:getPublicKey 取得公钥
  3.          * 
  4.          * @param key 公钥字符串
  5.          * @throws Exception
  6.          * @return PublicKey 返回公钥
  7.          * @author 王洪贺 2013-8-21
  8.          ***************************************/
  9.         public static PublicKey getPublicKey(String key) throws Exception
  10.         {
  11.                 byte[] keyBytes;
  12.                 keyBytes = base64Dec(key);

  13.                 X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
  14.                 KeyFactory keyFactory = KeyFactory.getInstance("RSA");
  15.                 PublicKey publicKey = keyFactory.generatePublic(keySpec);
  16.                 return publicKey;
  17.         }

  1.  /****************************************
  2.          * 函数说明:getPrivateKey 取得私钥
  3.          * 
  4.          * @param key 私钥字符串
  5.          * @throws Exception
  6.          * @return PrivateKey 返回私钥
  7.          * @author 王洪贺 2013-8-21
  8.          ***************************************/
  9.         public static PrivateKey getPrivateKey(String key) throws Exception
  10.         {
  11.                 byte[] keyBytes;
  12.                 keyBytes = base64Dec(key);

  13.                 PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
  14.                 KeyFactory keyFactory = KeyFactory.getInstance("RSA");
  15.                 PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
  16.                 return privateKey;
  17.         }


下面就是加密过程,很简单:


  1. // 实例化加解密类
  2.                 Cipher cipher = Cipher.getInstance("RSA");

  3.                 // 明文
  4.                 byte[] plainText = "明文".getBytes();

  5.                 // 加密
  6.                 cipher.init(Cipher.ENCRYPT_MODE, publicKe);
  7.   //将明文转化为根据公钥加密的密文,为byte数组格式
  8.                 byte[] enBytes = cipher.doFinal(plainText);
  9.   //为了方便传输我们可以将byte数组转化为base64的编码
  10.                 String str = base64Enc(enBytes );
复制代码


下面是解密过程,跟加密过程类似:

  1. Cipher cipher = Cipher.getInstance("RSA");
  2. cipher.init(Cipher.DECRYPT_MODE, privateKey);
  3. //先将转为base64编码的加密后的数据转化为byte数组
  4. byte[] enBytes = base64Dec(str);
  5. //解密称为byte数组,应该为字符串数组最后转化为字符串
  6. byte[] deBytes = cipher.doFinal(enBytes);
  7. String strdecoded = new String(deBytes);
复制代码



总结  可得 

 1:其实我们找个地方就是首先借助KeyPairGenerator来确定是何种加密方式    

比如RSA   另外  我们此时获得我们的公钥和密钥   

2:  但是我们为了传输数据的时候更加容易  所以我们就借助base64编码

3:借助  Cipher类实现我们的我们的对传输内容进行加密和解密。   
























0 0
原创粉丝点击