国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
解決Linux操作系統(tǒng)下DES、AES解密失敗的問題
現(xiàn)象描述:

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>



AES修改方式如下:
javax.crypto.BadPaddingException: Given final block not properly padded

       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) 

解決方法:
經(jīng)過檢查之后,定位在生成KEY的方法上,如下:
  1. public static SecretKey getKey (String strKey) {  
  2.          try {           
  3.             KeyGenerator _generator = KeyGenerator.getInstance( "AES" );  
  4.             _generator.init(128new SecureRandom(strKey.getBytes()));  
  5.                 return _generator.generateKey();  
  6.         }  catch (Exception e) {  
  7.              throw new RuntimeException( " 初始化密鑰出現(xiàn)異常 " );  
  8.         }  
  9.       }   
修改到如下方式,問題解決:

  1. public static SecretKey getKey(String strKey) {  
  2.        try {           
  3.           KeyGenerator _generator = KeyGenerator.getInstance( "AES" );  
  4.            SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG" );  
  5.           secureRandom.setSeed(strKey.getBytes());  
  6.           _generator.init(128,secureRandom);  
  7.               return _generator.generateKey();  
  8.       }  catch (Exception e) {  
  9.            throw new RuntimeException( " 初始化密鑰出現(xiàn)異常 " );  
  10.       }  
  11.     }   

原因分析

SecureRandom 實現(xiàn)完全隨操作系統(tǒng)本身的內(nèi)部狀態(tài),除非調(diào)用方在調(diào)用 getInstance 方法之後又調(diào)用了 setSeed 方法;該實現(xiàn)在 windows 上每次生成的 key 都相同,但是在 solaris 或部分 linux 系統(tǒng)上則不同。

原因二:

1、加密完byte[] 后,需要將加密了的byte[] 轉(zhuǎn)換成base64保存,如: 
BASE64Encoder base64encoder = new BASE64Encoder(); 
String encode=base64encoder.encode(bytes); 

2、解密前,需要將加密后的字符串從base64轉(zhuǎn)回來再解密,如: 
BASE64Decoder base64decoder = new BASE64Decoder(); 
byte[] encodeByte = base64decoder.decodeBuffer(str); 

完整例子:

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;  
    
     
}
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
對稱加密+非對稱加密,實現(xiàn)數(shù)據(jù)安全傳輸
Java使用Cipher類實現(xiàn)加密,包括DES,DES3,AES和RSA加密
對稱加密算法---加密學(xué)習(xí)筆記(三)
主題:java 加密解密簡單實現(xiàn)
在線AES加密源碼
【Java安全】關(guān)于Java中常用加密/解密方法的實現(xiàn)
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服