導航:首頁 > 文檔加密 > 3des加密

3des加密

發布時間:2022-01-25 02:54:20

㈠ [高分]求關於java的3des加密的bug解決辦法,要求能用16位key並且不讓加密後長度多8個位元組;

在java中調用sun公司提供的3DES加密解密演算法時,需要使用到$JAVA_HOME/jre/lib/目錄下如下的4個jar包:
jce.jar
security/US_export_policy.jar
security/local_policy.jar
ext/sunjce_provider.jar
Java運行時會自動載入這些包,因此對於帶main函數的應用程序不需要設置到CLASSPATH環境變數中。對於WEB應用,不需要把這些包加到WEB-INF/lib目錄下。
以下是java中調用sun公司提供的3DES加密解密演算法的樣本代碼:
加密解密代碼
import java.security.Security;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
/*字元串 DESede(3DES) 加密*/
public class ThreeDes {
/**
* @param args在java中調用sun公司提供的3DES加密解密演算法時,需要使
* 用到$JAVA_HOME/jre/lib/目錄下如下的4個jar包:
*jce.jar
*security/US_export_policy.jar
*security/local_policy.jar
*ext/sunjce_provider.jar
*/
private static final String Algorithm ="DESede"; //定義加密演算法,可用 DES,DESede,Blowfish
//keybyte為加密密鑰,長度為24位元組
//src為被加密的數據緩沖區(源)
public static byte[] encryptMode(byte[] keybyte,byte[] src){
try {
//生成密鑰
SecretKey deskey = new SecretKeySpec(keybyte, Algorithm);
//加密
Cipher c1 = Cipher.getInstance(Algorithm);
c1.init(Cipher.ENCRYPT_MODE, deskey);
return c1.doFinal(src);//在單一方面的加密或解密
} catch (java.security.NoSuchAlgorithmException e1) {
// TODO: handle exception
e1.printStackTrace();
}catch(javax.crypto.NoSuchPaddingException e2){
e2.printStackTrace();
}catch(java.lang.Exception e3){
e3.printStackTrace();
}
return null;
}
//keybyte為加密密鑰,長度為24位元組
//src為加密後的緩沖區
public static byte[] decryptMode(byte[] keybyte,byte[] src){
try {
//生成密鑰
SecretKey deskey = new SecretKeySpec(keybyte, Algorithm);
//解密
Cipher c1 = Cipher.getInstance(Algorithm);
c1.init(Cipher.DECRYPT_MODE, deskey);
return c1.doFinal(src);
} catch (java.security.NoSuchAlgorithmException e1) {
// TODO: handle exception
e1.printStackTrace();
}catch(javax.crypto.NoSuchPaddingException e2){
e2.printStackTrace();
}catch(java.lang.Exception e3){
e3.printStackTrace();
}
return null;
}
//轉換成十六進制字元串
public static String byte2Hex(byte[] b){
String hs="";
String stmp="";
for(int n=0; n<b.length; n++){
stmp = (java.lang.Integer.toHexString(b[n]& 0XFF));
if(stmp.length()==1){
hs = hs + "0" + stmp;
}else{
hs = hs + stmp;
}
if(n<b.length-1)hs=hs+":";
}
return hs.toUpperCase();
}
public static void main(String[] args) {
// TODO Auto-generated method stub
//添加新安全演算法,如果用JCE就要把它添加進去
Security.addProvider(new com.sun.crypto.provider.SunJCE());
final byte[] keyBytes = {0x11, 0x22, 0x4F, 0x58,
(byte)0x88, 0x10, 0x40, 0x38, 0x28, 0x25, 0x79,0x51,
(byte)0xCB,
(byte)0xDD, 0x55, 0x66, 0x77, 0x29, 0x74,
(byte)0x98, 0x30, 0x40, 0x36,
(byte)0xE2
}; //24位元組的密鑰
String szSrc = "This is a 3DES test. 測試";
System.out.println("加密前的字元串:" + szSrc);
byte[] encoded = encryptMode(keyBytes,szSrc.getBytes());
System.out.println("加密後的字元串:" + new String(encoded));
byte[] srcBytes = decryptMode(keyBytes,encoded);
System.out.println("解密後的字元串:" + (new String(srcBytes)));
}
}

㈡ 3DES的加密過程

3DES加密過程為:C=Ek3(Dk2(Ek1(P)))
3DES解密過程為:P=Dk1(EK2(Dk3(C)))
具體的加/解密過程如圖所示。
using System;
using System.Text;
using System. IO;
using System.Security.Cryptography;
class Class1
{
static void Main()
{
Console.WriteLine(Encrypt String...);
txtKey = tkGGRmBErvc=;
btnKeyGen();
Console.WriteLine(Encrypt Key :{0},txtKey);
txtIV = Kl7ZgtM1dvQ=;
btnIVGen();
Console.WriteLine(Encrypt IV :{0},txtIV);
Console.WriteLine();
string txtEncrypted = EncryptString(1111);
Console.WriteLine(Encrypt String : {0},txtEncrypted);
string txtOriginal = DecryptString(txtEncrypted);
Console.WriteLine(Decrypt String : {0},txtOriginal);
}
private static SymmetricAlgorithm mCSP;
private static string txtKey;
private static string txtIV;
private static void btnKeyGen()
{
mCSP = SetEnc();
byte[] byt2 = Convert.FromBase64String(txtKey);
mCSP.Key = byt2;
}
private static void btnIVGen()
{
byte[] byt2 = Convert.FromBase64String(txtIV);
mCSP.IV = byt2;
}
private static string EncryptString(string Value)
{
ICryptoTransform ct;
MemoryStream ms;
CryptoStream cs;
byte[] byt;
ct = mCSP.CreateEncryptor(mCSP.Key, mCSP.IV);
byt = Encoding.UTF8.GetBytes(Value);
ms = new MemoryStream();
cs = new CryptoStream(ms, ct, CryptoStreamMode.Write);
cs.Write(byt, 0, byt.Length);
cs.FlushFinalBlock();
cs.Close();
return Convert.ToBase64String(ms.ToArray());
}
private static string DecryptString(string Value)
{
ICryptoTransform ct;
MemoryStream ms;
CryptoStream cs;
byte[] byt;
ct = mCSP.CreateDecryptor(mCSP.Key, mCSP.IV);
byt = Convert.FromBase64String(Value);
ms = new MemoryStream();
cs = new CryptoStream(ms, ct, CryptoStreamMode.Write);
cs.Write(byt, 0, byt.Length);
cs.FlushFinalBlock();
cs.Close();
return Encoding.UTF8.GetString(ms.ToArray());
}
private static SymmetricAlgorithm SetEnc()
{
return new DESCryptoServiceProvider();
}
}
K1、K2、K3決定了演算法的安全性,若三個密鑰互不相同,本質上就相當於用一個長為168位的密鑰進行加密。多年來,它在對付強力攻擊時是比較安全的。若數據對安全性要求不那麼高,K1可以等於K3。在這種情況下,密鑰的有效長度為112位。

㈢ 什麼是3DES對稱加密演算法

DES加密經過下面的步驟
1、提供明文和密鑰,將明文按照64bit分塊(對應8個位元組),不足8個位元組的可以進行填充(填充方式多種),密鑰必須為8個位元組共64bit
填充方式:

當明文長度不為分組長度的整數倍時,需要在最後一個分組中填充一些數據使其湊滿一個分組長度。
* NoPadding
API或演算法本身不對數據進行處理,加密數據由加密雙方約定填補演算法。例如若對字元串數據進行加解密,可以補充\0或者空格,然後trim

* PKCS5Padding
加密前:數據位元組長度對8取余,余數為m,若m>0,則補足8-m個位元組,位元組數值為8-m,即差幾個位元組就補幾個位元組,位元組數值即為補充的位元組數,若為0則補充8個位元組的8
解密後:取最後一個位元組,值為m,則從數據尾部刪除m個位元組,剩餘數據即為加密前的原文。
例如:加密字元串為為AAA,則補位為AAA55555;加密字元串為BBBBBB,則補位為BBBBBB22;加密字元串為CCCCCCCC,則補位為CCCCCCCC88888888。

* PKCS7Padding
PKCS7Padding 的填充方式和PKCS5Padding 填充方式一樣。只是加密塊的位元組數不同。PKCS5Padding明確定義了加密塊是8位元組,PKCS7Padding加密快可以是1-255之間。
2、選擇加密模式

**ECB模式** 全稱Electronic Codebook模式,譯為電子密碼本模式
**CBC模式** 全稱Cipher Block Chaining模式,譯為密文分組鏈接模式
**CFB模式** 全稱Cipher FeedBack模式,譯為密文反饋模式
**OFB模式** 全稱Output Feedback模式,譯為輸出反饋模式。
**CTR模式** 全稱Counter模式,譯為計數器模式。
3、開始加密明文(內部原理--加密步驟,加密演算法實現不做講解)

image
1、將分塊的64bit一組組加密,示列其中一組:將此組進行初始置換(IP置換),目的是將輸入的64位數據塊按位重新組合,並把輸出分為L0、R0兩部分,每部分各長32位。
2、開始Feistel結構的16次轉換,第一次轉換為:右側數據R0和子密鑰經過輪函數f生成用於加密左側數據的比特序列,與左側數據L0異或運算,
運算結果輸出為加密後的左側L0,右側數據則直接輸出為右側R0。由於一次Feistel輪並不會加密右側,因此需要將上一輪輸出後的左右兩側對調後才正式完成一次Feistel加密,
3、DES演算法共計進行16次Feistel輪,最後一輪輸出後左右兩側無需對調,每次加密的子密鑰不相同,子密鑰是通過秘鑰計算得到的。
4、末置換是初始置換的逆過程,DES最後一輪後,左、右兩半部分並未進行交換,而是兩部分合並形成一個分組做為末置換的輸入
DES解密經過下面的步驟
1、拿到密文和加密的密鑰
2、解密:DES加密和解密的過程一致,均使用Feistel網路實現,區別僅在於解密時,密文作為輸入,並逆序使用子密鑰。
3、講解密後的明文去填充 (padding)得到的即為明文
Golang實現DES加密解密
package main

import (
"fmt"
"crypto/des"
"bytes"
"crypto/cipher"
)

func main() {
var miwen,_= DESEncode([]byte("hello world"),[]byte("12345678"))
fmt.Println(miwen) // [11 42 146 232 31 180 156 225 164 50 102 170 202 234 123 129],密文:最後5位是補碼
var txt,_ = DESDecode(miwen,[]byte("12345678"))
fmt.Println(txt) // [104 101 108 108 111 32 119 111 114 108 100]明碼
fmt.Printf("%s",txt) // hello world
}
// 加密函數
func DESEncode(orignData, key []byte)([]byte,error){

// 建立密碼塊
block ,err:=des.NewCipher(key)
if err!=nil{ return nil,err}

// 明文分組,不足的部分加padding
txt := PKCS5Padding(orignData,block.BlockSize())

// 設定加密模式,為了方便,初始向量直接使用key充當了(實際項目中,最好別這么做)
blockMode := cipher.NewCBCEncrypter(block,key)

// 創建密文長度的切片,用來存放密文位元組
crypted :=make([]byte,len(txt))

// 開始加密,將txt作為源,crypted作為目的切片輸入
blockMode.CryptBlocks(crypted,txt)

// 將加密後的切片返回
return crypted,nil
}
// 加密所需padding
func PKCS5Padding(ciphertext []byte,size int)[]byte{
padding := size - len(ciphertext)%size
padTex := bytes.Repeat([]byte{byte(padding)},padding)
return append(ciphertext,padTex...)
}
// 解密函數
func DESDecode(cripter, key []byte) ([]byte,error) {
// 建立密碼塊
block ,err:=des.NewCipher(key)
if err!=nil{ return nil,err}

// 設置解密模式,加密模式和解密模式要一樣
blockMode := cipher.NewCBCDecrypter(block,key)

// 設置切片長度,用來存放明文位元組
originData := make([]byte,len(cripter))

// 使用解密模式解密,將解密後的明文位元組放入originData 切片中
blockMode.CryptBlocks(originData,cripter)

// 去除加密的padding部分
strByt := UnPKCS5Padding(origenData)

return strByt,nil
}
// 解密所需要的Unpadding
func UnPKCS5Padding(origin []byte) []byte{
// 獲取最後一位轉為整型,然後根據這個整型截取掉整型數量的長度
// 若此數為5,則減掉轉換明文後的最後5位,即為我們輸入的明文
var last = int(origin[len(origin)-1])
return origin[:len(origin)-last]
}
注意:在設置加密模式為CBC的時候,我們需要設置一個初始化向量,這個量的意思 在對稱加密演算法中,如果只有一個密鑰來加密數據的話,明文中的相同文字就會也會被加密成相同的密文,這樣密文和明文就有完全相同的結構,容易破解,如果給一個初始化向量,第一個明文使用初始化向量混合並加密,第二個明文用第一個明文的加密後的密文與第二個明文混合加密,這樣加密出來的密文的結構則完全與明文不同,更加安全可靠。CBC模式圖如下

CBC
3DES
DES 的常見變體是三重 DES,使用 168 位的密鑰對資料進行三次加密的一種機制;它通常(但非始終)提供極其強大的安全性。如果三個 56 位的子元素都相同,則三重 DES 向後兼容 DES。
對比DES,發現只是換了NewTripleDESCipher。不過,需要注意的是,密鑰長度必須24byte,否則直接返回錯誤。關於這一點,PHP中卻不是這樣的,只要是8byte以上就行;而Java中,要求必須是24byte以上,內部會取前24byte(相當於就是24byte)。另外,初始化向量長度是8byte(目前各個語言都是如此,不是8byte會有問題)

㈣ 3des加密原理

使用3Des加密演算法前,我們需要了解一下當前主流的加密模式:單向加密和雙向加密,兩者最大的區別在於加密的密文是否具有可逆性。

單向加密:將需要加密的數據進行加密,並且密文不可進行解密,像我們常用的加密演算法MD5就屬於這種。

雙向加密:和單向加密不同的是可以通過某些方式進行加解密的操作,其中分為對稱加密和非對稱加密。

對稱加密:指數據使用者必須擁有相同的密鑰才可以進行加密解密,就像彼此約定的一串暗號,本文介紹的3Des加密就屬於這種。

非對稱加密:通過一組包含公鑰和私鑰的密碼來加密解密,用公鑰加密,私鑰解密,首推的就是RSA加密

---------------------------------------------------------------------------------------------------------------------------------------

3Des加密演算法,由於可以逆推原文,所以主要通過本地的唯一密鑰來保證數據的安全性,我這邊通過生成隨機的256位加密字元串存儲在本地,代碼讀取時將其通過md5加密成32位的字元串(由於本地有原始密鑰,不必擔心md5加密不可逆),最後以這32位加密字元串作為密鑰進行加解密的操作。

㈤ 怎麼實現DES/3DES加密

這個網上有很多關於3DES和DES的加密演算法以及很詳細的程序實現代碼。

㈥ 為什麼3DES加密演算法中間一步是解密,而不是加密|

3DES加密過程中的第二步使用的解密沒有密碼方面的意義。它的唯一好處是讓3DES的使用者能夠解密原來單重DES使用者加密的數據

㈦ 3des加密演算法是標準的嗎

3DES又稱Triple DES,是DES加密演算法的一種模式,它使用3條56位的密鑰對
3DES
數據進行三次加密。數據加密標准(DES)是美國的一種由來已久的加密標准,它使用對稱密鑰加密法,並於1981年被ANSI組織規范為ANSI X.3.92。DES使用56位密鑰和密碼塊的方法,而在密碼塊的方法中,文本被分成64位大小的文本塊然後再進行加密。比起最初的DES,3DES更為安全。
3DES(即Triple DES)是DES向AES過渡的加密演算法(1999年,NIST將3-DES指定為過渡的加密標准),加密演算法,其具體實現如下:設Ek()和Dk()代表DES演算法的加密和解密過程,K代表DES演算法使用的密鑰,P代表明文,C代表密文,這樣:
3DES加密過程為:C=Ek3(Dk2(Ek1(P)))
3DES解密過程為:P=Dk1(EK2(Dk3(C)))

㈧ 3DES的加密實例

classMycrypt3des{var$CI;public$key=keystring;/*構造方法*/function__construct(){$this->CI=&get_instance();}publicfunctionencrypt($input){//數據加密if(empty($input)){returnnull;}$size=mcrypt_get_block_size(MCRYPT_3DES,'ecb');$input=$this->pkcs5_pad($input,$size);$key=str_pad($this->key,24,'0');$td=mcrypt_mole_open(MCRYPT_3DES,'','ecb','');$iv=@mcrypt_create_iv(mcrypt_enc_get_iv_size($td),MCRYPT_RAND);@mcrypt_generic_init($td,$key,$iv);$data=mcrypt_generic($td,$input);mcrypt_generic_deinit($td);mcrypt_mole_close($td);$data=base64_encode($data);return$data;}publicfunctiondecrypt($encrypted){//數據解密if(!$encrypted||empty($encrypted)){returnnull;}$encrypted=base64_decode($encrypted);if(!$encrypted||empty($encrypted)){returnnull;}$key=str_pad($this->key,24,'0');$td=mcrypt_mole_open(MCRYPT_3DES,'','ecb','');$iv=@mcrypt_create_iv(mcrypt_enc_get_iv_size($td),MCRYPT_RAND);$ks=mcrypt_enc_get_key_size($td);@mcrypt_generic_init($td,$key,$iv);$decrypted=mdecrypt_generic($td,$encrypted);mcrypt_generic_deinit($td);mcrypt_mole_close($td);$y=$this->pkcs5_unpad($decrypted);return$y;}functionpkcs5_pad($text,$blocksize){$pad=$blocksize-(strlen($text)%$blocksize);return$text.str_repeat(chr($pad),$pad);}functionpkcs5_unpad($text){$pad=ord($text{strlen($text)-1});if($pad>strlen($text)){returnfalse;}if(strspn($text,chr($pad),strlen($text)-$pad)!=$pad){returnfalse;}returnsubstr($text,0,-1*$pad);}functionPaddingPKCS7($data){$block_size=mcrypt_get_block_size(MCRYPT_3DES,MCRYPT_MODE_CBC);$padding_char=$block_size-(strlen($data)%$block_size);$data.=str_repeat(chr($padding_char),$padding_char);return$data;}}

㈨ 如何用Java進行3DES加密解

最近一個合作商提出使用3DES交換數據,本來他們有現成的代碼,可惜只有.net版本,我們的伺服器都是linux,而且應用都是Java。於是對照他們提供的代碼改了一個Java的版本出來,主要是不熟悉3DES,折騰了一天,終於搞定。
所謂3DES,就是把DES做三次,當然不是簡單地DES DES DES就行了,中途有些特定的排列。這個我可不關心,呵呵,我的目的是使用它。
在網上搜索了一下3DES,找到很少資料。經過朋友介紹,找到GNU Crypto和Bouncy Castle兩個Java擴充包,裡面應該有3DES的實現吧。
從GNU Crypto入手,找到一個TripleDES的實現類,發現原來3DES還有一個名字叫DESede,在網上搜索TripleDES和DESede,呵呵,終於發現更多的資料了。
Java的安全API始終那麼難用,先創建一個cipher看看演算法在不在吧
Cipher cipher = Cipher.getInstance("DESede");

如果沒有拋異常的話,就證明這個演算法是有效的
突然想看看JDK有沒有內置DESede,於是撇開Crypto,直接測試,發現可以正確運行。在jce.jar裡面找到相關的類,JDK內置了。
於是直接用DES的代碼來改&測試,最後代碼變成這樣
SecureRandom sr = new SecureRandom();
DESedeKeySpec dks = new DESedeKeySpec(PASSWORD_CRYPT_KEY.getBytes());
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede");
SecretKey securekey = keyFactory.generateSecret(dks);
Cipher cipher = Cipher.getInstance("DESede");
cipher.init(Cipher.ENCRYPT_MODE, securekey, sr);
return new String(Hex.encodeHex(cipher.doFinal(str.getBytes())));

需要留意的是,要使用DESede的Spec、Factory和Cipher才行
事情還沒完結,合作商給過來的除了密鑰之外,還有一個IV向量。搜索了一下,發現有一個IvParameterSpec類,於是代碼變成這樣
SecureRandom sr = new SecureRandom();
DESedeKeySpec dks = new DESedeKeySpec(PASSWORD_CRYPT_KEY.getBytes());
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede");
SecretKey securekey = keyFactory.generateSecret(dks);
IvParameterSpec iv = new IvParameterSpec(PASSWORD_IV.getBytes());
Cipher cipher = Cipher.getInstance("DESede");
cipher.init(Cipher.ENCRYPT_MODE, securekey, iv, sr);
return new String(Hex.encodeHex(cipher.doFinal(str.getBytes())));

但是,運行報錯了
java.security.: ECB mode cannot use IV

ECB是什麼呢?我的代碼完全沒有寫ECB什麼的
又上網搜索,結果把DES的來龍去脈都搞清楚了
http://www.tropsoft.com/strongenc/des.htm
ECB是其中一種字串分割方式,除了DES以外,其他加密方式也會使用這種分割方式的,而Java默認產生的DES演算法就是用ECB方法,ECB不需要向量,當然也就不支持向量了
除了ECB,DES還支持CBC、CFB、OFB,而3DES只支持ECB和CBC兩種
http://www.tropsoft.com/strongenc/des3.htm
CBC支持並且必須有向量,具體演算法這里就不說了。合作商給的.net代碼沒有聲明CBC模式,似乎是.net默認的方式就是CBC的
於是把模式改成CBC
Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");

成功運行了
後話:
搜索的過程中,找到一個不錯的討論
http://www.lslnet.com/linux/dosc1/21/linux-197579.htm

在CBC(不光是DES演算法)模式下,iv通過隨機數(或偽隨機)機制產生是一種比較常見的方法。iv的作用主要是用於產生密文的第一個block,以使
最終生成的密文產生差異(明文相同的情況下),使密碼攻擊變得更為困難,除此之外iv並無其它用途。因此iv通過隨機方式產生是一種十分簡便、有效的途
徑。此外,在IPsec中採用了DES-CBC作為預設的加密方式,其使用的iv是通訊包的時間戳。從原理上來說,這與隨機數機制並無二致。
看來,向量的作用其實就是salt
最大的好處是,可以令到即使相同的明文,相同的密鑰,能產生不同的密文
例如,我們用DES方式在數據保存用戶密碼的時候,可以另外增加一列,把向量同時保存下來,並且每次用不同的向量。這樣的好處是,即使兩個用戶的密碼是一樣的,資料庫保存的密文,也會不一樣,就能降低猜測的可能性
另外一種用法,就是類似IPsec的做法,兩部主機互傳數據,保證兩部機的時鍾同步的前提下(可以取樣到分鍾或更高的單位避免偏差),用時鍾的變化值作為向量,就能增加被sniffer數據的解密難度

㈩ 3des加密 密鑰

Des的密鑰是8個位元組,但實際上只有7個用上,也就是56位。
3des是用3個或2個des密鑰加密一串明文,最少112位最多168位。也就是14~21個字母或數字元號。

從安全性上來說密鑰位數不足是不能加密的,但有些軟體為了保證用戶可用,會自動使用某種策略自動填充滿,一般是重復填充或採用特定字元,如果你只填了1234作為密鑰,有可能真正用於加密的密鑰是123412341234123412341或者123400000000000000000類似的。

另外請注意,最好去做3des的密鑰位數不是7或8,因為des的加密解密是同一個過程,這樣搞在填充後實際上是只使用了一次des加密••••••還不如5位6位好••••••

如果是你編程時碰到的問題,把你的源碼發來看看再說。

閱讀全文

與3des加密相關的資料

熱點內容
fib在python是什麼意思 瀏覽:532
c調用命令行 瀏覽:940
阿里雲伺服器中沒有apt 瀏覽:610
發送信息需要用戶加密嗎 瀏覽:636
六年級分數乘分數有幾種演算法 瀏覽:298
到哪裡查自己的app賬號 瀏覽:121
光大app點擊哪裡可以查年費 瀏覽:877
加密狗軟體先安裝還是先先後順序 瀏覽:354
柱頭加密區箍筋間距一般多少 瀏覽:683
美團商家版本服務中心在app哪裡 瀏覽:989
androidgps調試 瀏覽:821
比心app怎麼下載官方 瀏覽:50
安卓怎麼隱藏手機上的app 瀏覽:581
hp光纖交換機命令 瀏覽:898
pythonhive導入數據 瀏覽:675
安卓手機屏幕按住一直抖怎麼辦 瀏覽:196
壓縮率公式 瀏覽:323
藍虎app怎麼下載 瀏覽:616
周易江湖pdf 瀏覽:861
java取主機名 瀏覽:368