首页 > 代码库 > RSA AES 前端JS与后台JAVA的加密解密的是实现

RSA AES 前端JS与后台JAVA的加密解密的是实现

 

 

AES CryptoJS 
前提是编码方式,key,vi中设置一样,就可以进行跨语言加密解密

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<link rel="stylesheet" href="http://www.mamicode.com//css/login.css">
 
<script  src="http://www.mamicode.com/jslib/jquery-1.8.3.js" type="text/javascript" ></script>
<script  src="http://www.mamicode.com/jslib/Common.js" type="text/javascript" ></script>
<script  src="http://www.mamicode.com/jslib/core-min.js" type="text/javascript" ></script>
<script  src="http://www.mamicode.com/jslib/aes.js" type="text/javascript" ></script>
</head>
<body>
<form action="<%=basePath %>login?action=goAES" id="login" name="form" method="post">
    <h1>Log In</h1>
    <fieldset   id="inputs">
        <input  id="name"  type="text" placeholder="Username" value="" autofocus required>
        <!-- ming -->
        <input  id="pwd" name="pwd" type="password" placeholder="Password" value=""  required>
    </fieldset>
    <fieldset id="actions">
        <input type="button" id="button" onclick="go()"  value="http://www.mamicode.com/登 录">
        <a href="http://www.mamicode.com/#" id="msg"></a>
    </fieldset>
    <input type="hidden" name="key" id="key">
    <!-- 密钥 -->
    <input type="hidden" id="msg_source" value="http://www.mamicode.com/0807060504030201">
</form>
 
<script type="text/javascript">
     
    function go(){
         
        if(isEmptyById([‘name‘,‘pwd‘])){
            $(‘#msg‘).text(‘用户名或密码不能为空‘);
            return;
        }
         
        //var pwd = $("#pwd").val();
        //console.info("加密前  : "+pwd); 
        //CryptoJS.AES.encrypt(‘明文‘,‘key‘);
        //var ecodeRestult = CryptoJS.AES.encrypt($("#pwd").val(),$("#msg_source").val());
        //console.info("加密后  :"+ecodeRestult);
        //$("#pwd").val(ecodeRestult);
        //CryptoJS.AES.decrypt(‘密文‘,‘key‘).toString(CryptoJS.enc.Utf8);
        //var decodeResult = CryptoJS.AES.decrypt(ecodeRestult,$("#msg_source").val()).toString(CryptoJS.enc.Utf8);
        //console.info("解密后  :"+decodeResult);
 
        var pwd = $("#pwd").val();
        var key  = CryptoJS.enc.Utf8.parse($("#msg_source").val());  
        var iv   = CryptoJS.enc.Utf8.parse($("#msg_source").val());  
        var srcs = CryptoJS.enc.Utf8.parse(pwd); 
        var encrypted = CryptoJS.AES.encrypt(srcs, key, { iv: iv,mode:CryptoJS.mode.CBC}); 
        $("#pwd").val(encrypted);
        $(‘#login‘).submit();
    }
     
     
 
</script>

这里需要注意的是$("#msg_source").val();  因为key是动态的,需要从服务器提前设置好,前端AES JS加密指定是CryptoJS.mode.CBC模式,那么Java解密的同时也必须用这个模式来解密,不然会报错Given final block not properly padded...异常
AES--Java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
package org.common.kit;
 
import org.apache.log4j.Logger;
 
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
 
import org.apache.commons.codec.binary.Base64;
 
public class AESKit {
    /**
     * Logger for this class
     */
    private static final Logger logger = Logger.getLogger(AESKit.class);
     
    public static final String IV = "0807060504030201";
     
    /*******************************************************************
     * AES加密算法
     * @author moyun
     * 加密用的Key 可以用26个字母和数字组成,最好不要用保留字符,虽然不会错,至于怎么裁决,个人看情况而定    此处使用AES-128-CBC加密模式,key需要为16位。
     * */
 
    //加密
    public static String Encrypt(String sSrc, String sKey) throws Exception {
 
        if (sKey == null) {
            System.out.print("Key为空null");
            return null;
        }
        // 判断Key是否为16位
        if (sKey.length() != 16) {
            System.out.print("Key长度不是16位");
            return null;
        }
        byte[] raw = sKey.getBytes();
         
        SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");   
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");//"算法/模式/补码方式"   
        IvParameterSpec iv = new IvParameterSpec(IV.getBytes());//使用CBC模式,需要一个向量iv,可增加加密算法的强度   
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);   
        byte[] encrypted = cipher.doFinal(sSrc.getBytes()); 
         
        return Base64.encodeBase64String(encrypted);//此处使用BAES64做转码功能,同时能起到2次
    }
 
     
    //解密
    public static String Decrypt(String sSrc, String sKey) throws Exception { 
         
        // 判断Key是否正确   
        if (sKey == null) {   
            System.out.print("Key为空null");   
            return null;   
        }   
        // 判断Key是否为16位   
        if (sKey.length() != 16) {   
            System.out.print("Key长度不是16位");   
            return null;   
        }   
        byte[] raw = sKey.getBytes("ASCII");
         
        SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");   
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");   
        IvParameterSpec iv = new IvParameterSpec(IV.getBytes());   
        cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);   
        byte[] encrypted1 = Base64.decodeBase64(sSrc);//先用bAES64解密  
        try {   
            byte[] original = cipher.doFinal(encrypted1);   
            String originalString = new String(original);   
            return originalString;   
        catch (Exception e) {   
            logger.info(e.toString());
            return null;   
        }   
    }
     
    public static void main(String[] args) throws Exception {
         
        String pwd = "世界你好";
        String epwd = Encrypt(pwd, "abcdefghijkmlnsf");
        System.out.println(epwd);
        System.out.println(Decrypt(epwd, "abcdefghijkmlnsf"));
    }
     
}

  


RSA RSAUtils js

 1 <link rel="stylesheet" href="http://www.mamicode.com//css/login.css"> 2 <script src="http://www.mamicode.com/jslib/security.js" type="text/javascript"></script> 3 <script src="http://www.mamicode.com/jslib/jquery-1.8.3.js" type="text/javascript" ></script> 4 <script src="http://www.mamicode.com/jslib/Common.js" type="text/javascript" ></script> 5 </head> 6 <body> 7  8 <form action="<%=basePath %>login?action=go" id="login" name="form" method="post"> 9     <h1>Log In</h1>10     <fieldset   id="inputs">11         <input  id="name" type="text" placeholder="Username" value="" autofocus required>12         <input  id="pwd"  type="password" placeholder="Password" value=""  required>13     </fieldset>14     <fieldset id="actions">15         <input type="button" id="button" onclick="go()"  value="http://www.mamicode.com/登 录">16         <a href="http://www.mamicode.com/#" id="msg"></a> 17     </fieldset>18     <input type="hidden" name="modulus" id="hid_modulus" value="http://www.mamicode.com/${modulus }">19     <input type="hidden" name="exponent" id="hid_exponent" value="http://www.mamicode.com/${exponent }">20     <input type="hidden" name="key" id="key">21 </form>22 23 <script type="text/javascript">24     25     function go(){26         27         if(isEmptyById([‘name‘,‘pwd‘])){28             $(‘#msg‘).text(‘用户名或密码不能为空‘);29              return;30         }31         var modulus = $(‘#hid_modulus‘).val(), exponent = $(‘#hid_exponent‘).val();32         var key = RSAUtils.getKeyPair(exponent, ‘‘, modulus);33         var key2="name="+$(‘#name‘).val()+"&pwd="+$(‘#pwd‘).val();34         $(‘#key‘).val(RSAUtils.encryptedString(key, key2));35         $(‘#login‘).submit();36     }37 </script>
  1 package org.common.kit;  2   3 import java.io.File;  4 import java.io.FileInputStream;  5 import java.io.FileOutputStream;  6 import java.io.ObjectInputStream;  7 import java.io.ObjectOutputStream;  8 import java.math.BigInteger;  9 import java.security.InvalidParameterException; 10 import java.security.KeyFactory; 11 import java.security.KeyPair; 12 import java.security.KeyPairGenerator; 13 import java.security.NoSuchAlgorithmException; 14 import java.security.PrivateKey; 15 import java.security.Provider; 16 import java.security.PublicKey; 17 import java.security.SecureRandom; 18 import java.security.interfaces.RSAPrivateKey; 19 import java.security.interfaces.RSAPublicKey; 20 import java.security.spec.InvalidKeySpecException; 21 import java.security.spec.RSAPrivateKeySpec; 22 import java.security.spec.RSAPublicKeySpec; 23 import java.util.Date; 24  25 import javax.crypto.Cipher; 26  27 import org.apache.commons.codec.DecoderException; 28 import org.apache.commons.codec.binary.Hex; 29 import org.apache.commons.io.FileUtils; 30 import org.apache.commons.io.IOUtils; 31 import org.apache.commons.lang3.StringUtils; 32 import org.apache.commons.lang3.time.DateFormatUtils; 33 import org.apache.log4j.Logger; 34 import org.bouncycastle.jce.provider.BouncyCastleProvider; 35  36 public abstract class RSA 37 { 38  39     private static final Logger LOGGER = Logger.getLogger(RSA.class); 40      41     private static final String ALGORITHOM = "RSA"; 42     private static final String RSA_PAIR_FILENAME = "/__RSA_PAIR.txt"; 43     private static final int KEY_SIZE = 1024; 44     private static final Provider DEFAULT_PROVIDER = new BouncyCastleProvider(); 45  46     private static KeyPairGenerator keyPairGen = null; 47     private static KeyFactory keyFactory = null; 48  49     private static KeyPair oneKeyPair = null; 50  51     private static File rsaPairFile = null; 52      53     static 54     { 55         try 56         { 57             keyPairGen = KeyPairGenerator.getInstance("RSA", DEFAULT_PROVIDER); 58             keyFactory = KeyFactory.getInstance("RSA", DEFAULT_PROVIDER); 59         } catch (NoSuchAlgorithmException ex) 60         { 61             LOGGER.error(ex.getMessage()); 62         } 63         rsaPairFile = new File(getRSAPairFilePath()); 64     } 65  66     /*** 67      *  68      * 返回 解码后的 username pwd 69      *  70      * add by 12 71      *  72      * @param key 73      * @return 74      */ 75     public static String[] decryptUsernameAndPwd(String key) 76     { 77  78         key = RSA.decryptStringByJs(key); 79  80         try 81         { 82             String username = key.substring(key.indexOf("=") + 1, key.indexOf("&")); 83             String pwd = key.substring(key.lastIndexOf("=") + 1, key.length()); 84             return new String[] { username, pwd }; 85         } catch (Exception e) 86         { 87             return null; 88         } 89  90     } 91  92     private static synchronized KeyPair generateKeyPair() 93     { 94         try 95         { 96             keyPairGen.initialize(1024, new SecureRandom(DateFormatUtils.format(new Date(), "yyyyMMdd").getBytes())); 97             oneKeyPair = keyPairGen.generateKeyPair(); 98             saveKeyPair(oneKeyPair); 99             return oneKeyPair;100         } catch (InvalidParameterException ex)101         {102             LOGGER.error("KeyPairGenerator does not support a key length of 1024.", ex);103         } catch (NullPointerException ex)104         {105             LOGGER.error("RSAUtils#KEY_PAIR_GEN is null, can not generate KeyPairGenerator instance.", ex);106         }107         return null;108     }109 110     private static String getRSAPairFilePath()111     {112         String urlPath = RSA.class.getResource("/").getPath();113         String str = new File(urlPath).getParent() + "/__RSA_PAIR.txt";114 115         urlPath = null;116 117         return str;118     }119 120     private static boolean isCreateKeyPairFile()121     {122         boolean createNewKeyPair = false;123         if ((!rsaPairFile.exists()) || (rsaPairFile.isDirectory()))124         {125             createNewKeyPair = true;126         }127         return createNewKeyPair;128     }129 130     private static void saveKeyPair(KeyPair keyPair)131     {132         FileOutputStream fos = null;133         ObjectOutputStream oos = null;134         try135         {136             fos = FileUtils.openOutputStream(rsaPairFile);137             oos = new ObjectOutputStream(fos);138             oos.writeObject(keyPair);139         } catch (Exception ex)140         {141             ex.printStackTrace();142         } finally143         {144             IOUtils.closeQuietly(oos);145             IOUtils.closeQuietly(fos);146         }147 148         fos = null;149         oos = null;150     }151 152     public static KeyPair getKeyPair()153     {154         if (isCreateKeyPairFile()) { return generateKeyPair(); }155         if (oneKeyPair != null) { return oneKeyPair; }156         return readKeyPair();157     }158 159     private static KeyPair readKeyPair()160     {161         FileInputStream fis = null;162         ObjectInputStream ois = null;163         try164         {165             fis = FileUtils.openInputStream(rsaPairFile);166             ois = new ObjectInputStream(fis);167             oneKeyPair = (KeyPair) ois.readObject();168             return oneKeyPair;169         } catch (Exception ex)170         {171             ex.printStackTrace();172         } finally173         {174             IOUtils.closeQuietly(ois);175             IOUtils.closeQuietly(fis);176         }177 178         fis = null;179         ois = null;180         return null;181     }182 183     public static RSAPublicKey generateRSAPublicKey(byte[] modulus, byte[] publicExponent)184     {185         RSAPublicKeySpec publicKeySpec = new RSAPublicKeySpec(new BigInteger(modulus), new BigInteger(publicExponent));186         try187         {188             return (RSAPublicKey) keyFactory.generatePublic(publicKeySpec);189         } catch (InvalidKeySpecException ex)190         {191             LOGGER.error("RSAPublicKeySpec is unavailable.", ex);192         } catch (NullPointerException ex)193         {194             LOGGER.error("RSAUtils#KEY_FACTORY is null, can not generate KeyFactory instance.", ex);195         }196         publicKeySpec = null;197         modulus = (byte[]) null;198         publicExponent = (byte[]) null;199         return null;200     }201 202     public static RSAPrivateKey generateRSAPrivateKey(byte[] modulus, byte[] privateExponent)203     {204         RSAPrivateKeySpec privateKeySpec = new RSAPrivateKeySpec(new BigInteger(modulus), new BigInteger(privateExponent));205         try206         {207             return (RSAPrivateKey) keyFactory.generatePrivate(privateKeySpec);208         } catch (InvalidKeySpecException ex)209         {210             LOGGER.error("RSAPrivateKeySpec is unavailable.", ex);211         } catch (NullPointerException ex)212         {213             LOGGER.error("RSAUtils#KEY_FACTORY is null, can not generate KeyFactory instance.", ex);214         }215         privateKeySpec = null;216         modulus = (byte[]) null;217         privateExponent = (byte[]) null;218         return null;219     }220 221     public static RSAPrivateKey getRSAPrivateKey(String hexModulus, String hexPrivateExponent)222     {223         if ((StringUtils.isBlank(hexModulus)) || (StringUtils.isBlank(hexPrivateExponent)))224         {225             if (LOGGER.isDebugEnabled())226             {227                 LOGGER.debug("hexModulus and hexPrivateExponent cannot be empty. RSAPrivateKey value is null to return.");228             }229             return null;230         }231         byte[] modulus = (byte[]) null;232         byte[] privateExponent = (byte[]) null;233         try234         {235             modulus = Hex.decodeHex(hexModulus.toCharArray());236             privateExponent = Hex.decodeHex(hexPrivateExponent.toCharArray());237         } catch (DecoderException ex)238         {239             LOGGER.error("hexModulus or hexPrivateExponent value is invalid. return null(RSAPrivateKey).");240         }241         if ((modulus != null) && (privateExponent != null)) { return generateRSAPrivateKey(modulus, privateExponent); }242         return null;243     }244 245     public static RSAPublicKey getRSAPublidKey(String hexModulus, String hexPublicExponent)246     {247         if ((StringUtils.isBlank(hexModulus)) || (StringUtils.isBlank(hexPublicExponent)))248         {249             if (LOGGER.isDebugEnabled())250             {251                 LOGGER.debug("hexModulus and hexPublicExponent cannot be empty. return null(RSAPublicKey).");252             }253             return null;254         }255         byte[] modulus = (byte[]) null;256         byte[] publicExponent = (byte[]) null;257         try258         {259             modulus = Hex.decodeHex(hexModulus.toCharArray());260             publicExponent = Hex.decodeHex(hexPublicExponent.toCharArray());261         } catch (DecoderException ex)262         {263             LOGGER.error("hexModulus or hexPublicExponent value is invalid. return null(RSAPublicKey).");264         }265         if ((modulus != null) && (publicExponent != null)) { return generateRSAPublicKey(modulus, publicExponent); }266         return null;267     }268 269     public static byte[] encrypt(PublicKey publicKey, byte[] data) throws Exception270     {271         Cipher ci = Cipher.getInstance("RSA", DEFAULT_PROVIDER);272         ci.init(1, publicKey);273         return ci.doFinal(data);274     }275 276     public static byte[] decrypt(PrivateKey privateKey, byte[] data) throws Exception277     {278         Cipher ci = Cipher.getInstance("RSA", DEFAULT_PROVIDER);279         ci.init(2, privateKey);280         return ci.doFinal(data);281     }282 283     public static String encryptString(PublicKey publicKey, String plaintext)284     {285         if ((publicKey == null) || (plaintext == null)) { return null; }286         byte[] data = http://www.mamicode.com/plaintext.getBytes();"keyPair cannot be null.");310         } catch (Exception ex)311         {312             LOGGER.error(ex.getCause().getMessage());313         }314         return null;315     }316 317     public static String decryptString(PrivateKey privateKey, String encrypttext)318     {319         if ((privateKey == null) || (StringUtils.isBlank(encrypttext))) return null;320         try321         {322             byte[] en_data = http://www.mamicode.com/Hex.decodeHex(encrypttext.toCharArray());"\"%s\" Decryption failed. Cause: %s", new Object[] { encrypttext, ex.getCause().getMessage() }));328         }329         return null;330     }331 332     public static String decryptString(String encrypttext)333     {334         if (StringUtils.isBlank(encrypttext)) { return null; }335         KeyPair keyPair = getKeyPair();336         try337         {338             byte[] en_data = http://www.mamicode.com/Hex.decodeHex(encrypttext.toCharArray());"keyPair cannot be null.");344         } catch (Exception ex)345         {346             LOGGER.error(String.format("\"%s\" Decryption failed. Cause: %s", new Object[] { encrypttext, ex.getMessage() }));347         }348         return null;349     }350 351     public static String decryptStringByJs(String encrypttext)352     {353         String text = decryptString(encrypttext);354         if (text == null) { return null; }355         return StringUtils.reverse(text);356     }357 358     public static RSAPublicKey getDefaultPublicKey()359     {360         KeyPair keyPair = getKeyPair();361         if (keyPair != null) { return (RSAPublicKey) keyPair.getPublic(); }362         return null;363     }364 365     public static RSAPrivateKey getDefaultPrivateKey()366     {367         KeyPair keyPair = getKeyPair();368         if (keyPair != null) { return (RSAPrivateKey) keyPair.getPrivate(); }369         return null;370     }371 }

 

RSA AES 前端JS与后台JAVA的加密解密的是实现