• rsa加密算法,前后端实现。


    前端js:

      下载地址:http://travistidwell.com/jsencrypt/

    js第一版本:

     1 // 对数据加密
     2     function encrypt(enStr){
     3         //没有加载jsencrypt.js
     4         if(typeof(JSEncrypt) != "function"){
     5             return enStr;
     6         } 
     7         if(!window.rsa){    
     8             window.rsa = new JSEncrypt();
     9             window.rsa.setPublicKey("MIGeMA0GCSqGSIb3DQEBAQUAA4GMADCBiAKBgHz+GrcnJ4w246LUsKeodDYKEQW2tUHvneYETB4/WtCWNJNH9A4NXJOKrF5eXtGB6hWw6DfkBrNawQi13Cok30HGAGOsqNC3TrG+lFH/MdnIFLc0bc4SNKy0aL6h9Og+OnEfqyGe9hBmviVkYVONMwXAM+mkd74ZEEw1rlTodKf9AgMBAAE=");
    10         }
    11         
    12         var result = window.rsa.encrypt(enStr);
    13         // 加密失败返回原数据
    14         if(result === false){
    15             return enStr;
    16         }
    17         return JSON.stringify(result);
    18     }

    ps:经测试发现,rsa最多只能对117个字节进行加密。超过117个字节就会加密失败。

    js第二版本:

    思路:若超过117个字节,就切分开分别进行加密。

     1 // 对数据分段加密
     2     function segmentEncrypt(enStr){
     3         if(typeof(JSEncrypt) === "function"){
     4             if(!window.rsa){    
     5                 window.rsa = new JSEncrypt();
     6                 window.rsa.setPublicKey("MIGeMA0GCSqGSIb3DQEBAQUAA4GMADCBiAKBgHz+GrcnJ4w246LUsKeodDYKEQW2tUHvneYETB4/WtCWNJNH9A4NXJOKrF5eXtGB6hWw6DfkBrNawQi13Cok30HGAGOsqNC3TrG+lFH/MdnIFLc0bc4SNKy0aL6h9Og+OnEfqyGe9hBmviVkYVONMwXAM+mkd74ZEEw1rlTodKf9AgMBAAE=");
     7             }
     8         }else{
     9             return enStr;
    10         } 
    11         
    12         var result = [],
    13             offSet = 0,
    14             cache = '',
    15             i = 1,
    16             inputLen = enStr.length;
    17         
    18         while (inputLen - offSet > 0) {
    19             if (inputLen - offSet > 117) {
    20                 cache = window.rsa.encrypt(enStr.substring(offSet, 117 * i));
    21             } else {
    22                 cache = window.rsa.encrypt(enStr.substring(offSet));
    23             }
    24             // 加密失败返回原数据
    25             if(cache === false){
    26                 return enStr;
    27             }
    28             offSet = i++ * 117;
    29             
    30             result.push(cache);
    31         }
    32         return JSON.stringify(result);
    33     }

    java代码:

      1 package com.test.utils;
      2 
      3 import java.io.ByteArrayOutputStream;
      4 import java.security.Key;
      5 import java.security.KeyFactory;
      6 import java.security.KeyPair;
      7 import java.security.KeyPairGenerator;
      8 import java.security.SecureRandom;
      9 import java.security.interfaces.RSAPrivateKey;
     10 import java.security.interfaces.RSAPublicKey;
     11 import java.security.spec.PKCS8EncodedKeySpec;
     12 import java.security.spec.X509EncodedKeySpec;
     13 import java.util.HashMap;
     14 import java.util.Map;
     15 
     16 import javax.crypto.Cipher;
     17 
     18 import org.apache.commons.codec.binary.Base64;
     19 import org.slf4j.Logger;
     20 import org.slf4j.LoggerFactory;
     21 
     22 public class RSAUtil {
     23     private static Logger logger = LoggerFactory.getLogger(RSAUtil.class);    //日志记录
     24     private static final String KEY_ALGORITHM = "RSA";
     25     
     26     //临时使用
     27     public static final String RSA_PUB_KEY = "MIGeMA0GCSqGSIb3DQEBAQUAA4GMADCBiAKBgHz+GrcnJ4w246LUsKeodDYKEQW2
     28 tUHvneYETB4/WtCWNJNH9A4NXJOKrF5eXtGB6hWw6DfkBrNawQi13Cok30HGAGOs
     29 qNC3TrG+lFH/MdnIFLc0bc4SNKy0aL6h9Og+OnEfqyGe9hBmviVkYVONMwXAM+mk
     30 d74ZEEw1rlTodKf9AgMBAAE=";
     31     public static final String RSA_PRI_KEY = "MIICWgIBAAKBgHz+GrcnJ4w246LUsKeodDYKEQW2tUHvneYETB4/WtCWNJNH9A4N
     32 XJOKrF5eXtGB6hWw6DfkBrNawQi13Cok30HGAGOsqNC3TrG+lFH/MdnIFLc0bc4S
     33 NKy0aL6h9Og+OnEfqyGe9hBmviVkYVONMwXAM+mkd74ZEEw1rlTodKf9AgMBAAEC
     34 gYAv3vJEa06OOQd9+Y+e5rl7aOeUFKHfGvKSgdrVStZxRNXmAozKRPvL1jSl/+a4
     35 vtT0cci+fyrBzmRX/a7QxUZr1ROryeqv/DLnz8b1fXbIIXfO0MiNniytG0qzEHda
     36 Vxof3reibaHLCL6wM266qgTVd2FMo8igATUgWvpMS/xuAQJBAMBcyxa/Vv496Fq7
     37 ynvuXWIzdCJSYBe9CFjICgOeHLrz+9d66GiHfjkgU/RygUhLbgA1ogEsx+/4LshV
     38 t3Tt02ECQQCmV771jice594L8PQmfSgHEZpzk8F2LkGB8BznVzcRpr/EtI6Bfux5
     39 +HWAGW7CEwvv5r1oPzbYd9lggkanNXYdAkBvBd+NTHfoG1D89T/jkWrCX9IacRLX
     40 AJpNq37kIaCRYnorHtv+YJ1AWWE7R89IK4jchBfxt6fZ35MYuyg8S3thAkAZSPlE
     41 Bkm4DvLXydazCw9Mk8ZwjyM3PazDfaZHHCDI1BoOYovO72Yu3C+wOy103sRPwTlF
     42 YWaK3Rzz6JmozR2ZAkBQsQhOXafSG1cGGx43mSzSAtBD1kfQAD2YVvR4B9NtOoWc
     43 6Zyxf+Ek2P21ZIEWihTCM7XS9BYkJWHvcyun7Xeb";
     44     
     45     //map 键名
     46     public static final String PUBLIC_KEY = "RSAPublicKey";
     47     public static final String PRIVATE_KEY = "RSAPrivateKey";
     48 
     49     
     50     /**
     51      * 初始化密钥
     52      * @return
     53      */
     54     public static Map<String, String> initKey() {
     55         Map<String, String> map = new HashMap<String, String>();
     56         try {
     57             // 随机生成密钥对
     58             KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM);
     59             
     60             // 按照指定字符串生成密钥对
     61             keyPairGen.initialize(1024, new SecureRandom());
     62 
     63             KeyPair keyPair = keyPairGen.generateKeyPair();
     64             
     65             // 公钥
     66             RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
     67             String pubkey = new String(Base64.encodeBase64(publicKey.getEncoded()));
     68 
     69             // 私钥
     70             RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
     71             String prikey = new String(Base64.encodeBase64(privateKey.getEncoded()));
     72             
     73             map.put(PUBLIC_KEY, pubkey);
     74             map.put(PRIVATE_KEY, prikey);
     75         } catch (Exception e) {
     76             logger.error("生成秘钥失败", e);
     77         }
     78         return map;
     79     }
     80     /**
     81      * 公钥加密
     82      * 
     83      * @param data
     84      * @param key
     85      * @return
     86      */
     87     public static String encryptByPublicKey(String data, String key) {
     88         try {
     89             // 取得公钥
     90             X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(Base64.decodeBase64(key));
     91             KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
     92             Key publicKey = keyFactory.generatePublic(x509KeySpec);
     93 
     94             Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
     95             cipher.init(Cipher.ENCRYPT_MODE, publicKey);
     96 
     97             byte[] encryptedData = data.getBytes("utf-8");
     98             int inputLen = encryptedData.length;
     99             ByteArrayOutputStream out = new ByteArrayOutputStream();
    100             int offSet = 0;
    101             byte[] cache;
    102             int i = 0;
    103             // 对数据分段加密
    104             while (inputLen - offSet > 0) {
    105                 if (inputLen - offSet > 117) {
    106                     cache = cipher.doFinal(encryptedData, offSet, 117);
    107                 } else {
    108                     cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet);
    109                 }
    110                 out.write(cache, 0, cache.length);
    111                 i++;
    112                 offSet = i * 117;
    113             }
    114             byte[] decryptedData = out.toByteArray();
    115             out.close();
    116             
    117             return new String(Base64.encodeBase64(decryptedData));
    118         } catch (Exception e) {
    119              logger.error("公钥加密异常!", e);
    120         }
    121         return data;
    122     }
    123     
    124     /**
    125      * 私钥解密
    126      * 
    127      * @param data
    128      * @param key
    129      * @return
    130      */
    131     public static String decryptByPrivateKey(String data, String key) {
    132         try {
    133             // 对密钥解密
    134             byte[] keyBytes = Base64.decodeBase64(key);
    135 
    136             // 取得私钥
    137             PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
    138             KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
    139             Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
    140 
    141             Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
    142             cipher.init(Cipher.DECRYPT_MODE, privateKey);
    143 
    144             byte[] encryptedData = Base64.decodeBase64(data);
    145 
    146             int inputLen = encryptedData.length;
    147             ByteArrayOutputStream out = new ByteArrayOutputStream();
    148             int offSet = 0;
    149             byte[] cache;
    150             int i = 0;
    151             // 对数据分段解密
    152             while (inputLen - offSet > 0) {
    153                 if (inputLen - offSet > 128) {
    154                     cache = cipher.doFinal(encryptedData, offSet, 128);
    155                 } else {
    156                     cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet);
    157                 }
    158                 out.write(cache, 0, cache.length);
    159                 i++;
    160                 offSet = i * 128;
    161             }
    162             byte[] decryptedData = out.toByteArray();
    163             out.close();
    164 
    165             return new String(decryptedData, "utf-8");
    166 
    167         } catch (Exception e) {
    168             logger.error("私钥解密异常", e);
    169         }
    170         return data;
    171     }
    172 }

      

  • 相关阅读:
    VB.NET 操作16进制文件
    MATLAB串口通信与实时数据处理
    matlab中 @文件夹名/+文件夹名 的含义
    C#中的换行符、回车
    利用monkeyrunner给Android屏幕连续截图的小程序
    设计模式之结构型模式
    《设计模式》读书笔记(一)
    开发Android小应用——短信控制的浮动窗
    《重构》读书笔记(一)
    设计模式之行为模式
  • 原文地址:https://www.cnblogs.com/daixiaotian/p/7305242.html
Copyright © 2020-2023  润新知