對稱加密演算法是應用較早的加密演算法,技術成熟。
主要有DES演算法,3DES演算法,TDEA演算法,Blowfish演算法,RC5演算法,IDEA演算法。
2. 常見密碼演算法原理
PBKDF2(Password-Based Key Derivation Function)是一個用來導出密鑰的函數,用來生成加密的密碼,增加破解的難度,類似bcrypt/scrypt等,可以用來進行密碼或者口令的加密存儲。主要是鹽值+pwd,經過多輪HMAC演算法的計算,產生的密文。
PBKDF2函數的定義
DK = PBKDF2(PRF, Password, Salt, c, dkLen)
• PRF是一個偽隨機函數,例如HASH_HMAC函數,它會輸出長度為hLen的結果。
• Password是用來生成密鑰的原文密碼。
• Salt是一個加密用的鹽值。
• c是進行重復計算的次數。
• dkLen是期望得到的密鑰的長度。
• DK是最後產生的密鑰。
https://segmentfault.com/a/1190000004261009
下面我們以Alice和Bob為例敘述Diffie-Hellman密鑰交換的原理。
1,Diffie-Hellman交換過程中涉及到的所有參與者定義一個組,在這個組中定義一個大質數p,底數g。
2,Diffie-Hellman密鑰交換是一個兩部分的過程,Alice和Bob都需要一個私有的數字a,b。
下面是DH交換的過程圖:
本圖片來自wiki
下面我們進行一個實例
1.愛麗絲與鮑伯協定使用p=23以及g=5.
2.愛麗絲選擇一個秘密整數a=6, 計算A = g^a mod p並發送給鮑伯。
A = 5^6 mod 23 = 8.
3.鮑伯選擇一個秘密整數b=15, 計算B = g^b mod p並發送給愛麗絲。
B = 5^15 mod 23 = 19.
4.愛麗絲計算s = B a mod p
19^6 mod 23 = 2.
5.鮑伯計算s = A b mod p
8^15 mod 23 = 2.
ECDH:
ECC演算法和DH結合使用,用於密鑰磋商,這個密鑰交換演算法稱為ECDH。交換雙方可以在不共享任何秘密的情況下協商出一個密鑰。ECC是建立在基於橢圓曲線的離散對數問題上的密碼體制,給定橢圓曲線上的一個點P,一個整數k,求解Q=kP很容易;給定一個點P、Q,知道Q=kP,求整數k確是一個難題。ECDH即建立在此數學難題之上。密鑰磋商過程:
假設密鑰交換雙方為Alice、Bob,其有共享曲線參數(橢圓曲線E、階N、基點G)。
來自 http://www.cnblogs.com/fishou/p/4206451.html
https://zh.wikipedia.org/wiki/SHA%E5%AE%B6%E6%97%8F
exponent1 INTEGER, -- d mod (p-1)
exponent2 INTEGER, -- d mod (q-1)
coefficient INTEGER, -- (inverse of q) mod p
otherPrimeInfos OtherPrimeInfos OPTIONAL
}
-----END RSA PRIVATE KEY-----
while a RSA public key contains only the following data:
-----BEGIN RSA PUBLIC KEY-----
RSAPublicKey ::= SEQUENCE {
molus INTEGER, -- n
publicExponent INTEGER -- e
}
-----END RSA PUBLIC KEY-----
and this explains why the private key block is larger.
Note that a more standard format for non-RSA public keys is
-----BEGIN PUBLIC KEY-----
PublicKeyInfo ::= SEQUENCE {
algorithm AlgorithmIdentifier,
PublicKey BIT STRING
}
AlgorithmIdentifier ::= SEQUENCE {
algorithm OBJECT IDENTIFIER,
parameters ANY DEFINED BY algorithm OPTIONAL
}
-----END PUBLIC KEY-----
More info here.
BTW, since you just posted a screenshot of the private key I strongly hope it was just for tests :)
密鑰的長度
C:\herong>java RsaKeyGenerator 128
p: 17902136406704537069
q: 17902136406704537077
m:
Molus:
Key size: 128
Public key:
Private key:
C:\herong>java RsaKeyGenerator 256
p:
q:
m: ...
Molus: ...
Key size: 256
Public key: ...
Private key: ...
https://security.stackexchange.com/questions/90169/rsa-public-key-and-private-key-lengths
https://stackoverflow.com/questions/2921508/trying-to-understand-java-rsa-key-size >
http://www.herongyang.com/Cryptography/RSA-BigInteger-Keys-Generated-by-RsaKeyGenerator-java.html
update() adds data to the Cipher』s internal buffer, then returns all currently completely encoded blocks. If there are any encoded blocks left over, they remain in the Cipher』s buffer until the next call, or a call to doFinal(). This means that if you call update() with a four byte array to encrypt, and the buffer size is eight bytes, you will not receive encoded data on the return (you』ll get a null instead). If your next call to update() passes five bytes of data in, you will get an 8 byte (the block size) array back, containing the four bytes passed in on the previous call, the first four bytes from the current call – the remaining byte from the current call is left in the Cipher』s buffer.
doFinal() on the other hand is much simpler: it encrypts the passed data, pads it out to the necessary length, and then returns it. The Cipher is essentially stateless.
來自 https://segmentfault.com/a/1190000006931511
DH演算法的中間人攻擊
在最初的描述中,迪菲-赫爾曼密鑰交換本身並沒有提供通訊雙方的身份驗證服務,因此它很容易受到中間人攻擊。 一個中間人在信道的中央進行兩次迪菲-赫爾曼密鑰交換,一次和Alice另一次和Bob,就能夠成功的向Alice假裝自己是Bob,反之亦然。而攻擊者可以解密(讀取和存儲)任何一個人的信息並重新加密信息,然後傳遞給另一個人。因此通常都需要一個能夠驗證通訊雙方身份的機制來防止這類攻擊。
優缺點:
1、 僅當需要時才生成密鑰,減小了將密鑰存儲很長一段時間而致使遭受攻擊的機會。
2、 除對全局參數的約定外,密鑰交換不需要事先存在的基礎結構。
然而,該技術也存在許多不足:
1、 沒有提供雙方身份的任何信息。
2、 它是計算密集性的,因此容易遭受阻塞性攻擊,即對手請求大量的密鑰。受攻擊者花費了相對多的計算資源來求解無用的冪系數而不是在做真正的工作。
3、 沒辦法防止重演攻擊。
4、 容易遭受中間人的攻擊。第三方C在和A通信時扮演B;和B通信時扮演A。A和B都與C協商了一個密鑰,然後C就可以監聽和傳遞通信量。中間人的攻擊按如下進行:
(1) B在給A的報文中發送他的公開密鑰。
(2) C截獲並解析該報文。C將B的公開密鑰保存下來並給A發送報文,該報文具有B的用戶ID但使用C的公開密鑰YC,仍按照好像是來自B的樣子被發送出去。A收到C的報文後,將YC和B的用戶ID存儲在一塊。類似地,C使用YC向B發送好像來自A的報文。
(3) B基於私有密鑰XB和YC計算秘密密鑰K1。A基於私有密鑰XA和YC計算秘密密鑰K2。C使用私有密鑰XC和YB計算K1,並使用XC和YA計算K2。
(4) 從現在開始,C就可以轉發A發給B的報文或轉發B發給A的報文,在途中根據需要修改它們的密文。使得A和B都不知道他們在和C共享通信。
3. 加密:EkM=C 解密:DkC=M是什麼加密演算法
正常來說 都使用P來取代你數念所給出的關系中的M,除非M是宴畢高取自漢語「明文」的拼音(Mingwen)
P——明文(Plaintext),表示全體可能出現的明文集合
C——密文(Ciphertext),表示全體可能出現的密文集合
K——密鑰(Key),密鑰是加密演算法中的可變參數
E——加密演算法(Encryption algorithm),由公式、法則或者程序構成
D——解密演算法(Decryption algorithm),它是E的逆演算法。
當給定密鑰K時,
C = Ek(P), 對明文P進行加密(E操作)後得到密文C
P = Dk(C) = Dk(Ek(P)), 對密文C解密(D操作)後得明文P
加密設計主要是確定E,D,K。
根據E和D的對稱與非對稱關系,加密算晌尺法又分為對稱加密演算法和非對稱加密演算法,其代表性演算法分別為DES(Data Encryption Standard)和RSA
4. K均值演算法
代價函數可以定義為各個樣本距離所屬簇中心點的誤差平方和
K均值演算法有一些缺點,例如受初值和離群點的影響每次的結果不穩定、結果 通常不是全局最優而是局部最優解、無法很好地解決數據簇分布差別比較大的情 況(比如一類是另一類樣本數量的100倍)、不太適用於離散分類等。但是瑕不掩 瑜,K均值聚類的優點也是很明顯和突出的,主要體現在:對於大數據集,K均值 聚類演算法相對是可伸縮和高效的,它的計算復雜度是O(NKt)接近於線性,其中N是 數據對象的數目,K是聚類的簇數,t是迭代的輪數。盡管演算法經常以局部最優結 束,但一般情況下達到的局部最優已經可以滿足聚類的需求。
其實書中也少講了缺點,那就是關於k的選擇,當維度很高的時候,你很難判斷選擇k多少比較合適。
不過書中在演算法調優中說了。所謂的調優其是也是變相的說那些缺點。
K均值演算法的調優一般可以從以下幾個角度出發。
(1)數據歸一化和離群點處理。
K均值聚類本質上是一種基於歐式距離度量的數據劃分方法,均值和方差大的 維度將對數據的聚類結果產生決定性的影響,所以未做歸一化處理和統一單位的 數據是無法直接參與運算和比較的。同時,離群點或者少量的雜訊數據就會對均 值產生較大的影響,導致中心偏移,因此使用K均值聚類演算法之前通常需要對數據 做預處理。
(2)合理選擇K值。
K值的選擇是K均值聚類最大的問題之一,這也是K均值聚類演算法的主要缺 點。實際上,我們希望能夠找到一些可行的辦法來彌補這一缺點,或者說找到K值 的合理估計方法。但是,K值的選擇一般基於經驗和多次實驗結果。例如採用手肘 法,我們可以嘗試不同的K值,並將不同K值所對應的損失函數畫成折線,橫軸 為K的取值,縱軸為誤差平方和所定義的損失函數,如圖5.3所示
由圖可見,K值越大,距離和越小;並且,當K=3時,存在一個拐點,就像人 的肘部一樣;當K (1,3)時,曲線急速下降;當K>3時,曲線趨於平穩。手肘法認 為拐點就是K的最佳值。
手肘法是一個經驗方法,缺點就是不夠自動化,因此研究員們又提出了一些 更先進的方法,其中包括比較有名的Gap Statistic方法[5]。Gap Statistic方法的優點 是,不再需要肉眼判斷,而只需要找到最大的Gap statistic所對應的K即可,因此該 方法也適用於批量化作業。在這里我們繼續使用上面的損失函數,當分為K簇時, 對應的損失函數記為Dk。Gap Statistic定義為
Gap(K)=E(logDk)−logDk
內按照均勻分布隨機地產生和原始樣本數一樣多的隨機樣本,並對這個隨機樣本
做K均值,得到一個Dk;重復多次就可以計算出E(logDk)的近似值。那麼Gap(K)有
什麼物理含義呢?它可以視為隨機樣本的損失與實際樣本的損失之差。試想實際 樣本對應的最佳簇數為K,那麼實際樣本的損失應該相對較小,隨機樣本損失與實 際樣本損失之差也相應地達到最小值,從而Gap(K)取得最大值所對應的K值就是最 佳的簇數。根據式(5.4)計算K =1,2,...,9所對應的Gap Statistic
(3)採用核函數。
採用核函數是另一種可以嘗試的改進方向。傳統的歐式距離度量方式,使得K 均值演算法本質上假設了各個數據簇的數據具有一樣的先驗概率,並呈現球形或者 高維球形分布,這種分布在實際生活中並不常見。面對非凸的數據分布形狀時, 可能需要引入核函數來優化,這時演算法又稱為核K均值演算法,是核聚類方法的一種 [6]。核聚類方法的主要思想是通過一個非線性映射,將輸入空間中的數據點映射到 高位的特徵空間中,並在新的特徵空間中進行聚類。非線性映射增加了數據點線 性可分的概率,從而在經典的聚類演算法失效的情況下,通過引入核函數可以達到 更為准確的聚類結果。
K均值演算法的主要缺點如下。
(1)需要人工預先確定初始K值,且該值和真實的數據分布未必吻合。
(2)K均值只能收斂到局部最優,效果受到初始值很大。
(3)易受到噪點的影響。
(4)樣本點只能被劃分到單一的類中。
■ K-means++演算法
K均值的改進演算法中,對初始值選擇的改進是很重要的一部分。而這類演算法 中,最具影響力的當屬K-means++演算法。原始K均值演算法最開始隨機選取數據集中 K個點作為聚類中心,而K-means++按照如下的思想選取K個聚類中心。假設已經 選取了n個初始聚類中心(0<n<K),則在選取第n+1個聚類中心時,距離當前n個 聚類中心越遠的點會有更高的概率被選為第n+1個聚類中心。在選取第一個聚類中 心(n=1)時同樣通過隨機的方法。可以說這也符合我們的直覺,聚類中心當然是 互相離得越遠越好。當選擇完初始點後,K-means++後續的執行和經典K均值演算法 相同,這也是對初始值選擇進行改進的方法等共同點。
■ ISODATA演算法
當K值的大小不確定時,可以使用ISODATA演算法。ISODATA的全稱是迭代自 組織數據分析法。在K均值演算法中,聚類個數K的值需要預先人為地確定,並且在 整個演算法過程中無法更改。而當遇到高維度、海量的數據集時,人們往往很難准 確地估計出K的大小。ISODATA演算法就是針對這個問題進行了改進,它的思想也 很直觀。當屬於某個類別的樣本數過少時,把該類別去除;當屬於某個類別的樣 本數過多、分散程度較大時,把該類別分為兩個子類別。ISODATA演算法在K均值 演算法的基礎之上增加了兩個操作,一是分裂操作,對應著增加聚類中心數;二是 合並操作,對應著減少聚類中心數。ISODATA演算法是一個比較常見的演算法,其缺 點是需要指定的參數比較多,不僅僅需要一個參考的聚類數量Ko,還需要制定3個
閾值。下面介紹ISODATA演算法的各個輸入參數。
(1)預期的聚類中心數目Ko。在ISODATA運行過程中聚類中心數可以變 化,Ko是一個用戶指定的參考值,該演算法的聚類中心數目變動范圍也由其決定。 具體地,最終輸出的聚類中心數目常見范圍是從Ko的一半,到兩倍Ko。
(2)每個類所要求的最少樣本數目Nmin。如果分裂後會導致某個子類別所包 含樣本數目小於該閾值,就不會對該類別進行分裂操作。
(3)最大方差Sigma。用於控制某個類別中樣本的分散程度。當樣本的分散 程度超過這個閾值時,且分裂後滿足(1),進行分裂操作。
(4)兩個聚類中心之間所允許最小距離Dmin。如果兩個類靠得非常近(即這 兩個類別對應聚類中心之間的距離非常小),小於該閾值時,則對這兩個類進行
合並操作。
如果希望樣本不劃分到單一的類中,可以使用模糊C均值或者高斯混合模型, 高斯混合模型會在下一節中詳細講述。
K均值聚類的迭代演算法實際上是一種最大期望演算法 (Expectation-Maximization algorithm),簡稱EM演算法。EM演算法解決的是在概率模 型中含有無法觀測的隱含變數情況下的參數估計問題。
EM演算法只保證收斂到局部最優解
5. DK糾結的免傷演算法
第一、現在法系在PVP中都會去堆200左右的穿抗,這個屬性會無視你200左右的抗性,實際效果就罩穗粗是除了NQ開精通光環能夠多出180+的抗性,減免那物鎮么近10秒,或者是開了 監獄飾品 也是多180+抗性族敗外,你是無法在平時就保持這么高的法術減免的,所以在PVP中抗性這一項是可以忽略不計的。
第二、抗性減免現在的為
減傷 10% 15% 20% 25% 30% 35% 40% 45%
抗性 80 128 181 241 310 483 592 724
這些從隨即計算變成了固定值,(BOSS沒有命中屬性,所以在PVE中除了某些移除生命類的法術,都有1%的抵抗概率,同等級人物的話,會有4%的未命中概率,這也是PVP中為什麼法系要補齊4%命中的原因) 如果你的抗性一直是 592,且對方的穿抗是0,那麼一個10000傷害的法術作於到你身上首先會被抗性減免 10000*(1-0.4)剩餘 6000傷害,然後被韌性30%減免
6000*(1-0.3)實際你只受到4200的傷害。