一文搞懂?dāng)?shù)據(jù)轉(zhuǎn)換之摘要、編碼、加密、簽名

一.轉(zhuǎn)義

轉(zhuǎn)義的作用?

轉(zhuǎn)義通常有兩種功能。第一種是如果不進(jìn)行轉(zhuǎn)義就可能與語(yǔ)法規(guī)定的某些內(nèi)容產(chǎn)生混淆,所以這些內(nèi)容都被設(shè)計(jì)為需要轉(zhuǎn)義。 第二種也叫字符引用,用于表示無(wú)法在當(dāng)前上下文中被鍵盤(pán)錄入的字符(如字符串中的回車(chē)符)。

第一種作用

以經(jīng)典的JAVA語(yǔ)言中字符串中的字符轉(zhuǎn)義為例。如果在一個(gè)字符串中存在一個(gè)"符號(hào),那么就需要在"符號(hào)前添加\才能夠正常的表示,比如下面這樣:

String content="他說(shuō)\"他需要休息\"";

之所以需要這樣,是因?yàn)閷?duì)于字符串來(lái)說(shuō),"本身就是表示一個(gè)字符串的起止符號(hào)。如果不進(jìn)行轉(zhuǎn)義,那么編譯器將無(wú)法正確的識(shí)別其中的"哪些是分隔符,哪些是字符串內(nèi)部的"。

第二種作用

回車(chē)符和換行符,再正常情況下,這樣的字符是不可見(jiàn)的,對(duì)于這種字符,不采用轉(zhuǎn)義的形式進(jìn)行表達(dá)那么會(huì)比較困難。如果在一個(gè)字符串中存在回車(chē)符,那么就需要用\r表示。如果在一個(gè)字符串中存在換行符,那么就需要用\n表示。比如下面這樣:

String content="床前明月光,/r/n疑是地上霜";

二. 編碼解碼

1. 什么是編碼解碼?

編碼是采用一種新的載體來(lái)表示前一個(gè)載體所表達(dá)的信息。解碼,是編碼的逆過(guò)程。從概念上可以看出,編碼本質(zhì)上是信息形式的轉(zhuǎn)化,沒(méi)有保密的作用,因?yàn)榫幋a和解碼的算法是公開(kāi)的,只要知道是什么編碼的內(nèi)容,任何人都可以輕松地解碼。編碼的目的不是為了加密信息,而是將信息轉(zhuǎn)化成統(tǒng)一的格式,方便在不同系統(tǒng)之中傳輸。

信息->編碼->二進(jìn)制->解碼->信息

2. 常見(jiàn)的編碼方式

文本文件編碼

將“文本數(shù)據(jù)”編碼為“二進(jìn)制數(shù)據(jù)”,以實(shí)現(xiàn)通過(guò)“二進(jìn)制數(shù)據(jù)”進(jìn)行存儲(chǔ)或者傳輸?shù)哪康?。文本文件在?jì)算機(jī)中,最終的載體只能是二進(jìn)制文件的形式存在。由于計(jì)算機(jī)誕生在美國(guó),文本內(nèi)容也只包含有英文內(nèi)容。因此當(dāng)時(shí)只要使用ASCII進(jìn)行編碼就可以了。但是后來(lái)隨著計(jì)算機(jī)的普及,需要表達(dá)的信息越來(lái)越多了。因此誕生了UTF-8, UTF-16,UTF-32, Unicode, ISO8859-1, GBK, GB2312等等編碼形式。在計(jì)算機(jī)領(lǐng)域,數(shù)據(jù)存儲(chǔ)單位叫字節(jié)——byte,最小的存儲(chǔ)單元的容量是1位-1bit。一個(gè)bit有兩個(gè)狀態(tài) 0 和 1。1byte = 8bit。通常,一個(gè)英文字母占1字節(jié),漢字采用GBK編碼時(shí),占用2字節(jié)。UTF-8是可變長(zhǎng)度編碼,一般用 0-4 字節(jié)表示。

但不論如何,這些編碼其實(shí)都是對(duì)文本信息的編碼形式。

Base64編碼

將“二進(jìn)制數(shù)據(jù)”編碼為“64個(gè)可打印字符的組合”,以實(shí)現(xiàn)通過(guò)“可打印字符的形式”進(jìn)行存儲(chǔ)或者傳輸?shù)哪康?。無(wú)論是公鑰證書(shū),還是電子郵件數(shù)據(jù),經(jīng)常要用到Base64編碼,那么為什么要做一下這樣的編碼呢?因?yàn)樵谟?jì)算機(jī)中任何數(shù)據(jù)都是按ascii碼存儲(chǔ)的,而ascii碼的128~255之間的值是不可見(jiàn)字符。 而在網(wǎng)絡(luò)上交換數(shù)據(jù)時(shí),比如說(shuō)從A地傳到B地,往往要經(jīng)過(guò)多個(gè)路由設(shè)備, 由于不同的設(shè)備對(duì)字符的處理方式有一些不同,這樣那些不可見(jiàn)字符就有可能被處理錯(cuò)誤,這是不利于傳輸?shù)摹?所以就先把數(shù)據(jù)先做一個(gè)Base64編碼,統(tǒng)統(tǒng)變成可見(jiàn)字符,這樣出錯(cuò)的可能性就大降低了。
使用場(chǎng)景:

  • 在Web場(chǎng)景中,在有些地方限制了數(shù)據(jù)傳輸?shù)姆绞?。例如,在URL,只能傳遞文本。因此,如果想要傳輸一組二進(jìn)制數(shù)據(jù)(例如圖片)。那么可以選用Base64編碼,將二進(jìn)制數(shù)據(jù)編碼為可打印的字符串。這樣才能完成URL上二進(jìn)制數(shù)據(jù)的傳輸。
  • 對(duì)證書(shū)來(lái)說(shuō),特別是根證書(shū),一般都是作Base64編碼的,因?yàn)樗诰W(wǎng)上被許多人下載。
  • 電子郵件的附件一般也作Base64編碼的,因?yàn)橐粋€(gè)附件數(shù)據(jù)往往是有不可見(jiàn)字符的。
URL編碼

Url編碼的原則就是使用安全的字符(沒(méi)有特殊用途或者特殊意義的可打印字符)去表示那些不安全的字符從而達(dá)到適合傳輸?shù)哪康摹@纾河捎趗rl只能使用英文字母、數(shù)字和某些標(biāo)點(diǎn)符號(hào),不能使用其他文字和符號(hào),如果需要在URL中傳遞中文作為參數(shù),或者需要在URL中傳遞空格、&、?、=等等特殊符號(hào)。這個(gè)時(shí)候就需要進(jìn)行URL編碼。編碼的目的HTTP協(xié)議的內(nèi)在要求,通過(guò)這種形式,可以瀏覽器表單數(shù)據(jù)的打包。

3. 亂碼

一般,如果解碼之后無(wú)法正確還原原來(lái)所表達(dá)的信息,此時(shí)就出現(xiàn)了亂碼。例如,使用GB2312的方式去解碼一個(gè)UTF8編碼的文件,那么就會(huì)出現(xiàn)亂碼??偟膩?lái)說(shuō),亂碼通常來(lái)說(shuō)只是因?yàn)檫x用的解碼方式和編碼方式不同,而導(dǎo)致信息失真的情況。選用正確的編碼就能夠解讀出正確的信息。

在編碼或解碼時(shí),重點(diǎn)放在所有具有相同算法的人身上,并且該算法通常具有良好的文檔記錄、廣泛的分布和相當(dāng)容易實(shí)現(xiàn)的特點(diǎn)。任何人最終都能解碼編碼數(shù)據(jù)。

三. 摘要(哈希)

1. 什么是摘要?

摘要的目的是為了校驗(yàn)信息的完整性,保證信息在傳輸過(guò)程中不被篡改。例如我們下載一個(gè)壓縮包后可以查看壓縮包的MD5值。對(duì)比下載的壓縮包MD5值和網(wǎng)站提供的MD5值,如果兩個(gè)MD5值不一致,那么說(shuō)明該壓縮包不是官方提供的那個(gè)壓縮包,可能被替換成其他文件或被修改過(guò)。摘要只是用于驗(yàn)證數(shù)據(jù)完整性和唯一性的哈希值,不管原始數(shù)據(jù)是什么樣的,得到的哈希值都是固定長(zhǎng)度的。也就是說(shuō)摘要并不是原始數(shù)據(jù)加密后的密文,只是一個(gè)驗(yàn)證身份的令牌。所以我們無(wú)法通過(guò)摘要解密得到原始數(shù)據(jù)。

2. 哈希函數(shù)

散列函數(shù)(也叫哈希函數(shù),哈希函數(shù)又稱散列函數(shù),雜湊函數(shù),他是一個(gè)單向密碼體制,即從明文到密文的不可逆映射,只有加密過(guò)程沒(méi)有解密過(guò)程,哈希函數(shù)可以將任意長(zhǎng)度的輸入經(jīng)過(guò)變化后得到固定長(zhǎng)度的輸出,這個(gè)固定長(zhǎng)度的輸出稱為原消息的散列或消息映射。 理想的哈希函數(shù)可以針對(duì)不同的輸入得到不同的輸出,如果存在兩個(gè)不同的消息得到了相同的哈希值,那我們稱這是一個(gè)哈希碰撞),如果使用的是hash算法,在計(jì)算過(guò)程中原文的部分信息是丟失了的,所以是不可逆。

hash算法的目的:同樣的一段數(shù)據(jù)通過(guò)hash函數(shù)總是能得到相同的摘要,不同的數(shù)據(jù)通過(guò)hash函數(shù)總是應(yīng)該得到不同的摘要。hash的目的是理想化的,不管什么hash算法實(shí)際上總有特別小的概率會(huì)出現(xiàn)不同的原始數(shù)據(jù)通過(guò)hash函數(shù)可能會(huì)得到相同的結(jié)果,所以:越好的hash算法會(huì)將這個(gè)概率降到越低這個(gè)概率越低,黑客要通過(guò)手段碰撞出相同摘要的難度就越大。常見(jiàn)的算法有md5、 sha系列。

MD5

Md5是哈希算法的一種,Md5可以把任意數(shù)據(jù)轉(zhuǎn)換為定長(zhǎng)(或限制長(zhǎng)度)數(shù)據(jù)的算法。哈希算法的設(shè)計(jì)目標(biāo)本身就決定了,它在大多數(shù)時(shí)候都是不可逆的,即你經(jīng)過(guò)哈希算法得出的數(shù)據(jù),無(wú)法再經(jīng)過(guò)任何算法還原回去。所以,既然不能將數(shù)據(jù)還原,所以也就不存在解密;既然不能解密,那么哈希的過(guò)程也就不是加密了。

使用場(chǎng)景
出于以上的這種特性,MD5常用來(lái)校驗(yàn)密碼是否正確、校驗(yàn)下載文件是否完整無(wú)損:

  • 校驗(yàn)密碼是否正確:將用戶注冊(cè)的密碼MD5摘要后儲(chǔ)存起來(lái),待用戶登錄時(shí)將用戶錄入的密碼MD5摘要,對(duì)比兩次摘要后的信息是否相等,相等即密碼正確。(一般會(huì)進(jìn)行加鹽處理)
  • 校驗(yàn)下載文件是否完整無(wú)損:我們常下載開(kāi)源文件資源包時(shí),可以看到網(wǎng)站上提供的該資源包的MD5,下載文件完畢后,可通過(guò)自己的程序或直接去一些網(wǎng)站上計(jì)算其MD5碼,如果與官網(wǎng)上提供的一致,則表示文件完整無(wú)損。
SHA系列

sha系列有SHA2、SHA256、SHA512等,這些算法的復(fù)雜度相對(duì)要高(有興趣的可以搜索相關(guān)的算法實(shí)現(xiàn)及進(jìn)行學(xué)習(xí))。

3. MD5的破解

MD5本質(zhì)上不可逆,即不存在逆算法。MD5計(jì)算的過(guò)程中丟失了信息,一個(gè)MD5理論上的確是可能對(duì)應(yīng)無(wú)數(shù)多個(gè)原文的,因?yàn)镸D5是有限多個(gè)的而原文可以是無(wú)數(shù)多個(gè)。比如主流使用的MD5將任意長(zhǎng)度的“字節(jié)串映射為一個(gè)128bit的大整數(shù)。也就是一共有2128種可能,大概是3.4*1038,這個(gè)數(shù)字是有限多個(gè)的,而但是世界上可以被用來(lái)加密的原文則會(huì)有無(wú)數(shù)的可能性。雖然MD5本質(zhì)上不可逆但是大部分簡(jiǎn)單的字符串 通過(guò)MD5加密的話 某種程度上來(lái)說(shuō)是"可逆"的。原因是因?yàn)楹芏嗪?jiǎn)單字符串MD5計(jì)算后的值,實(shí)際上是可以通過(guò)查表法等方式得到MD5前的原始串。也就是說(shuō)MD5只能碰撞,無(wú)法真正破解。因?yàn)榇罅啃畔⒃趆ash過(guò)程中損失掉了。常用的密碼攻擊方式 常用的密碼攻擊方式有字典攻擊、暴力破解、查表法、反向查表法、彩虹表等。

  • 暴力破解:按照一定的順序一個(gè)一個(gè)的去試
  • 字典攻擊:把常用的密碼做成字典,破解時(shí)先看字典里是否存在,有效加快破解速度
  • 查表法:使用一個(gè)大型字典,把每個(gè)p和對(duì)應(yīng)的q都記錄下來(lái),按q做一下索引,直接查找匹配。
  • 彩虹表 :對(duì)于HASH的傳統(tǒng)做法是把H(X)的所有輸出窮舉,查找,得出。而彩虹表則是使用散列鏈的方式進(jìn)行。

4.MD5 加鹽(salt)

123456的MD5碼為e10adc3949ba59abbe56e057f20f883e。一般來(lái)說(shuō),MD5摘要的結(jié)果是128位的摘要信息,然后每4位用一個(gè)16進(jìn)制字符表示,所以,MD5摘要的結(jié)果一般顯示為32位的16進(jìn)制。如果你的系統(tǒng)用MD5摘要,并且無(wú)加鹽,還經(jīng)常使用123456為測(cè)試密碼,對(duì)這一串MD5碼一定很熟悉。這一些MD5碼就靜靜地躺在DB中待校驗(yàn)。如果數(shù)據(jù)庫(kù)被暴露(比如拖庫(kù)),壞人得到了這些MD5碼,就可以通過(guò)常用密碼與其MD5碼的映射關(guān)系,輕而易舉地翻譯出大多數(shù)密碼。所以,一般來(lái)說(shuō),我們需要對(duì)原始密碼進(jìn)行加鹽,所謂加鹽,就是按照一定規(guī)則擾亂原有字符串,然后再進(jìn)行MD5摘要。這個(gè)規(guī)則,自己定義,并且一定保密。

為了防止被暴力破解,可以加個(gè)密碼鹽,這樣的話暴力破解幾乎是搞不定了,即使搞定了可能也因?yàn)檫^(guò)去太久時(shí)間而變的沒(méi)有價(jià)值。

四. 加密解密

1. 加密的概念

數(shù)據(jù)加密的基本過(guò)程,就是對(duì)原來(lái)為明文文件或數(shù)據(jù)按某種算法進(jìn)行處理,使其成為不可讀的一段代碼,通常稱為 “密文”。通過(guò)這樣的途徑,來(lái)達(dá)到保護(hù)數(shù)據(jù)不被非法人竊取、閱讀的目的。對(duì)數(shù)據(jù)進(jìn)行轉(zhuǎn)換以后,數(shù)據(jù)變成了另一種格式,并且除了拿到解密方法的人,沒(méi)人能把數(shù)據(jù)轉(zhuǎn)換回來(lái)。維護(hù)數(shù)據(jù)機(jī)密性,即確保數(shù)據(jù)不會(huì)被預(yù)期收件人以外的任何人使用。例如你想給某人發(fā)送一封密信,或通過(guò)互聯(lián)網(wǎng)給人發(fā)送密碼,這些對(duì)隱秘性要求比較強(qiáng)的事情,就需要對(duì)信息進(jìn)行加密。因此,加密通常用于網(wǎng)絡(luò)通信。因?yàn)榫W(wǎng)絡(luò)上的通信數(shù)據(jù),任何人都有可能會(huì)拿到,把數(shù)據(jù)加密后再傳送,送達(dá)以后由對(duì)方解密后再查看,就可以防止網(wǎng)絡(luò)上的偷窺。

加密是可逆的,明文 + 秘鑰 = 加密信息,加密信息能通過(guò)密鑰被還原為原始信息。

2. 解密

加密的逆過(guò)程為解密,即將該編碼信息轉(zhuǎn)化為其原來(lái)數(shù)據(jù) 的過(guò)程。

3. 加密的種類(lèi)

加密又分為對(duì)稱加密非對(duì)稱加密,區(qū)別在于在加密和解密信息時(shí)秘鑰是不是同一個(gè)。若加解密使用相同密鑰,則稱為對(duì)稱密鑰加密,否則稱為非對(duì)稱密鑰加密

4. 對(duì)稱加密

對(duì)稱加密算法是應(yīng)用較早的加密算法,又稱為共享密鑰加密算法。在對(duì)稱加密算法中,使用的密鑰只有一個(gè),發(fā)送和接收雙方都使用這個(gè)密鑰對(duì)數(shù)據(jù)進(jìn)行加密解密。這就要求加密和解密方事先都必須知道加密的密鑰。

對(duì)稱加密

  • 數(shù)據(jù)加密過(guò)程:在對(duì)稱加密算法中,數(shù)據(jù)發(fā)送方將明文 (原始數(shù)據(jù))加密密鑰一起經(jīng)過(guò)特殊加密處理,生成復(fù)雜的加密密文進(jìn)行發(fā)送。

  • 數(shù)據(jù)解密過(guò)程:數(shù)據(jù)接收方收到密文后,若想讀取原數(shù)據(jù),則需要使用加密使用的密鑰及`相同算法的逆算法對(duì)加密的密文進(jìn)行解密,才能使其恢復(fù)成可讀明文。
    優(yōu)點(diǎn)
    對(duì)稱加密算法的特點(diǎn)是算法公開(kāi)、計(jì)算量小、加密速度快、加密效率高。對(duì)稱加密有很多種算法,由于它效率很高,所以被廣泛使用在很多加密協(xié)議的核心當(dāng)中。
    缺點(diǎn)
    交易雙方都使用同樣密鑰,容易泄露導(dǎo)致密鑰泄露,所以安全性得不到保證。

常見(jiàn)的對(duì)稱加密有DES,3DES,AES,Blowfish,Twofish,IDEA,RC6,CAST5等。

DES加密

Data Encryption Standard,DES 加密算法出自 IBM 的研究,后來(lái)被美國(guó)政府正式采用,之后開(kāi)始廣泛流傳。它的特點(diǎn)是數(shù)據(jù)加密標(biāo)準(zhǔn),速度較快,適用于加密大量數(shù)據(jù)的場(chǎng)合。但近些年使用越來(lái)越少,因?yàn)?DES 使用 56 位密鑰,以現(xiàn)代的計(jì)算能力,24 小時(shí)內(nèi)即可被輕易破解。

AES加密

AES的全稱是Advanced Encryption Standard,意思是高級(jí)加密標(biāo)準(zhǔn)。它的出現(xiàn)主要是為了取代DES加密算法的,因?yàn)槲覀兌贾繢ES算法的密鑰長(zhǎng)度是56Bit,因此算法的理論安全強(qiáng)度是2的56次方。比較容易被破解。而AES可以使用128、192、和256位密鑰,并且用128位分組加密和解密數(shù)據(jù),相對(duì)來(lái)說(shuō)安全很多。完善的加密算法在理論上是無(wú)法破解的,除非使用窮盡法。使用窮盡法破解密鑰長(zhǎng)度在128位以上的加密數(shù)據(jù)是不現(xiàn)實(shí)的,也僅存在理論上的可能性。統(tǒng)計(jì)顯示,即使使用目前世界上運(yùn)算速度最快的計(jì)算機(jī),窮盡128位密鑰也要花上幾十億年的時(shí)間,更不用說(shuō)去破解采用256位密鑰長(zhǎng)度的AES算法了。所以AES比較難被破解。

AES加密

  1. 填充:
    AES是分組密碼,分組密碼也就是把加密明文分成一組一組的,每組長(zhǎng)度相等,每次加密一組數(shù)據(jù),直到加密完整個(gè)明文。在AES標(biāo)準(zhǔn)規(guī)范中,分組長(zhǎng)度只能是128位,也就是說(shuō),每個(gè)分組為16個(gè)字節(jié)(每個(gè)字節(jié)8位)。密鑰的長(zhǎng)度可以使用128位、192位或256位。
    分組加密

上面說(shuō)到AES算法在對(duì)明文加密的時(shí)候,并不是把整個(gè)明文整個(gè)加密成一整段密文,而是把明文拆分成一個(gè)個(gè)獨(dú)立的明文塊,每一個(gè)明文塊長(zhǎng)度128bit。這些明文塊經(jīng)過(guò)AES加密器的復(fù)雜處理,生成一個(gè)個(gè)獨(dú)立的密文塊,這些密文塊拼接在一起,就是最終的AES加密結(jié)果。但是這里涉及到一個(gè)問(wèn)題:假如一段明文長(zhǎng)度是192bit,如果按每128bit一個(gè)明文塊來(lái)拆分的話,第二個(gè)明文塊只有64bit,不足128bit。這時(shí)候怎么辦呢?就需要對(duì)明文塊進(jìn)行填充(Padding)。AES在不同的語(yǔ)言實(shí)現(xiàn)中有許多不同的填充算法,我們只舉出集中典型的填充來(lái)介紹一下。

  • NoPadding:
    不做任何填充,但是要求明文必須是16字節(jié)的整數(shù)倍。

  • PKCS5Padding(默認(rèn)):
    如果明文塊少于16個(gè)字節(jié)(128bit),在明文塊末尾補(bǔ)足相應(yīng)數(shù)量的字符,且每個(gè)字節(jié)的值等于缺少的字符數(shù)。

  • ISO10126Padding:
    如果明文塊少于16個(gè)字節(jié)(128bit),在明文塊末尾補(bǔ)足相應(yīng)數(shù)量的字節(jié),最后一個(gè)字符值等于缺少的字符數(shù),其他字符填充隨機(jī)數(shù)。

需要注意的是,如果在AES加密的時(shí)候使用了某一種填充方式,解密的時(shí)候也必須采用同樣的填充方式。才能正確的完成解密。填充明文時(shí),如果明文長(zhǎng)度原本就是16字節(jié)的整數(shù)倍,那么除了NoPadding以外,其他的填充方式都會(huì)填充一組額外的16字節(jié)明文塊。

  1. 模式:
    AES的工作模式,體現(xiàn)在把明文塊加密成密文塊的處理過(guò)程中。AES加密算法提供了五種不同的工作模式:ECB、CBC、CTR、CFB、OFB,模式之間的主題思想是近似的,在處理細(xì)節(jié)上有一些差別。這里只介紹各個(gè)模式的基本定義(有興趣的可以自行搜索相應(yīng)的內(nèi)容閱讀)。
  • ECB模式(默認(rèn)):電碼本模式
  • CBC模式:密碼分組鏈接模式
  • CTR模式:計(jì)算器模式
  • CFB模式:密碼反饋模式
  • OFB模式:輸出反饋模式

同樣的,如果在AES加密的時(shí)候使用了某一種工作模式,解密的時(shí)候也必須采用同樣的工作模式。

5. 非對(duì)稱加密

非對(duì)稱加密算法,又稱為公開(kāi)密鑰加密算法。它需要兩個(gè)密鑰,一個(gè)稱為公開(kāi)密鑰 (public key),即公鑰,另一個(gè)稱為 私有密鑰 (private key),即 私鑰。

非對(duì)稱加密

  • 如果使用公鑰對(duì)數(shù)據(jù)進(jìn)行加密,只有用對(duì)應(yīng)的私鑰才能進(jìn)行解密。
  • 如果使用私鑰對(duì)數(shù)據(jù)進(jìn)行加密,只有用對(duì)應(yīng)的公鑰才能進(jìn)行解密。
  • 密鑰是成對(duì)出現(xiàn)。使用一對(duì)“私鑰-公鑰”,用私鑰加密的內(nèi)容只有對(duì)應(yīng)公鑰才能解開(kāi)。

常見(jiàn)的非對(duì)稱加密有RSA、ESA、ECC等。

RSA加密

RSA名稱來(lái)源于發(fā)明這個(gè)算法的三個(gè)人的姓氏組成,算法大致內(nèi)容就是對(duì)極大整數(shù)進(jìn)行因式分解。這種算法非??煽?,密鑰越長(zhǎng),它就越難破解(有興趣的可以搜索相關(guān)算法的實(shí)現(xiàn)進(jìn)行研究)。根據(jù)已經(jīng)披露的文獻(xiàn),目前被破解的最長(zhǎng) RSA密鑰是768個(gè)二進(jìn)制位。也就是說(shuō),長(zhǎng)度超過(guò)768位的密鑰,目前還無(wú)法破解。因此可以認(rèn)為,1024位的RSA密鑰基本安全,2048位的密鑰極其安全。目前主流的有RSA-1024, RSA-2048,RSA-4096等,數(shù)字代表的是密鑰長(zhǎng)度,密鑰長(zhǎng)度越長(zhǎng),安全性越高,但相應(yīng)的性能會(huì)下降

RSA算法優(yōu)點(diǎn)
  • 不需要進(jìn)行密鑰傳遞,提高了安全性。
  • 可以進(jìn)行數(shù)字簽名認(rèn)證。
RSA算法缺點(diǎn)
  • 加密解密效率不高,一般只適用于處理小量數(shù)據(jù)(如:密鑰)。
  • 容易遭受小指數(shù)攻擊。

RSA算法提供了生成公鑰和私鑰的方法,注意是成對(duì)生成的!一般將公鑰保存在客戶端、私鑰保存在服務(wù)端。黑客反編譯可能拿到公鑰,但是因?yàn)樗借€存儲(chǔ)在服務(wù)器,所以不用太擔(dān)心泄密。

在使用RSA加解密中必須考慮到的密鑰長(zhǎng)度、明文長(zhǎng)度密文長(zhǎng)度的問(wèn)題。明文長(zhǎng)度需要小于密鑰長(zhǎng)度,而密文長(zhǎng)度則等于密鑰長(zhǎng)度。因此當(dāng)加密內(nèi)容長(zhǎng)度大于密鑰長(zhǎng)度時(shí),有效的RSA加解密就需要對(duì)內(nèi)容進(jìn)行分段處理才能進(jìn)行加密。因?yàn)?,RSA算法本身要求加密內(nèi)容也就是明文長(zhǎng)度m必須0<m<密鑰長(zhǎng)度n。如果小于這個(gè)長(zhǎng)度就需要進(jìn)行padding(填充),因?yàn)槿绻麤](méi)有padding(填充),就無(wú)法確定解密后內(nèi)容的真實(shí)長(zhǎng)度。只要用到padding(填充),那么就要占用實(shí)際的明文長(zhǎng)度,而且這部分字節(jié)也是參與加密的。于是實(shí)際明文長(zhǎng)度需要減去padding字節(jié)長(zhǎng)度。例如:密鑰默認(rèn)是1024位,即1024位/8位-11=128-11=117字節(jié)。所以默認(rèn)加密前的明文最大長(zhǎng)度117字節(jié),解密密文最大長(zhǎng)度為128字。兩者相差11字節(jié)是因?yàn)镽SA加密使用到了填充模式(padding),即內(nèi)容不足117字節(jié)時(shí)會(huì)自動(dòng)填滿,
我們一般使用的padding標(biāo)準(zhǔn)有NoPPadding、OAEPPadding、PKCS1Padding等。

RSA加密中的Padding

嚴(yán)格地說(shuō)RSA也是一種“塊”加密/解密。加密前輸入長(zhǎng)度必須與“模”相同:不足需要填充(Padding);明文長(zhǎng)度大于“密鑰”長(zhǎng)度,則需要“分組”,最后一組同樣需要填充(Padding)。所以密鑰的長(zhǎng)度也大于加密明文的長(zhǎng)度,因此RSA不適合加密大段文本,一般用來(lái)加密一個(gè)對(duì)稱加密的密鑰,然后再用此對(duì)稱加密密鑰對(duì)大段文本加密。

  1. RSA_PKCS1_PADDING 填充模式,
    最常用的模式,當(dāng)你選擇 RSA_PKCS1_PADDING 填充模式時(shí),如果你的明文不夠 128 字節(jié), 加密的時(shí)候會(huì)在你的明文中隨機(jī)填充一些數(shù)據(jù),所以會(huì)導(dǎo)致對(duì)同樣的明文每次加密后的結(jié)果都不一樣。對(duì)于加密后的密文,解密端使用相同的填充方式都能解密。解密后的明文也就是之前加密的明文。
  • 輸入:必須 比 RSA 鑰模長(zhǎng)(modulus) 短至少11個(gè)字節(jié), 也就是RSA_size(rsa) – 11如果輸入的明文過(guò)長(zhǎng),必須切割,然后填充。
  • 輸出:和密鑰一樣長(zhǎng)。
  1. for RSA_NO_PADDING
    不填充模式,當(dāng)在客戶端選擇 RSA_NO_PADDING 填充模式時(shí),如果你的明文不夠 128 字節(jié), 加密的時(shí)候會(huì)在你的明文前面,前向的填充零。
    解密后的明文也會(huì)包括前面填充的零,這是服務(wù)器需要注意把解密后的字段前向填充的零去掉,才是真正之前加密的明文。
  • 輸入:可以和RSA鑰模長(zhǎng)一樣長(zhǎng),如果輸入的明文過(guò)長(zhǎng),必須切割,然后填充。
  • 輸出:和密鑰一樣長(zhǎng)。
  1. RSA_PKCS1_OAEP_PADDING
    是 PKCS#1 推出的新的填充方式,安全性是最高的,和前面 RSA_PKCS1_PADDING 的區(qū)別就是加密前的編碼方式不一樣
  • 輸入:RSA_size(rsa) – 41。
  • 輸出:和密鑰一樣長(zhǎng)。

不同的填充方式加解密也是不同的,使用的時(shí)候要注意

五.數(shù)字簽名和驗(yàn)簽

1. 數(shù)字簽名

A:數(shù)字簽名技術(shù)是將明文進(jìn)行特定HASH函數(shù)得到的摘要信息(消息完整性),再將摘要信息用A的私鑰加密(身份認(rèn)證),得到數(shù)字簽名,將密文和數(shù)字簽名一塊發(fā)給B。

B:收到A的消息后,先將密文用自己的私鑰解密,得到明文。將數(shù)字簽名用A的公鑰進(jìn)行解密后,得到正確的摘要(解密成功說(shuō)明A的身份被認(rèn)證了)。
對(duì)明文進(jìn)行摘要運(yùn)算,得到實(shí)際收到的摘要,將兩份摘要進(jìn)行對(duì)比,如果一致,說(shuō)明消息沒(méi)有被篡改(消息完整性)。

2. 數(shù)字簽名的作用

  • 一是能確定消息的不可抵賴性,因?yàn)樗思倜安涣税l(fā)送方的私鑰簽名。發(fā)送方是用自己的私鑰對(duì)信息進(jìn)行加密的,只有使用發(fā)送方的公鑰才能解密。
  • 二是數(shù)字簽名能保障消息的完整性。一次數(shù)字簽名采用一個(gè)特定的哈希函數(shù),它對(duì)不同文件產(chǎn)生的數(shù)字摘要的值也是不相同的。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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