安卓常見的一些加密((對稱加密DES,AES),非對稱加密(RSA),MD5)

  • 對稱加密(如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")
image.png
  • 源碼


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比特。

image.png

最近做微信小程序獲取用戶綁定的手機(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ù)的時候,從它們的積p
q去分解因子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只是一種哈希算法

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容