windows上加解密正常,linux上加密正常,解密時發(fā)生 如下異常:
Des修改方式如下:
1 2 3 4 5 6 7 8 9 10 11 | <span style= "font-family:'Microsoft YaHei';" > public void getKey(String strKey) { try { KeyGenerator _generator = KeyGenerator.getInstance( "DES" ); SecureRandom secureRandom = SecureRandom.getInstance( "SHA1PRNG" ); secureRandom.setSeed(strKey.getBytes()); _generator.init(secureRandom); this .key = _generator.generateKey(); } catch (Exception e) { e.printStackTrace(); } }</span> |
at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)
at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)
at com.sun.crypto.provider.AESCipher.engineDoFinal(DashoA13*..)
at javax.crypto.Cipher.doFinal(DashoA13*..)
at chb.test.crypto.AESUtils.crypt(AESUtils.java:386)
at chb.test.crypto.AESUtils.AesDecrypt(AESUtils.java:254)
at chb.test.crypto.AESUtils.main(AESUtils.java:40)
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 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 | package com.travelsky.tdp.pkgStock.util; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.KeyGenerator; import javax.crypto.NoSuchPaddingException; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; public class SecurityAES { private final static String encoding = "UTF-8" ; /** * AES加密 * * @param content * @param password * @return */ public static String encryptAES(String content, String password) { byte [] encryptResult = encrypt(content, password); String encryptResultStr = parseByte2HexStr(encryptResult); // BASE64位加密 encryptResultStr = ebotongEncrypto(encryptResultStr); return encryptResultStr; } /** * AES解密 * * @param encryptResultStr * @param password * @return */ public static String decrypt(String encryptResultStr, String password) { // BASE64位解密 String decrpt = ebotongDecrypto(encryptResultStr); byte [] decryptFrom = parseHexStr2Byte(decrpt); byte [] decryptResult = decrypt(decryptFrom, password); return new String(decryptResult); } /** * 加密字符串 */ public static String ebotongEncrypto(String str) { BASE64Encoder base64encoder = new BASE64Encoder(); String result = str; if (str != null && str.length() > 0 ) { try { byte [] encodeByte = str.getBytes(encoding); result = base64encoder.encode(encodeByte); } catch (Exception e) { e.printStackTrace(); } } //base64加密超過一定長度會自動換行 需要去除換行符 return result.replaceAll( "\r\n" , "" ).replaceAll( "\r" , "" ).replaceAll( "\n" , "" ); } /** * 解密字符串 */ public static String ebotongDecrypto(String str) { BASE64Decoder base64decoder = new BASE64Decoder(); try { byte [] encodeByte = base64decoder.decodeBuffer(str); return new String(encodeByte); } catch (IOException e) { e.printStackTrace(); return str; } } /** * 加密 * * @param content 需要加密的內(nèi)容 * @param password 加密密碼 * @return */ private static byte [] encrypt(String content, String password) { try { KeyGenerator kgen = KeyGenerator.getInstance( "AES" ); //防止linux下 隨機生成key SecureRandom secureRandom = SecureRandom.getInstance( "SHA1PRNG" ); secureRandom.setSeed(password.getBytes()); kgen.init( 128 , secureRandom); //kgen.init(128, new SecureRandom(password.getBytes())); SecretKey secretKey = kgen.generateKey(); byte [] enCodeFormat = secretKey.getEncoded(); SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES" ); Cipher cipher = Cipher.getInstance( "AES" ); // 創(chuàng)建密碼器 byte [] byteContent = content.getBytes( "utf-8" ); cipher.init(Cipher.ENCRYPT_MODE, key); // 初始化 byte [] result = cipher.doFinal(byteContent); return result; // 加密 } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (NoSuchPaddingException e) { e.printStackTrace(); } catch (InvalidKeyException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IllegalBlockSizeException e) { e.printStackTrace(); } catch (BadPaddingException e) { e.printStackTrace(); } return null ; } /**解密 * @param content 待解密內(nèi)容 * @param password 解密密鑰 * @return */ private static byte [] decrypt( byte [] content, String password) { try { KeyGenerator kgen = KeyGenerator.getInstance( "AES" ); //防止linux下 隨機生成key SecureRandom secureRandom = SecureRandom.getInstance( "SHA1PRNG" ); secureRandom.setSeed(password.getBytes()); kgen.init( 128 , secureRandom); //kgen.init(128, new SecureRandom(password.getBytes())); SecretKey secretKey = kgen.generateKey(); byte [] enCodeFormat = secretKey.getEncoded(); SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES" ); Cipher cipher = Cipher.getInstance( "AES" ); // 創(chuàng)建密碼器 cipher.init(Cipher.DECRYPT_MODE, key); // 初始化 byte [] result = cipher.doFinal(content); return result; // 加密 } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (NoSuchPaddingException e) { e.printStackTrace(); } catch (InvalidKeyException e) { e.printStackTrace(); } catch (IllegalBlockSizeException e) { e.printStackTrace(); } catch (BadPaddingException e) { e.printStackTrace(); } return null ; } /**將二進制轉(zhuǎn)換成16進制 * @param buf * @return */ public static String parseByte2HexStr( byte buf[]) { StringBuffer sb = new StringBuffer(); for ( int i = 0 ; i < buf.length; i++) { String hex = Integer.toHexString(buf[i] & 0xFF ); if (hex.length() == 1 ) { hex = '0' + hex; } sb.append(hex.toUpperCase()); } return sb.toString(); } /**將16進制轉(zhuǎn)換為二進制 * @param hexStr * @return */ public static byte [] parseHexStr2Byte(String hexStr) { if (hexStr.length() < 1 ) return null ; byte [] result = new byte [hexStr.length()/ 2 ]; for ( int i = 0 ;i< hexStr.length()/ 2 ; i++) { int high = Integer.parseInt(hexStr.substring(i* 2 , i* 2 + 1 ), 16 ); int low = Integer.parseInt(hexStr.substring(i* 2 + 1 , i* 2 + 2 ), 16 ); result[i] = ( byte ) (high * 16 + low); } return result; } } |