中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

溫州網(wǎng)站建設(shè)風(fēng)格網(wǎng)絡(luò)熱詞英語(yǔ)

溫州網(wǎng)站建設(shè)風(fēng)格,網(wǎng)絡(luò)熱詞英語(yǔ),做網(wǎng)站代理商,佛山三水區(qū)有沒(méi)有網(wǎng)站建設(shè)公司面對(duì)MD5、SHA、DES、AES、RSA等等這些名詞你是否有很多問(wèn)號(hào)?這些名詞都是什么?還有什么公鑰加密、私鑰解密、私鑰加簽、公鑰驗(yàn)簽。這些都什么鬼?或許在你日常工作沒(méi)有聽(tīng)說(shuō)過(guò)這些名詞,但是一旦你要設(shè)計(jì)一個(gè)對(duì)外訪問(wèn)的接口&#xff…

面對(duì)MD5、SHA、DES、AES、RSA等等這些名詞你是否有很多問(wèn)號(hào)?這些名詞都是什么?還有什么公鑰加密、私鑰解密、私鑰加簽、公鑰驗(yàn)簽。這些都什么鬼?或許在你日常工作沒(méi)有聽(tīng)說(shuō)過(guò)這些名詞,但是一旦你要設(shè)計(jì)一個(gè)對(duì)外訪問(wèn)的接口,或者安全性要求高的系統(tǒng),那么必然會(huì)接觸到這些名詞。所以加解密、加簽驗(yàn)簽對(duì)于一個(gè)合格的程序員來(lái)說(shuō)是必須要掌握的一個(gè)概念。那么加解密相關(guān)的密碼學(xué)真的離我們很遙遠(yuǎn)嗎?其實(shí)生活中有很多常見(jiàn)的場(chǎng)景其實(shí)都用到了密碼學(xué)的相關(guān)知識(shí),我們不要把它想得太難。

例如在《睡在我上鋪的兄弟》這一段中作弊繞口令中,小癟三代表A,小赤佬代表B,唉呀媽呀代表C,坑爹呀是D,這一段繞口令其實(shí)也是密碼學(xué)的一種。有興趣的小伙伴可以看一下這一片段繞口令片段。所以其實(shí)密碼學(xué)與我們生活息息相關(guān),接下來(lái)我們就一文徹底搞懂這些概念。

《睡在我上鋪的兄弟》作弊繞口令片段:

https://www.bilibili.com/video/av3696396/

沒(méi)有硝煙的戰(zhàn)場(chǎng)——淺談密碼技術(shù)

沒(méi)有根基也許可以建一座小屋,但絕對(duì)不能造一座堅(jiān)固的大廈。

密碼這個(gè)詞有很多種的解釋,在現(xiàn)代社會(huì)如果不接觸編程的話,那么普遍的認(rèn)為是我們?cè)O(shè)置的登錄密碼、或者是去銀行取錢時(shí)輸入的數(shù)字。都是我們?cè)谧?cè)時(shí)實(shí)現(xiàn)給提供服務(wù)的一方存儲(chǔ)一組數(shù)字,以后我們登錄的時(shí)候就用這組數(shù)字相當(dāng)于就證明了我們的身份。這個(gè)數(shù)字通常來(lái)說(shuō)就是叫做密碼。

而我們需要了解的不是上面說(shuō)的密碼,而是一種“密碼術(shù)”,就是對(duì)于要傳遞的信息按照某種規(guī)則進(jìn)行轉(zhuǎn)換,從而隱藏信息的內(nèi)容。這種方法可以使機(jī)密信息得以在公開(kāi)的渠道傳遞而不泄密。使用這種方法,要經(jīng)過(guò)加密過(guò)程。在加密過(guò)程中我們需要知道下面的這些概念:

  • 原文:或者叫明文,就是被隱藏的文字。

  • 加密法:指隱藏原文的法則。

  • 密文:或者叫偽文,指對(duì)原文按照加密法處理過(guò)后生成的可公開(kāi)傳遞的文字。

  • 密鑰:在加密法中起決定性的因素,可能是數(shù)字、詞匯,也可能是一些字母,或者這些東西的組合。

加密的結(jié)果生成了密文,要想讓接受者能夠讀懂這些密文,那么就要把加密法以及密鑰告訴接受者,否者接受者無(wú)法對(duì)密文解密,也就無(wú)法讀懂原文。

從歷史的角度來(lái)看,密碼學(xué)大概可以分為古典密碼學(xué)和近現(xiàn)代密碼學(xué)兩個(gè)階段。兩者以現(xiàn)代信息技術(shù)的誕生為分界點(diǎn),現(xiàn)在所討論的密碼學(xué)多指的是后者,建立在信息論和數(shù)學(xué)成果基礎(chǔ)之上的。

古典密碼學(xué)

古典密碼學(xué)源自于數(shù)千年前,最早在公元前 1900 年左右的古埃及,就出現(xiàn)了通過(guò)使用特殊字符和簡(jiǎn)單替換式密碼來(lái)保護(hù)信息。美索不達(dá)米亞平原上曾經(jīng)出土一個(gè)公元前 1500 年左右的泥板,其上記錄了加密描述的陶瓷器上釉的工藝配方。古希臘時(shí)期(公元前 800 ﹣前 146 年)還發(fā)明了通過(guò)物理手段來(lái)隱藏信息的“隱寫術(shù)”,例如使用牛奶書寫、用蠟覆蓋文字等。后來(lái)在古羅馬時(shí)期還出現(xiàn)了基于替換加密的凱撒密碼,據(jù)稱凱撒曾用此方法與其部下通信而得以命名。這些手段多數(shù)是采用簡(jiǎn)單的機(jī)械工具來(lái)保護(hù)秘密,在今天看來(lái)毫無(wú)疑問(wèn)是十分簡(jiǎn)陋,很容易猜出來(lái)的。嚴(yán)格來(lái)看,可能都很難稱為密碼科學(xué)。

凱撒密碼是當(dāng)偏移量是 3 的時(shí)候,所有的字母都 A 都將被替換成 D,B 變成 E,以此類推。

圖片

凱撒密碼

近代密碼學(xué)

近代密碼學(xué)的研究來(lái)自于第一、二次世界大戰(zhàn)中對(duì)于軍事通信進(jìn)行保護(hù)和猜出來(lái)的需求。1901年12月,意大利的工程師 Guglielmo Marconi(奎里亞摩?馬可尼)成功完成了跨越大西洋的無(wú)線電通信的實(shí)驗(yàn),在全球范圍內(nèi)引發(fā)轟動(dòng),推動(dòng)了無(wú)線電通信時(shí)代的到來(lái)。無(wú)線電大大提高了遠(yuǎn)程通信的能力,但是它有一個(gè)天然的缺陷——很難限制接收方,這就意味著你所傳的信息有可能被攔截,因此就催生了加密技術(shù)的發(fā)展。

對(duì)于無(wú)線電信息進(jìn)行加密和解密也直接促進(jìn)了近現(xiàn)代密碼學(xué)和計(jì)算機(jī)技術(shù)的出現(xiàn)。反過(guò)來(lái)這些科技進(jìn)步也影響了時(shí)代的發(fā)展。一戰(zhàn)時(shí)期德國(guó)外交部長(zhǎng) Arthur Zimmermann(阿瑟?齊默爾曼)拉攏墨西哥構(gòu)成抗美軍事同盟的電報(bào)(1917年1月16日)被英國(guó)情報(bào)機(jī)構(gòu)— 40 號(hào)辦公室破譯,直接導(dǎo)致了美國(guó)的參戰(zhàn);二戰(zhàn)時(shí)期德國(guó)使用的恩尼格瑪(Enigma)密碼機(jī)(當(dāng)時(shí)最先進(jìn)的加密設(shè)備)被盟軍成功破譯(1939年到1941年),導(dǎo)致大西洋戰(zhàn)役德國(guó)失敗。據(jù)稱,二戰(zhàn)時(shí)期光英國(guó)從事密碼學(xué)研究的人員就達(dá)到 7000 人,而他們的成果使二戰(zhàn)結(jié)束的時(shí)間至少提前了一到兩年時(shí)間。

接下來(lái)就是可以稱之為是密碼學(xué)發(fā)展史上里程碑的事件了。1945年9月1日,Claude Elwood Shannon(克勞德?艾爾伍德?香農(nóng))完成了劃時(shí)代的內(nèi)部報(bào)告《A Mathematical Theory of Cryptography(密碼術(shù)的一個(gè)數(shù)學(xué)理論)》,1949 年 10 月,該報(bào)告以《Communication Theory of Secrecy Systems(保密系統(tǒng)的通信理論)》為題在 Bell System Technical Journal(貝爾系統(tǒng)技術(shù)期刊)上正式發(fā)表。這篇論文首次將密碼學(xué)和信息論聯(lián)系到一起,為對(duì)稱密碼技術(shù)提供了數(shù)學(xué)基礎(chǔ)。這也標(biāo)志著近現(xiàn)代密碼學(xué)的正式建立。這也是密碼學(xué)發(fā)展史上的第一座里程碑性事件。

密碼學(xué)發(fā)展史上的第二個(gè)里程碑性事件是 DES 的出現(xiàn)。DES 全稱為 Data Encryption Standard,即數(shù)據(jù)加密標(biāo)準(zhǔn),是一種使用密鑰加密的分組密碼算法,1977年被美國(guó)聯(lián)邦政府的國(guó)家標(biāo)準(zhǔn)局確定為聯(lián)邦資料處理標(biāo)準(zhǔn)(FIPS),并授權(quán)在非密級(jí)政府通信中使用,隨后該算法在國(guó)際上廣泛流傳開(kāi)來(lái)。

密碼學(xué)發(fā)展史上的第三個(gè)里程碑性事件就是我們區(qū)塊鏈中廣泛應(yīng)用的公鑰密碼,也就是非對(duì)稱密碼算法的出現(xiàn)。1976年11月,Whitfield Diffie 和 Martin E.Hellman 在 IEEE Transactions on Information Theory 上發(fā)表了論文《New Directions in Cryptography(密碼學(xué)的新方向)》,探討了無(wú)需傳輸密鑰的保密通信和簽名認(rèn)證體系問(wèn)題,正式開(kāi)創(chuàng)了現(xiàn)代公鑰密碼學(xué)體系的研究。在公鑰密碼發(fā)現(xiàn)以前,如果需要保密通信,通信雙方事先要對(duì)加解密的算法以及要使用的密鑰進(jìn)行事先協(xié)商,包括送雞毛信,實(shí)際上是在傳送密鑰。但自從有了公鑰密碼,需要進(jìn)行秘密通信的雙方不再需要進(jìn)行事前的密鑰協(xié)商了。公鑰密碼在理論上是不保密的,在實(shí)際上是保密的。也就是說(shuō),公鑰密碼是可以猜出來(lái)的,但需要極長(zhǎng)的時(shí)間,等到猜出來(lái)了,這個(gè)秘密也沒(méi)有保密的必要了。

上面我們說(shuō)到了關(guān)于近現(xiàn)代的密碼學(xué)相關(guān)的東西,基本上總結(jié)下來(lái)我們現(xiàn)在常用的就兩個(gè),一個(gè)是對(duì)稱加密算法,一個(gè)是非對(duì)稱加密算法。那么接下來(lái)我們就以介紹這兩個(gè)概念為主線引出開(kāi)題中我們提到的概念。

程序?qū)崿F(xiàn)

對(duì)稱加密算法

對(duì)稱加密指的就是加密和解密使用同一個(gè)秘鑰,所以叫做對(duì)稱加密。對(duì)稱加密只有一個(gè)秘鑰,作為私鑰。具體的算法有:DES、3DES、TDEA、Blowfish、RC5、IDEA。但是我們常見(jiàn)的有:DES、AES 等等。

那么對(duì)稱加密的優(yōu)點(diǎn)是什么呢?算法公開(kāi)、計(jì)算量小、加密速度快、加密效率高。缺點(diǎn)就是秘鑰的管理和分發(fā)是非常困難的,不夠安全。在數(shù)據(jù)傳送前,發(fā)送方和接收方必須商定好秘鑰,然后雙方都必須要保存好秘鑰,如果一方的秘鑰被泄露了,那么加密的信息也就不安全了。另外,每對(duì)用戶每次使用對(duì)稱加密算法時(shí),都需要使用其他人不知道的唯一秘鑰,這會(huì)使得收、發(fā)雙方所擁有的的鑰匙數(shù)量巨大,秘鑰管理也會(huì)成為雙方的負(fù)擔(dān)。

加密的過(guò)程我們可以理解為如下:

  • 加密:原文+秘鑰 = 密文

  • 解密:密文-秘鑰 = 原文

可以看到兩次過(guò)程使用的都是一個(gè)秘鑰。用圖簡(jiǎn)單表示如下:

圖片

實(shí)戰(zhàn)演練

既然我們知道關(guān)于對(duì)稱加密算法的相關(guān)知識(shí),那么我們?nèi)粘S?Java 如何實(shí)現(xiàn)對(duì)稱加密的加密和解密動(dòng)作呢?常見(jiàn)的對(duì)稱加密算法有:DES、AES 等。

DES

DES 加密算法是一種分組密碼,以 64 位為分組對(duì)數(shù)據(jù)加密,它的密鑰長(zhǎng)度是 56 位,加密解密用同一算法。DES 加密算法是對(duì)密鑰進(jìn)行保密,而公開(kāi)算法,包括加密和解密算法。這樣,只有掌握了和發(fā)送方相同密鑰的人才能解讀由 DES 加密算法加密的密文數(shù)據(jù)。因此,破譯 DES 加密算法實(shí)際上就是搜索密鑰的編碼。對(duì)于 56 位長(zhǎng)度的密鑰來(lái)說(shuō),如果用窮舉法來(lái)進(jìn)行搜索的話,其運(yùn)算次數(shù)為 2 的 56 次方。

接下來(lái)用 Java 實(shí)現(xiàn) DES 加密

private final static String DES = "DES";
public static void main(String[] args) throws Exception {    String data = "123 456";    String key = "wang!@#$";    System.err.println(encrypt(data, key));    System.err.println(decrypt(encrypt(data, key), key));
}
/**    * Description 根據(jù)鍵值進(jìn)行加密    * @param data    * @param key  加密鍵byte數(shù)組    * @return    * @throws Exception    */public static String encrypt(String data, String key) throws Exception {    byte[] bt = encrypt(data.getBytes(), key.getBytes());    String strs = new BASE64Encoder().encode(bt);    return strs;}
/**    * Description 根據(jù)鍵值進(jìn)行解密    * @param data    * @param key  加密鍵byte數(shù)組    * @return    * @throws IOException    * @throws Exception    */public static String decrypt(String data, String key) throws IOException,        Exception {    if (data == null)        return null;    BASE64Decoder decoder = new BASE64Decoder();    byte[] buf = decoder.decodeBuffer(data);    byte[] bt = decrypt(buf,key.getBytes());    return new String(bt);}
/**    * Description 根據(jù)鍵值進(jìn)行加密    * @param data    * @param key  加密鍵byte數(shù)組    * @return    * @throws Exception    */private static byte[] encrypt(byte[] data, byte[] key) throws Exception {    // 生成一個(gè)可信任的隨機(jī)數(shù)源    SecureRandom sr = new SecureRandom();
    // 從原始密鑰數(shù)據(jù)創(chuàng)建DESKeySpec對(duì)象    DESKeySpec dks = new DESKeySpec(key);
    // 創(chuàng)建一個(gè)密鑰工廠,然后用它把DESKeySpec轉(zhuǎn)換成SecretKey對(duì)象    SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);    SecretKey securekey = keyFactory.generateSecret(dks);
    // Cipher對(duì)象實(shí)際完成加密操作    Cipher cipher = Cipher.getInstance(DES);
    // 用密鑰初始化Cipher對(duì)象    cipher.init(Cipher.ENCRYPT_MODE, securekey, sr);
    return cipher.doFinal(data);}/**    * Description 根據(jù)鍵值進(jìn)行解密    * @param data    * @param key  加密鍵byte數(shù)組    * @return    * @throws Exception    */private static byte[] decrypt(byte[] data, byte[] key) throws Exception {    // 生成一個(gè)可信任的隨機(jī)數(shù)源    SecureRandom sr = new SecureRandom();
    // 從原始密鑰數(shù)據(jù)創(chuàng)建DESKeySpec對(duì)象    DESKeySpec dks = new DESKeySpec(key);
    // 創(chuàng)建一個(gè)密鑰工廠,然后用它把DESKeySpec轉(zhuǎn)換成SecretKey對(duì)象    SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);    SecretKey securekey = keyFactory.generateSecret(dks);
    // Cipher對(duì)象實(shí)際完成解密操作    Cipher cipher = Cipher.getInstance(DES);
    // 用密鑰初始化Cipher對(duì)象    cipher.init(Cipher.DECRYPT_MODE, securekey, sr);
    return cipher.doFinal(data);}

輸出以后可以看到數(shù)據(jù)被加密了:???????

5fiw/XhRJ0E=123 456

在 Java 中用 DES 加密有一個(gè)特殊的地方

  1. 秘鑰設(shè)置的長(zhǎng)度必須大于等于 8。

  2. 秘鑰設(shè)置的長(zhǎng)度如果大于 8 的話,那么只會(huì)取前 8 個(gè)字節(jié)作為秘鑰。

為什么呢,我們可以看到在初始化 DESKeySpec 類的時(shí)候有下面一段,其中 var1 是我們傳的秘鑰??梢钥吹剿M(jìn)行了截取,只截取前八個(gè)字節(jié)。???????

public DESKeySpec(byte[] var1, int var2) throws InvalidKeyException {    if (var1.length - var2 < 8) {        throw new InvalidKeyException("Wrong key size");    } else {        this.key = new byte[8];        System.arraycopy(var1, var2, this.key, 0, 8);    }}

AES

AES 加密算法是密碼學(xué)中的高級(jí)加密標(biāo)準(zhǔn),該加密算法采用對(duì)稱分組密碼體制,密鑰長(zhǎng)度的最少支持為 128、192、256,分組長(zhǎng)度 128 位,算法應(yīng)易于各種硬件和軟件實(shí)現(xiàn)。這種加密算法是美國(guó)聯(lián)邦政府采用的區(qū)塊加密標(biāo)準(zhǔn),AES 標(biāo)準(zhǔn)用來(lái)替代原先的 DES,已經(jīng)被多方分析且廣為全世界所使用。

JCE(Java Cryptography Extension)在早期JDK版本中,由于受美國(guó)的密碼出口條例約束,Java 中涉及加解密功能的 API 被限制出口,所以 Java 中安全組件被分成了兩部分: 不含加密功能的 JCA(Java Cryptography Architecture )和含加密功能的 JCE(Java Cryptography Extension)。

JCE 的 API 都在 javax.crypto 包下,核心功能包括:加解密、密鑰生成(對(duì)稱)、MAC 生成、密鑰協(xié)商。

加解密功能由 Cipher 組件提供,其也是 JCE 中最核心的組件。

在設(shè)置 Cipher 類的時(shí)候有幾個(gè)注意點(diǎn)

  1. Cipher 在使用時(shí)需以參數(shù)方式指定 transformation。

  2. transformation 的格式為 algorithm/mode/padding,其中 algorithm 為必輸項(xiàng),如: AES/DES/CBC/PKCS5Padding,具體有哪些可看下表。

  3. 缺省的 mode 為 ECB,缺省的 padding 為 PKCS5Padding。

  4. 在 block 算法與流加密模式組合時(shí), 需在 mode 后面指定每次處理的 bit 數(shù), 如 DES/CFB8/NoPadding, 如未指定則使用缺省值, SunJCE 缺省值為 64bits。

  5. Cipher 有 4 種操作模式:ENCRYPT_MODE(加密)、DECRYPT_MODE(解密)、WRAP_MODE(導(dǎo)出Key)、UNWRAP_MODE(導(dǎo)入Key),初始化時(shí)需指定某種操作模式。

算法/模式/填充16字節(jié)加密后數(shù)據(jù)長(zhǎng)度不滿16字節(jié)加密后長(zhǎng)度
AES/CBC/NoPadding16不支持
AES/CBC/PKCS5Padding3216
AES/CBC/ISO10126Padding3216
AES/CFB/NoPadding16原始數(shù)據(jù)長(zhǎng)度
AES/CFB/PKCS5Padding3216
AES/CFB/ISO10126Padding3216
AES/ECB/NoPadding16不支持
AES/ECB/PKCS5Padding3216
AES/ECB/ISO10126Padding3216
AES/OFB/NoPadding16原始數(shù)據(jù)長(zhǎng)度
AES/OFB/PKCS5Padding3216
AES/OFB/ISO10126Padding3216
AES/PCBC/NoPadding16不支持
AES/PCBC/PKCS5Padding3216
AES/PCBC/ISO10126Padding3216

秘鑰的可以由我們自己定義,也可以是由AES自己生成,當(dāng)自己定義是需要是要注意:

  1. 根據(jù) AES 規(guī)范,可以是 16 字節(jié)、24 字節(jié)和32 字節(jié)長(zhǎng),分別對(duì)應(yīng) 128 位、192 位和 256 位;

  2. 為便于傳輸,一般對(duì)加密后的數(shù)據(jù)進(jìn)行 base64 編碼:

public static void main(String[] args) throws Exception {    /*        * 此處使用AES-128-ECB加密模式,key需要為16位。        */    String cKey = "1234567890123456";    // 需要加密的字串    String cSrc = "buxuewushu";    System.out.println(cSrc);    // 加密    String enString = Encrypt(cSrc, cKey);    System.out.println("加密后的字串是:" + enString);
    // 解密    String DeString = Decrypt(enString, cKey);    System.out.println("解密后的字串是:" + DeString);}
// 加密public static String Encrypt(String sSrc, String sKey) throws Exception {    if (sKey == null) {        System.out.print("Key為空null");        return null;    }    // 判斷Key是否為16位    if (sKey.length() != 16) {        System.out.print("Key長(zhǎng)度不是16位");        return null;    }    byte[] raw = sKey.getBytes("utf-8");    SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");    Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");//"算法/模式/補(bǔ)碼方式"    cipher.init(Cipher.ENCRYPT_MODE, skeySpec);    byte[] encrypted = cipher.doFinal(sSrc.getBytes("utf-8"));
    return new Base64().encodeToString(encrypted);//此處使用BASE64做轉(zhuǎn)碼功能,同時(shí)能起到2次加密的作用。}
// 解密public static String Decrypt(String sSrc, String sKey) throws Exception {    try {        // 判斷Key是否正確        if (sKey == null) {            System.out.print("Key為空null");            return null;        }        // 判斷Key是否為16位        if (sKey.length() != 16) {            System.out.print("Key長(zhǎng)度不是16位");            return null;        }        byte[] raw = sKey.getBytes("utf-8");        SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");        cipher.init(Cipher.DECRYPT_MODE, skeySpec);        byte[] encrypted1 = new Base64().decode(sSrc);//先用base64解密        try {            byte[] original = cipher.doFinal(encrypted1);            String originalString = new String(original,"utf-8");            return originalString;        } catch (Exception e) {            System.out.println(e.toString());            return null;        }    } catch (Exception ex) {        System.out.println(ex.toString());        return null;    }}

非對(duì)稱加密算法

非對(duì)稱加密算法中加密和解密用的不是同一個(gè)秘鑰,所以叫作非對(duì)稱加密算法。在非對(duì)稱加密算法每個(gè)用戶都有兩把鑰匙,一把公鑰一把私鑰。公鑰是對(duì)外發(fā)布的,所有人都看的到所有人的公鑰,私鑰是自己保存,每個(gè)人都只知道自己的私鑰而不知道別人的。而也正是在非對(duì)稱加密算法中有加密和解密、加簽和驗(yàn)簽的概念。接下來(lái)我們解釋一下這幾個(gè)概念是什么意思。

加密和解密

用該用戶的公鑰加密后只能該用戶的私鑰才能解密。這種情況下,公鑰是用來(lái)加密信息的,確保只有特定的人(用誰(shuí)的公鑰就是誰(shuí))才能解密該信息。所以這種我們稱之為加密和解密。

下面我拿 A 銀行和小明來(lái)舉例子吧。假設(shè)這2者之間是用不對(duì)稱的加密算法來(lái)保證信息傳輸?shù)陌踩?#xff08;不被第三人知道信息的含義及篡改信息)。大致流程如下:首先小明發(fā)了一條信息給A銀行“我要存500元”。這條信息小明會(huì)根據(jù)A銀行的對(duì)外發(fā)布的公鑰把這條信息加密了,加密之后,變成“XXXXXXX”發(fā)給A銀行。中間被第三者截獲,由于沒(méi)有A銀行的私鑰無(wú)法解密,不能知道信息的含義,也無(wú)法按正確的方式篡改。所以拿這條加密信息是沒(méi)辦法的。最后被 A 銀行接受,A銀行用自己的私鑰去解密這條信息,解密成功,讀取內(nèi)容,執(zhí)行操作。然后得知消息是小明發(fā)來(lái)的,便去拿小明的公鑰,把“操作成功(或失敗)”這條信息用小明的公鑰加密,發(fā)給小明。同理最后小明用自己的私鑰解開(kāi),得知知乎發(fā)來(lái)的信息內(nèi)容。其他人截獲因?yàn)闆](méi)有小明的私鑰所以也沒(méi)有用。

加簽和驗(yàn)簽

還有第二種情況,公鑰是用來(lái)解密信息的,確保讓別人知道這條信息是真的由我發(fā)布的,是完整正確的。接收者由此可知這條信息確實(shí)來(lái)自于擁有私鑰的某人,這被稱作數(shù)字簽名,公鑰的形式就是數(shù)字證書。所以這種我們稱之為加簽驗(yàn)簽

繼續(xù)拿小明和銀行 A 舉例子。銀行 A 發(fā)布了一個(gè)銀行客戶端的補(bǔ)丁供所有用戶更新,那為了確保人家下載的是正確完整的客戶端,銀行A會(huì)為這個(gè)程序打上一個(gè)數(shù)字簽名(就是用銀行A的私鑰對(duì)這個(gè)程序加密然后發(fā)布),你需要在你的電腦里裝上銀行 A 的數(shù)字證書(就是銀行對(duì)外發(fā)布的公鑰),然后下載好這個(gè)程序,數(shù)字證書會(huì)去解密這個(gè)程序的數(shù)字簽名,解密成功,補(bǔ)丁得以使用。同時(shí)你能知道這個(gè)補(bǔ)丁確實(shí)是來(lái)自這個(gè)銀行 A,是由他發(fā)布的,而不是其他人發(fā)布的。

實(shí)戰(zhàn)演練

我們?cè)陂_(kāi)發(fā)過(guò)程中經(jīng)常使用的非對(duì)稱加密算法就是?RSA 算法。接下來(lái)我們使用 Java 實(shí)現(xiàn) RSA 算法。

生成密鑰

首先是生成 key 的部分。生成 key 有好多種做法,這里我介紹三種:

1. 命令行:可以使用openssl進(jìn)行生成公鑰和私鑰。

-- 生成公鑰和私鑰openssl genrsa -out key.pem 1024        -out 指定生成文件,此文件包含公鑰和私鑰兩部分,所以即可以加密,也可以解密????????1024?生成密鑰的長(zhǎng)度

2.使用網(wǎng)站:生成密鑰的網(wǎng)站。

http://web.chacuo.net/netrsakeypair

3.使用代碼:可以指定生成密鑰的長(zhǎng)度,最低是 512。

public static KeyPair buildKeyPair() throws NoSuchAlgorithmException {    final int keySize = 2048;    KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(RSA_ALGORITHM);    keyPairGenerator.initialize(keySize);    return keyPairGenerator.genKeyPair();}
加密

有了密鑰,就可以進(jìn)行加密的操作了,接下來(lái)就介紹關(guān)于 RSA 的加密操作,非常簡(jiǎn)單只要傳進(jìn)來(lái)公鑰和需要加密的數(shù)據(jù)即可。???????

public static byte[] encrypt(PublicKey publicKey, String message) throws Exception {    Cipher cipher = Cipher.getInstance(RSA_ALGORITHM);    cipher.init(Cipher.ENCRYPT_MODE, publicKey);
    return cipher.doFinal(message.getBytes(UTF8));}
解密???????
public static byte[] decrypt(PrivateKey privateKey, byte [] encrypted) throws Exception {    Cipher cipher = Cipher.getInstance(RSA_ALGORITHM);    cipher.init(Cipher.DECRYPT_MODE, privateKey);
    return cipher.doFinal(encrypted);}
加簽???????
/** * 使用RSA簽名 */private static String signWithRSA(String content, PrivateKey privateKey) throws Exception {    Signature signature = Signature.getInstance("SHA1WithRSA");    signature.initSign(privateKey);    signature.update(content.getBytes("utf-8"));    byte[] signed = signature.sign();    return base64Encode(signed);}
驗(yàn)簽
/** * 使用RSA驗(yàn)簽 */private static boolean checkSignWithRSA(String content, PublicKey publicKey,String sign) throws Exception {    Signature signature = Signature.getInstance("SHA1WithRSA");    signature.initVerify(publicKey);    signature.update(content.getBytes("utf-8"));    return signature.verify(base64Decode(sign));}

在加簽驗(yàn)簽的時(shí)候需要傳入一個(gè)數(shù)字簽名標(biāo)準(zhǔn),我們這里填的是?SHA1WithRSA,它的意思是用 SHA 算法進(jìn)行簽名,用 RSA 算法進(jìn)行加密。

算法說(shuō)明:在對(duì)進(jìn)行 SHA1 算法進(jìn)行摘要計(jì)算后,要求對(duì)計(jì)算出的摘要進(jìn)行處理,而不是直接進(jìn)行 RSA算 法進(jìn)行加密。要求把 SHA1 摘要的數(shù)據(jù)進(jìn)行壓縮到 20 個(gè)字節(jié)。在前面插入 15 個(gè)字節(jié)標(biāo)示數(shù)據(jù)。所以結(jié)構(gòu)如下:

30(數(shù)據(jù)類型結(jié)構(gòu))21(總長(zhǎng)度)30(數(shù)據(jù)類型)09(長(zhǎng)度)06?05?2B?0E?03?02?1A?0500【數(shù)據(jù)具體類型不清楚-請(qǐng)專家指正】?04?(數(shù)據(jù)類型)?14?(長(zhǎng)度)?+?SHA1簽名數(shù)據(jù)

最后進(jìn)行RSA加密。所以我們填寫的 XXXWithRSA,這個(gè) XXX 代表的就是使用什么摘要算法進(jìn)行加簽,至于摘要算法是什么,隨后會(huì)有詳細(xì)的說(shuō)明。

調(diào)用實(shí)驗(yàn)一下

public static void main(String[] args) throws Exception {    KeyPair keyPair = buildKeyPair();
    byte[] encryptData = encrypt(keyPair.getPublic(), "不學(xué)無(wú)數(shù)");
    System.out.println(String.format("加密后的數(shù)據(jù):%s",base64Encode(encryptData)));
    System.out.println(String.format("解密后的數(shù)據(jù):%s",new String(decrypt(keyPair.getPrivate(),encryptData),UTF8)));
    String context = "加簽的字符串";
    String sign = signWithRSA(context, keyPair.getPrivate());
    System.out.println(String.format("生成的簽名:%s",sign));
    Boolean checkSignWithRSA = checkSignWithRSA(context, keyPair.getPublic(), sign);
    System.out.println(String.format("校驗(yàn)的結(jié)果:%s",checkSignWithRSA.toString()));}

輸出為:

加密后的數(shù)據(jù):Bi8b4eqEp+rNRhDaij8vVlNwKuICbPJfFmyzmEXKuAgEgzMPb8hAmYiGN+rbUKWeZYJKJd0fiOXv6YrYqd7fdast/m443qQreRLxdQFScwvCvj9g1YnPzbU2Q/jIwqAPopTyPHNNngBmFki+R/6V4DYtHA5gniaUMYzynHdD+/W+x8ZYmwiuuS63+7wXqL36aLKe0H50wELOpSn45Gvni8u+5zPIoHV7PBiztrCnQvne5LxFKDprrS3td1/76qyupFd+Ul3hsd+gjbAyN2MlXcAFMrGVaRkopWwc9hP1BsPvS52q/8jOVdbeyU9BziVhViz1V0TtGW8bfbEnIStc3Q==解密后的數(shù)據(jù):不學(xué)無(wú)數(shù)生成的簽名:wvUXtr2UI0tUXmyMTTUBft8oc1dhvtXSBrFFetI5ZoxMm91TbXRWD31Pgqkg72ADxx9TEOAM3Bm1kyzfBCZZpoq6Y9SM4+jdJ4sMTVtw0wACPglnPDAGs8sG7nnLhXWNQ1Y4pl4ziY6uLxF1TzQLFTxuNAS7nyljbG69wrb9R3Sv5t8r1I54rYCVGSVFmTrGf+dSCjxABZv6mH8nygVif7zN1vU1+nSDKcONVtrpv0xCQHVBqnHPA6OiDm5GzBQxjD5aQt8mfgv8JJrB52TEa4JPYoC5Zw4JHlL++OvPwMpJgnuGyg5vnWhxE2ncTzM+/pZ+CnXF2Dqv/JMQOfX6tA==校驗(yàn)的結(jié)果:true

摘要算法

數(shù)據(jù)摘要算法是密碼學(xué)算法中非常重要的一個(gè)分支,它通過(guò)對(duì)所有數(shù)據(jù)提取指紋信息以實(shí)現(xiàn)數(shù)據(jù)簽名、數(shù)據(jù)完整性校驗(yàn)等功能,由于其不可逆性,有時(shí)候會(huì)被用做敏感信息的加密。數(shù)據(jù)摘要算法也被稱為哈希(Hash)算法或散列算法。

消息摘要算法的主要特征是加密過(guò)程不需要密鑰,并且經(jīng)過(guò)加密的數(shù)據(jù)無(wú)法被解密,只有輸入相同的明文數(shù)據(jù)經(jīng)過(guò)相同的消息摘要算法才能得到相同的密文(摘要可以比方為指紋,消息摘要算法就是要得到文件的唯一職位)。

特點(diǎn)

無(wú)論輸入的消息有多長(zhǎng),計(jì)算出來(lái)的消息摘要的長(zhǎng)度總是固定的。一般地,只要輸入的消息不同,對(duì)其進(jìn)行摘要以后產(chǎn)生的摘要消息也必不相同;但相同的輸入必會(huì)產(chǎn)生相同的輸出。只能進(jìn)行正向的信息摘要,而無(wú)法從摘要中恢復(fù)出任何的消息,甚至根本就找不到任何與原信息相關(guān)的信息(不可逆性)。

好的摘要算法,沒(méi)有人能從中找到“碰撞”或者說(shuō)極度難找到,雖然“碰撞”是肯定存在的(碰撞即不同的內(nèi)容產(chǎn)生相同的摘要)。

應(yīng)用

一般地,把對(duì)一個(gè)信息的摘要稱為該消息的指紋或數(shù)字簽名。數(shù)字簽名是保證信息的完整性和不可否認(rèn)性的方法。數(shù)據(jù)的完整性是指信宿接收到的消息一定是信源發(fā)送的信息,而中間絕無(wú)任何更改;信息的不可否認(rèn)性是指信源不能否認(rèn)曾經(jīng)發(fā)送過(guò)的信息。其實(shí),通過(guò)數(shù)字簽名還能實(shí)現(xiàn)對(duì)信源的身份識(shí)別(認(rèn)證),即確定“信源”是否是信宿意定的通信伙伴。數(shù)字簽名應(yīng)該具有唯一性,即不同的消息的簽名是不一樣的;同時(shí)還應(yīng)具有不可偽造性,即不可能找到另一個(gè)消息,使其簽名與已有的消息的簽名一樣;還應(yīng)具有不可逆性,即無(wú)法根據(jù)簽名還原被簽名的消息的任何信息。這些特征恰恰都是消息摘要算法的特征,所以消息摘要算法適合作為數(shù)字簽名算法。

有哪些具體的消息摘要算法?

  • CRC8、CRC16、CRC32:CRC(Cyclic Redundancy Check,循環(huán)冗余校驗(yàn))算法出現(xiàn)時(shí)間較長(zhǎng),應(yīng)用也十分廣泛,尤其是通訊領(lǐng)域?,F(xiàn)在應(yīng)用最多的就是 CRC32 算法,它產(chǎn)生一個(gè) 4 字節(jié)(32位)的校驗(yàn)值,一般是以 8 位十六進(jìn)制數(shù),如FA 12 CD 45等。CRC 算法的優(yōu)點(diǎn)在于簡(jiǎn)便、速度快。嚴(yán)格的來(lái)說(shuō),CRC 更應(yīng)該被稱為數(shù)據(jù)校驗(yàn)算法,但其功能與數(shù)據(jù)摘要算法類似,因此也作為測(cè)試的可選算法。

  • MD2 、MD4、MD5:這是應(yīng)用非常廣泛的一個(gè)算法家族,尤其是 MD5(Message-Digest Algorithm 5,消息摘要算法版本5),它由 MD2、MD3、MD4 發(fā)展而來(lái),由 Ron Rivest(RSA公司)在 1992 年提出,目前被廣泛應(yīng)用于數(shù)據(jù)完整性校驗(yàn)、數(shù)據(jù)(消息)摘要、數(shù)據(jù)加密等。MD2、MD4、MD5 都產(chǎn)生 16 字節(jié)(128位)的校驗(yàn)值,一般用32位十六進(jìn)制數(shù)表示。MD2的算法較慢但相對(duì)安全,MD4 速度很快,但安全性下降,MD5 比 MD4 更安全、速度更快。

  • SHA1、SHA256、SHA384、SHA512:SHA(Secure Hash Algorithm)是由美國(guó)專門制定密碼算法的標(biāo)準(zhǔn)機(jī)構(gòu)——美國(guó)國(guó)家標(biāo)準(zhǔn)技術(shù)研究院(NIST)制定的,SHA系列算法的摘要長(zhǎng)度分別為:SHA 為 20 字節(jié)(160位)、SHA256 為 32 字節(jié)(256位)、 SHA384 為 48 字節(jié)(384位)、SHA512 為 64 字節(jié)(512位),由于它產(chǎn)生的數(shù)據(jù)摘要的長(zhǎng)度更長(zhǎng),因此更難以發(fā)生碰撞,因此也更為安全,它是未來(lái)數(shù)據(jù)摘要算法的發(fā)展方向。由于SHA系列算法的數(shù)據(jù)摘要長(zhǎng)度較長(zhǎng),因此其運(yùn)算速度與 MD5 相比,也相對(duì)較慢。

  • RIPEMD、PANAMA、TIGER、ADLER32 等:RIPEMD 是 Hans Dobbertin 等 3 人在對(duì) MD4、MD5 缺陷分析基礎(chǔ)上,于 1996 年提出來(lái)的,有 4 個(gè)標(biāo)準(zhǔn) 128、160、256 和 320,其對(duì)應(yīng)輸出長(zhǎng)度分別為 16 字節(jié)、20 字節(jié)、32 字節(jié)和 40 字節(jié)。TIGER 由 Ross 在 1995 年提出。Tiger 號(hào)稱是最快的 Hash 算法,專門為 64位機(jī)器做了優(yōu)化。

實(shí)戰(zhàn)演練

在單獨(dú)的使用摘要算法時(shí)我們通常使用的 MD5 算法,所以我們這里就單獨(dú)說(shuō)明使用 Java 實(shí)現(xiàn)? MD5 算法。???????

public?static?String?getMD5Str(String?str)?throws?Exception?{    try {        // 生成一個(gè)MD5加密計(jì)算摘要        MessageDigest md = MessageDigest.getInstance("MD5");        // 計(jì)算md5函數(shù)        md.update(str.getBytes());        // digest()最后確定返回md5 hash值,返回值為8為字符串。因?yàn)閙d5 hash值是16位的hex值,實(shí)際上就是8位的字符        // BigInteger函數(shù)則將8位的字符串轉(zhuǎn)換成16位hex值,用字符串來(lái)表示;得到字符串形式的hash值        return new BigInteger(1, md .digest()).toString(16);    } catch (Exception e) {        throw new Exception("MD5加密出現(xiàn)錯(cuò)誤,"+e.toString());    }}
http://www.risenshineclean.com/news/58067.html

相關(guān)文章:

  • 鄉(xiāng)鎮(zhèn)政府網(wǎng)站建設(shè)自查報(bào)告培訓(xùn)心得體會(huì)范文大全1000字
  • 移動(dòng)網(wǎng)站是什么意思百度廣告聯(lián)盟一個(gè)月能賺多少
  • 網(wǎng)站建設(shè)費(fèi)用包括哪些內(nèi)容優(yōu)化落實(shí)新十條措施
  • 網(wǎng)站推廣策劃的思路廈門網(wǎng)
  • 寶雞市市政工程建設(shè)管理處網(wǎng)站網(wǎng)站域名查詢ip地址
  • 免費(fèi)搭建網(wǎng)站 優(yōu)幫云營(yíng)銷網(wǎng)站建設(shè)軟件下載
  • 青島網(wǎng)站設(shè)計(jì)哪家便宜抖音廣告投放代理商
  • 重慶網(wǎng)上找工作哪個(gè)網(wǎng)站好十大騙子教育培訓(xùn)機(jī)構(gòu)
  • 天將建設(shè)集團(tuán)有限公司網(wǎng)站企業(yè)網(wǎng)絡(luò)推廣最簡(jiǎn)單方法
  • 做網(wǎng)站建設(shè)最好的公司是seo云優(yōu)化軟件
  • 如何做公司自己的網(wǎng)站首頁(yè)seo網(wǎng)站seo
  • 大連b2c網(wǎng)站建設(shè)如何建立網(wǎng)站服務(wù)器
  • 小程序網(wǎng)站開(kāi)發(fā)運(yùn)行合同網(wǎng)站建設(shè)技術(shù)外包
  • 國(guó)建設(shè)委員會(huì)網(wǎng)站上查詢搜索引擎優(yōu)化的完整過(guò)程
  • 福州電子商務(wù)網(wǎng)站在線識(shí)別圖片
  • 德州匯澤網(wǎng)站建設(shè)seo發(fā)貼軟件
  • 公司設(shè)計(jì)網(wǎng)站搜索引擎營(yíng)銷的名詞解釋
  • 禮品網(wǎng)站制作免費(fèi)推廣
  • 網(wǎng)站開(kāi)發(fā) xmind營(yíng)銷網(wǎng)站建設(shè)方案
  • 請(qǐng)問(wèn)網(wǎng)上有沒(méi)有比較好的網(wǎng)站可以做照片書的呀?要求質(zhì)量比較好的!品牌推廣方案ppt
  • 商城網(wǎng)站開(kāi)發(fā)報(bào)價(jià)深圳網(wǎng)絡(luò)推廣培訓(xùn)機(jī)構(gòu)
  • 申請(qǐng)免費(fèi)建站海外seo培訓(xùn)
  • 信譽(yù)好的揚(yáng)中網(wǎng)站建設(shè)app推廣軟件有哪些
  • 四川建設(shè)廳官方網(wǎng)站文件下載企業(yè)網(wǎng)絡(luò)營(yíng)銷策略
  • p2p網(wǎng)站建設(shè) 上海網(wǎng)店代運(yùn)營(yíng)騙局
  • 做校園網(wǎng)站 怎么備案百度推廣在哪里能看到
  • 網(wǎng)站商城定制網(wǎng)站建設(shè)蘇州seo營(yíng)銷
  • 昆明網(wǎng)站開(kāi)發(fā)多少錢免費(fèi)域名注冊(cè)平臺(tái)
  • 做鞋子有什么好網(wǎng)站好北京seo關(guān)鍵詞排名
  • 關(guān)于做ppt的網(wǎng)站有哪些內(nèi)容杭州百度seo代理