对称密码体制
對稱密碼:要求加密與解密使用同一個共享密鑰。故要求通信雙方必須在通信前商定密鑰并妥善保存。
對稱密碼體制分兩種:
一、流密碼:對明文的單個位(或字節(jié))進行運算,明文加密后密文基本保持和明文同樣長度。常用流密碼算法有RC4、SEAL等。
? ? ? ? ? 同步流密碼:發(fā)送方和接收方在傳遞信息時同步進行加解密操作,密文內(nèi)容如果在傳輸過程中被篡改刪除或者插入,會導(dǎo)致同步失效,解密失敗。必須重新同步來實現(xiàn)解密,恢復(fù)密文。如果傳輸過程中一個加密位改變,則只影響該位的恢復(fù),對后續(xù)密文不影響。但是,主動攻擊者可以選擇性的對密文字符進行改動,并準確知道這些改動對明文的影響。因此,同步流密碼具有同步性,無錯誤傳遞性、主動攻擊性三種特性。適用于為音頻或視頻數(shù)據(jù)提供版權(quán)保護。
? ? ? ? 自同步流密碼:與同步流密碼相比,是一種有記憶變換的密碼。每一個密鑰與已產(chǎn)生的固定數(shù)量的密文位有關(guān),密鑰由已生成的密文決定。在密文傳輸過程中如果一個密文位發(fā)生改變,該位的變化會影響到后續(xù)有限位(如n位)的密文正確解密。
?
?
二、分組密碼:將明文信息劃分成不同的組(或塊),分別對每個組(或塊)進行運算。多用于網(wǎng)絡(luò)加密。分組長度越長,密碼分析越困難,越不利于操作和運算,分組長度應(yīng)權(quán)衡安全性與實用性。常用的有DES、AES等
?
DES算法
? ? ? ? DES算法將明文分組的大小為64比特的加密區(qū)塊,再以加密區(qū)塊為單位進行加密處理,DES使用的密鑰長度為64比特,但由于每隔7個比特設(shè)置一個奇偶校驗位,因此其密鑰長度實際為56比特。奇偶校驗為最簡單的錯誤檢測碼,即根據(jù)一組二進制代碼中1的個數(shù)是奇數(shù)或偶數(shù)來檢測錯誤。最后剩下的不足一塊的大小稱為短塊,處理方法有填充法、流密碼加密法、密文挪用技術(shù)。
? ? ? ? 根據(jù)數(shù)據(jù)加密時每個加密區(qū)塊的關(guān)聯(lián)方式不同,可分為四種工作模式:電子密碼本模式(Electronic Code Book,ECB)、密文鏈接模式(Cipher Book Chaining,CBC)、密文反饋模式(Cipher Feed Back, CFB) 、輸出反饋模式(Output Feed Back, OFB)。AES標準除了以上四種工作模外還推薦了一種:計數(shù)器模式(Counter,CTR)
? ? ? ?1、 ECB:每次加密產(chǎn)生獨立密文分組,每組加密結(jié)果不對別組產(chǎn)生影響,相同明文加密產(chǎn)生相同密文,無初始化向量。
? ? ? ? ? ? ? 優(yōu)點:簡單易行,沒有誤差傳遞的問題
? ? ? ? ? ? ? 缺點:不能隱藏明文的模式,明文重復(fù)密文也會重復(fù),對明文進行主動攻擊的可能性較高
? ? ? ? ? ? ? 用途:適合加密密鑰、隨機數(shù)等短數(shù)據(jù),例如安全傳遞DES密鑰,ECB是最適合的模式
? ? ? ?2、CBC: 明文加密前先與前面的密文進行異或后再加密,因此只要選擇不同的初始向量,就會產(chǎn)生不同的密文。
? ? ? ? ? ? ? 優(yōu)點:加密后的密文上下文關(guān)聯(lián),即使明文相同密文也不同;密文內(nèi)容如果被替換、刪除或在網(wǎng)絡(luò)傳輸中發(fā)生錯誤,后? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 續(xù)密文即被破壞,無法解密還原。
? ? ? ? ? ? ? 缺點:不利于計算,誤差傳遞,如果在加密的過程中發(fā)生錯誤,錯誤將會被無限放大,導(dǎo)致加密失敗,需要初始化向量
? ? ? ? ? ? ? 用途:可加密任意長度的數(shù)據(jù),適用于計算產(chǎn)生監(jiān)測數(shù)據(jù)完整性的消息認證碼MAC
? ? ? ?3、CFB:?類似于自同步流密碼,分組加密后將密文和明文進行移位異或狗得到輸出。
? ? ? ? ? ? ? ? ? ? ? ? 優(yōu)點:隱藏了明文的模式,分組密碼轉(zhuǎn)換為流模式,可產(chǎn)生密鑰流,可及時加密傳送小于分組的數(shù)據(jù)。
? ? ? ? ? ? ? ? ? ? ? ? 缺點:與CBC相似,不利于并行計算,誤差傳送,需要初始化向量。
? ? ? ? ? ? ? ? ? ? ? ? 用途:引錯誤傳播無界,可用于檢查發(fā)現(xiàn)明文密文的篡改
? ? ? ? ? ? ?4、OFB: 將分組密碼作為同步流密碼運行,沒有錯誤擴散的問題。與明文分組進行異或的輸入部分是反復(fù)加密后得到的
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?優(yōu)點:隱藏明文模式;分組密碼轉(zhuǎn)換為流模式;無誤差傳送問題;可及時加密傳送小于分組的數(shù)據(jù)。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?缺點:不利于進行計算,對明文的主動攻擊是可能的;安全性低于CFB
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?用途:適用于加密冗余性較大的數(shù)據(jù),比如語音,圖像數(shù)據(jù);
? ? ? ? ? 5、CTR:?通過將逐次累加的計數(shù)器進行加密來生成密鑰流的流密碼,在CTR模式中,每個分組對應(yīng)一個逐次累加的計數(shù)器,并通過對計數(shù)器進行加密來生成密鑰流。最終的密文分組是通過將計數(shù)器加密得到的比特序列與明文分組進行XOR而得到的。
? ? ? ? ? ? ? ?優(yōu)點:可并行計算,安全性至少與CBC一樣;加密解密僅涉及密碼算法的加密;
? ? ? ? ? ? ? ?缺點:沒有錯誤傳播,不易確保數(shù)據(jù)完整性
? ? ? ? ? ? ? ?用途:各種加密應(yīng)用
?
3DES算法
3DES是DES加密算法的一種模式,它使用3條64位的密鑰對數(shù)據(jù)進行三次加密。
3DES(即Triple DES)是DES向AES過渡的加密算法(1999年,NIST將3-DES指定為過渡的加密標準),是DES的一個更安全的變形,可以理解為DES的升級版。它以DES為基本模塊,通過組合分組方法設(shè)計出分組加密算法。
設(shè)Ek()和Dk()代表DES算法的加密和解密過程,Kn代表DES算法使用的密鑰,P代表明文,C代表密表,這樣,
3DES加密過程為:C=Ek3(Dk2(Ek1(P)))
3DES解密過程為:P=Dk1((EK2(Dk3(C)))
K1、K2、K3決定了算法的安全性,若三個密鑰互不相同,本質(zhì)上就相當于用一個長為168位的密鑰進行加密。多年來,它在對付強力攻擊時是比較安全的。若數(shù)據(jù)對安全性要求不那么高,K1可以等于K3。在這種情況下,密鑰的有效長度為112位。
?
”DESede“是3DES的標簽
SecretKey secretKey = new SecretKeySpec(keys, "DESede"); Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS7Padding"); cipher.init(Cipher.ENCRYPT_MODE, secretKey); cipher.doFinal(srcs);AES?
高級加密標準(AES,Advanced Encryption Standard)為最常見的對稱加密算法(微信小程序加密傳輸就是用這個加密算法的)。對稱加密算法也就是加密和解密用相同的密鑰。
AES為分組密碼,分組密碼也就是把明文分成一組一組的,每組長度相等,每次加密一組數(shù)據(jù),直到加密完整個明文。在AES標準規(guī)范中,分組長度只能是128位,也就是說,每個分組為16個字節(jié)(每個字節(jié)8位)。密鑰的長度可以使用128位、192位或256位。密鑰的長度不同,推薦加密輪數(shù)也不同,如下表所示:
| AES-128 | 4 | 4 | 10 |
| AES-192 | 6 | 4 | 12 |
| AES-256 | 8 | 4 | 14 |
jce中提供了加解密的api:?
AES支持五種模式:CBC,CFB,ECB,OFB,PCBC
private void AES(String src) {try {//生成安全密鑰KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");keyGenerator.init(128);SecretKey secretKey = keyGenerator.generateKey();byte[] key = secretKey.getEncoded();SecretKey key1 = new SecretKeySpec(key, "AES");//加密Cipher cipher = Cipher.getInstance("AES");cipher.init(Cipher.ENCRYPT_MODE, key1);byte[] content = src.getBytes("utf-8");byte[] encodeResult = cipher.doFinal(content);Log.i("AES", "AESEncode:" + Convert.toHexString(encodeResult));// 解密cipher.init(Cipher.DECRYPT_MODE, key1);byte[] decodeResult = cipher.doFinal(encodeResult);Log.i("AES", "AESDecode:" + new String(decodeResult));} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (NoSuchPaddingException e) {e.printStackTrace();} catch (InvalidKeyException e) {e.printStackTrace();} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (BadPaddingException e) {e.printStackTrace();} catch (IllegalBlockSizeException e) {e.printStackTrace();} }?
總結(jié)
- 上一篇: hihoCoder #1246 : 王胖
- 下一篇: GeneXus项目启动