关于RSA的一些学习心得

  1.   RSA加密分主要为公钥加密和私钥加密验签
  2. 使用SUN提供的security封装的方法
  3. 基础原理: RSA就是建立在对大数分解质因式的困难上的,理论依据是费马定理和欧拉定理
  4. 下为私钥加密--签名验证流程:
    1.   /**
  5.      * 数据签名
  6.      *
  7.      * @param content
  8.      *            签名内容
  9.      * @param privateKey
  10.      *            私钥
  11.      * @return 返回签名数据
  12.      */
  13.     public static String sign(String content, String privateKey) {
  14.         try {
  15.             PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(
  16.                     Base64.decode(privateKey));
  17.             KeyFactory keyf = KeyFactory.getInstance("RSA");
  18.             PrivateKey priKey = keyf.generatePrivate(priPKCS8);
  19.  
  20.             java.security.Signature signature = java.security.Signature
  21.                     .getInstance("SHA1WithRSA");//地址算法
  22.  
  23.             signature.initSign(priKey);
  24.             signature.update(content.getBytes("UTF-8"));
  25.  
  26.             byte[] signed = signature.sign();
  27.  
  28.             return Base64.encode(signed);
  29.         } catch (Exception e) {
  30.             e.printStackTrace();
  31.         }
  32.  
  33.         return null;
  34.     }
  35.  
  36.     /**
  37.      * 签名验证
  38.      *
  39.      * @param content 签名内容
  40.      * @param sign 签名
  41.      * @param lakala_public_key
  42.      * @return
  43.      */
  44.     public static boolean verify(String content, String sign,
  45.             String public_key) {
  46.         try {
  47.             KeyFactory keyFactory = KeyFactory.getInstance("RSA");
  48.             byte[] encodedKey = Base64.decode(public_key);
  49.             PublicKey pubKey = keyFactory
  50.                     .generatePublic(new X509EncodedKeySpec(encodedKey));
  51.  
  52.             java.security.Signature signature = java.security.Signature
  53.                     .getInstance("SHA1WithRSA");
  54.  
  55.             signature.initVerify(pubKey);
  56.             signature.update(content.getBytes("UTF-8"));
  57.  
  58.             boolean bverify = signature.verify(Base64.decode(sign));
  59.             return bverify;
  60.  
  61.         } catch (Exception e) {
  62.             e.printStackTrace();
  63.         }
  64.  
  65.         return false;
  66.     }
  67. 其中RSA核心的类 Cipher
  68. getInstance可选择加密模式:填充模式、非填充模式、正常模式,笔者目前遇到的加密模式有这三种。
  69. provider为提供加密算法是谁比如  RSA/ECB/NoPadding 表示RSA提供加密算法,ECB代表其属于工作模式,NoPadding即为非填充模式。
  70. 笔者在做对客户端发送密文,服务器接收秘闻进行加密的时候,遇到过解析乱码的问题
  71. 那是因为客户端比如Andriod端进行加密使用的基础框架默认使用填充模式,传来的都是长度为128的密文,当加解密模式不一致时出现乱码也是对的,java填充是从前开始填充,androd是在尾部开始填充,解决方法有两种,第一统一标准,第二中提供一个新的provider

转载于:https://my.oschina.net/Denniswang/blog/678591

你可能感兴趣的:(关于RSA的一些学习心得)