首页 > 代码库 > 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的加密解密的是实现
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。