- 對稱加密(如DES、AES等)、非對稱加密(如RSA等)和單向加密(如MD5等)
DES是數(shù)據(jù)加密標(biāo)準(zhǔn)(Data Encryption Standard)的簡稱,他是第一代公開的、完全說明細(xì)節(jié)的商用密碼算法。DES算法經(jīng)過16論迭代,使用56比特長度密鑰加密64比特長度(分組長度)的明文獲得64比特的密文。
DES是一種對稱加密算法,所謂對稱加密算法即:加密和解密使用相同密鑰的算法。DES加密算法出自IBM的研究,
后來被美國政府正式采用,之后開始廣泛流傳,但是近些年使用越來越少,因?yàn)镈ES使用56位密鑰,以現(xiàn)代計算能力,
24小時內(nèi)即可被破解
- 注意:DES加密和解密過程中,密鑰長度都必須是8的倍數(shù),這種說法是錯誤的,should be 8 bytes ,應(yīng)該為8字節(jié)
val des=DES.encryptDES("shiming","1234567812345678")

- 源碼
public class DES {
//初始化向量,隨意填寫
private static byte[]iv={1,2,3,4,5,6,7,8};
/**
*
* @param encryptString 明文
* @param encryptKey 密鑰
* @return 加密后的密文
*/
public static String encryptDES(String encryptString,String encryptKey){
try {
//實(shí)例化IvParameterSpec對象,使用指定的初始化向量
IvParameterSpec zeroIv=new IvParameterSpec(iv);
//實(shí)例化SecretKeySpec,根據(jù)傳入的密鑰獲得字節(jié)數(shù)組來構(gòu)造SecretKeySpec
SecretKeySpec key =new SecretKeySpec(encryptKey.getBytes(),"DES");
System.out.println("shiming encryptDES== "+key);
//創(chuàng)建密碼器
Cipher cipher=Cipher.getInstance("DES/CBC/PKCS5Padding");
//用密鑰初始化Cipher對象
cipher.init(Cipher.ENCRYPT_MODE,key,zeroIv);
//執(zhí)行加密操作
byte[]encryptedData=cipher.doFinal(encryptString.getBytes());
return Base64.encodeToString(encryptedData,0);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (InvalidAlgorithmParameterException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
}
return null;
}
/**
* 解密的過程與加密的過程大致相同
* @param decryptString 密文
* @param decryptKey 密鑰
* @return 返回明文
*/
public static String decryptDES(String decryptString,String decryptKey){
try {
//先使用Base64解密
byte[]byteMi=Base64.decode(decryptString,0);
//實(shí)例化IvParameterSpec對象使用指定的初始化向量
IvParameterSpec zeroIv=new IvParameterSpec(iv);
//實(shí)例化SecretKeySpec,根據(jù)傳入的密鑰獲得字節(jié)數(shù)組來構(gòu)造SecretKeySpec,
SecretKeySpec key=new SecretKeySpec(decryptKey.getBytes(),"DES");
//創(chuàng)建密碼器
Cipher cipher=Cipher.getInstance("DES/CBC/PKCS5Padding");
//用密鑰初始化Cipher對象,上面是加密,這是解密模式
cipher.init(Cipher.DECRYPT_MODE,key,zeroIv);
//獲取解密后的數(shù)據(jù)
byte [] decryptedData=cipher.doFinal(byteMi);
return new String(decryptedData);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (InvalidAlgorithmParameterException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
}
return null;
}
}
調(diào)用過程

AES是高級加密標(biāo)準(zhǔn)(Advanced Encryption Standard)的簡稱,用于替代原先的DES,保護(hù)敏感信息。AES算法的分組長度為128比特,其密鑰長度分別為128比特,192比特,256比特。

最近做微信小程序獲取用戶綁定的手機(jī)號信息解密,試了很多方法。最終雖然沒有完全解決,但是也達(dá)到我的極限了。有時會報錯:javax.crypto.BadPaddingException: pad block corrupted。
出現(xiàn)錯誤的詳細(xì)描述
每次剛進(jìn)入小程序登陸獲取手機(jī)號時,會出現(xiàn)第一次解密失敗,再試一次就成功的問題。如果連續(xù)登出,登入,就不會再出現(xiàn)揭秘失敗的問題。但是如果停止操作過一會,登出后登入,又會出現(xiàn)第一次揭秘失敗,再試一次就成功的問題。
網(wǎng)上說的,官方文檔上注意點(diǎn)我都排除了。獲取的加密密文是在前端調(diào)取wx.login()方法后,調(diào)用我后端的微信授權(quán)接口,獲取用戶的sessionkey,openId.然后才是前端調(diào)用的獲取sessionkey加密的用戶手機(jī)號接口,所以我可以保證每次sessionkey是最新的。不會過期。
并且我通過日志發(fā)現(xiàn)在sessionkey不變的情況下,第一次失敗,第二次解密成功。
非對稱加密(RSA)
加密算法,RSA是繞不開的話題,因?yàn)镽SA算法是目前最流行的公開密鑰算法,既能用于加密,也能用戶數(shù)字簽名。不僅在加密貨幣領(lǐng)域使用,在傳統(tǒng)互聯(lián)網(wǎng)領(lǐng)域的應(yīng)用也很廣泛。從被提出到現(xiàn)在20多年,經(jīng)歷了各種考驗(yàn),被普遍認(rèn)為是目前最優(yōu)秀的公鑰方案之一
非對稱加密算法的特點(diǎn)就是加密秘鑰和解密秘鑰不同,秘鑰分為公鑰和私鑰,用私鑰加密的明文,只能用公鑰解密;用公鑰加密的明文,只能用私鑰解密。
一、 什么是“素數(shù)”?
素數(shù)是這樣的整數(shù),它除了能表示為它自己和1的乘積以外,不能表示為任何其它兩個整數(shù)的乘積
二、什么是“互質(zhì)數(shù)”(或“互素數(shù)”)?
小學(xué)數(shù)學(xué)教材對互質(zhì)數(shù)是這樣定義的:“公約數(shù)只有1的兩個數(shù),叫做互質(zhì)數(shù)
(1)兩個質(zhì)數(shù)一定是互質(zhì)數(shù)。例如,2與7、13與19。
(2)一個質(zhì)數(shù)如果不能整除另一個合數(shù),這兩個數(shù)為互質(zhì)數(shù)。例如,3與10、5與 26。
(3)1不是質(zhì)數(shù)也不是合數(shù),它和任何一個自然數(shù)在一起都是互質(zhì)數(shù)。如1和9908。
(4)相鄰的兩個自然數(shù)是互質(zhì)數(shù)。如 15與 16。
(5)相鄰的兩個奇數(shù)是互質(zhì)數(shù)。如 49與 51。
(6)大數(shù)是質(zhì)數(shù)的兩個數(shù)是互質(zhì)數(shù)。如97與88。
(7)小數(shù)是質(zhì)數(shù),大數(shù)不是小數(shù)的倍數(shù)的兩個數(shù)是互質(zhì)數(shù)。如 7和 16。
(8)兩個數(shù)都是合數(shù)(二數(shù)差又較大),小數(shù)所有的質(zhì)因數(shù),都不是大數(shù)的約數(shù),這兩個數(shù)是互質(zhì)數(shù)。如357與715,357=3×7×17,而3、7和17都不是715的約數(shù),這兩個數(shù)為互質(zhì)數(shù)。等等。
三、什么是模指數(shù)運(yùn)算?
指數(shù)運(yùn)算誰都懂,不必說了,先說說模運(yùn)算。模運(yùn)算是整數(shù)運(yùn)算,有一個整數(shù)m,以n為模做模運(yùn)算,即m mod n。怎樣做呢?讓m去被n整除,只取所得的余數(shù)作為結(jié)果,就叫做模運(yùn)算。例如,10 mod 3=1;26 mod 6=2;28 mod 2 =0等等。
模指數(shù)運(yùn)算就是先做指數(shù)運(yùn)算,取其結(jié)果再做模運(yùn)算。如(5^3) mod 7 = (125 mod 7) = 6。
-
RSA算法描述
RSA的公鑰、私鑰的組成,以及加密過程、解密過程的公式可見于下表:
image.png
其中,符號^表示數(shù)學(xué)上的指數(shù)運(yùn)算;mod表示模運(yùn)算,即相除取余數(shù)。具體算法步驟如下:
(1)選擇一對不同的、足夠大的素數(shù)p,q。
(2)計算n=pq。
(3)計算f(n)=(p-1)(q-1),同時對p, q嚴(yán)加保密,不讓任何人知道。
(4)找一個與f(n)互質(zhì)的數(shù)e作為公鑰指數(shù),且1<e<f(n)。
(5)計算私鑰指數(shù)d,使得d滿足(d*e) mod f(n) = 1
(6)公鑰KU=(e,n),私鑰KR=(d,n)。
(7)加密時,先將明文變換成0至n-1的一個整數(shù)M。若明文較長,可先分割成適當(dāng)?shù)慕M,然后再進(jìn)行交換。設(shè)密文為C,則加密過程為:C=M^e mod n。
(8)解密過程為:M=C^d mod n。
首先,我們來探討為什么RSA密碼難于破解?
在RSA密碼應(yīng)用中,公鑰KU是被公開的,即e和n的數(shù)值可以被第三方竊聽者得到。破解RSA密碼的問題就是從已知的e和n的數(shù)值(n等于pq),想法求出d的數(shù)值,這樣就可以得到私鑰來破解密文。從上文中的公式:(de) mod ((p-1)(q-1)) = 1,我們可以看出,密碼破解的實(shí)質(zhì)問題是:從pq的數(shù)值,去求出(p-1)和(q-1)。換句話說,只要求出p和q的值,我們就能求出d的值而得到私鑰。
當(dāng)p和q是一個大素數(shù)的時候,從它們的積pq去分解因子p和q,這是一個公認(rèn)的數(shù)學(xué)難題。比如當(dāng)p*q大到1024位時,迄今為止還沒有人能夠利用任何計算工具去完成分解因子的任務(wù)。因此,RSA從提出到現(xiàn)在已近二十年,經(jīng)歷了各種攻擊的考驗(yàn),逐漸為人們接受,普遍認(rèn)為是目前最優(yōu)秀的公鑰方案之一。
缺點(diǎn)1:雖然RSA的安全性依賴于大數(shù)的因子分解,但并沒有從理論上證明破譯RSA的難度與大數(shù)分解難度等價。即RSA的重大缺陷是無法從理論上把握它的保密性能如何。
MD加密
在android 開發(fā)的很多時候。為了保證用戶的賬戶的安全性,再保存用戶的密碼時,通常會采用MD5加密算法,這種算法是不可逆的,具有一定的安全性
MD5不是加密算法, 因?yàn)槿绻康氖羌用?,必須滿足的一個條件是加密過后可以解密。但是MD5是無法從結(jié)果還原出原始數(shù)據(jù)的。
MD5只是一種哈希算法
