欧美变态口味重另类在线视频-欧美变态另类人妖-欧美变态另类牲交-欧美变态味孕交蓝光-欧美不卡-欧美不卡二区

行業新聞

您當前的位置:首頁 > 新聞資訊 > 行業新聞

循序漸進學加密 | 數據加密研究院

發布源:深圳維創信息技術發布時間:2020-10-27 瀏覽次數:

還記得上初二的那年夏天,班里來了一個新同學,他就住在我家對面的樓里,于是我們一起上學放學,很快便成了最要好的朋友。

我們決定發明一套神秘的溝通方式,任何人看到都不可能猜到它的真實含義。

我們第一個想到的就是漢語拼音,但很顯然光把一個句子變成漢語拼音是不夠的,于是我們把26個英文字母用簡譜的方式從低音到高音排起來,就得到了一個簡單的密碼本:把“我們都是好朋友”用這個密碼本變換之后就得到了這樣的結果:小時候玩這個游戲樂此不疲,覺得非常有趣。

上大學后,有幸聽盧開澄教授講《計算機密碼學》,才知道原來我們小時候玩的這個游戲遠遠不能稱之為加密。

那么到底什么是加密呢?什么是加密?把字符串123456經過base64變換之后,得到了MTIzNDU2,有人說這是base64加密。

把字符串123456經過md5變換之后,得到了E10ADC3949BA59ABBE56E057F20F883E,有人說這是md5加密。

從嚴格意義上來說,不管是base64還是md5甚至更復雜一些的sha256都不能稱之為加密。

一句話,沒有密鑰的算法都不能叫加密。

編碼(Encoding)是把字符集中的字符編碼為指定集合中某一對象(例如:比特模式、自然數序列、8位字節或者電脈沖),以便文本在計算機中存儲和通過通信網絡的傳遞的方法,常見的例子包括將拉丁字母表編碼成摩爾斯電碼和ASCII。

base64只是一種編碼方式。

雜湊(Hashing)是電腦科學中一種對資料的處理方法,通過某種特定的函數/算法(稱為雜湊函數/算法)將要檢索的項與用來檢索的索引(稱為雜湊,或者雜湊值)關聯起來,生成一種便于搜索的資料結構(稱為雜湊表)。

雜湊算法常被用來保護存在資料庫中的密碼字符串,由于雜湊算法所計算出來的雜湊值具有不可逆(無法逆向演算回原本的數值)的性質,因此可有效的保護密碼。

常用的雜湊算法包括md5, sha1, sha256等。

加密(Encryption)是將明文信息改變為難以讀取的密文內容,使之不可讀的過程。

只有擁有解密方法的對象,經由解密過程,才能將密文還原為正常可讀的內容。

加密分為對稱加密和非對稱加密,對稱加密的常用算法包括DES, AES等,非對稱加密算法包括RSA,橢圓曲線算法等。

在古典加密算法當中,加密算法和密鑰都是不能公開的,一旦泄露就有被破解的風險,我們可以用詞頻推算等方法獲知明文。

1972年美國IBM公司研制的DES算法(Data Encryption Standard)是人類歷史上第一個公開加密算法但不公開密鑰的加密方法,后來成為美國軍方和政府機構的標準加密算法。

2002年升級成為AES算法(Advanced Encryption Standard),我們今天就從AES開始入手學習加密和解密。

準備工具通常情況下,加解密都只需要在服務端完成就夠了,這也是網上大多數教程和樣例代碼的情況,但在某種特殊情況下,你需要用一種語言加密而用另一種語言解密的時候,最好有一個中立的公正的第三方結果集來驗證你的加密結果,否則一旦出錯,你都不知道是加密算法出錯了,還是解密算法出錯了,對此我們是有慘痛教訓的,特別是如果一個公司里,寫加密的是前端,用的是js語言,而寫解密的是后端,用的是java語言或者php語言或者go語言,則雙方更需要有這樣一個客觀公正的平臺,否則你們之間必然會陷入永無休止的互相指責的境地,前端說自己沒有錯,是后端解密解錯了,后端說解密沒有錯,是前端加密寫錯了,而事實上是雙方都是菜鳥,對密碼學一知半解,在這種情況下浪費的時間就更多。

在線AES加密解密就是這樣的一個工具網站,你可以在上面驗證你的加密結果,如果你加密得到的結果和它的結果完全一致,就說明你的加密算法沒有問題,否則你就去調整,直到和它的結果完全一致為止。

反之亦然,如果它能從一個密文解密解出來,而你的代碼解不出來,那么一定是你的算法有問題,而不可能是數據的問題。

我們先在這個網站上對一個簡單的字符串123456進行加密。

下面我們對網站上的所有選項逐個解釋一下:AES加密模式:這里我們選擇的是ECB(ee cc block)模式。

這是AES所有模式中最簡單也是最不被人推薦的一種模式,因為它的固定的明文對應的是固定的密文,很容易被破解。

但是既然是練習的話,就讓我們先從最簡單的開始。

填充:在這里我們選擇pkcs標準的pkcs7padding。

數據塊:我們選擇128位,因為java端解密算法目前只支持AES128,所以我們先從128位開始。

密鑰:因為我們前面選擇了128位的數據塊,所以這里我們用128 / 8 = 16個字節來處理,我們先簡單地填入16個0,其實你也可以填寫任意字符,比如abcdefg1234567ab或者其它,只要是16個字節即可。

理論上來說,不是16個字節也可以用來當密鑰,優秀的算法會自動補齊,但是為了簡單起見,我們先填入16個0。

偏移量:置空。

因為是ECB模式,不需要iv偏移量。

輸出:我們選擇base64編碼方式。

字符集:這里因為我們只加密英文字母和阿拉伯數字,所以選擇utf-8和gb2312都是一樣的。

好了,現在我們知道按照以上選項設置好之后的代碼如果加密123456的話,應該輸出DoxDHHOjfol/2WxpaXAXgQ==,如果不是這個結果,那就是加密端的問題。

AES-ECB1. AES-ECB的Javascript加密為了完成AES加密,我們并不需要自己手寫一個AES算法,不需要去重復造輪子。

但如何選擇js的加密庫是個很有意思的挑戰。

我們嘗試了很多方法,一開始我們嘗試了aes-js這個庫,但它不支持RSA算法,后來我們看到Web Crypto API這種瀏覽器自帶的加密庫,原生支持AES和RSA,但它的RSA實現和Java不兼容,最終我們還是選擇了Forge這個庫,它天生支持AES的各種子集,并且它的RSA也能和Java完美配合。

使用forge編寫的js代碼實現AES-ECB加密的代碼就是下面這些:constcipher=forge.cipher.createCipher('AES-ECB','這里是16字節密鑰');cipher.start();cipher.update(forge.util.createBuffer('這里是明文'));cipher.finish();constresult=forge.util.encode64(cipher.output.getBytes())forge的AES缺省就是pkcs7padding,所以不用特別設置。

運行它之后你就會得到正確的加密結果。

2. AES-ECB的Java解密接下來我們看看Java端的解密代碼該如何寫:try{Ciphercipher=Cipher.getInstance("AES/ECB/PKCS5Padding");cipher.init(Cipher.DECRYPT_MODE,newSecretKeySpec("這里是16字節密鑰".getBytes(),"AES"));Stringplaintext=newString(cipher.doFinal(Base64.getDecoder().decode("這里是明文".getBytes())),"UTF-8");System.out.println(plaintext);}catch(Exceptione){System.out.println("解密出錯:"+e.toString());}注意這里我們用到的是PKCS5Padding,上面加密的時候不是用的是pkcs7padding嗎?怎么這里變成5了呢?我們先來了解一下什么是pkcs。

pkcs的全稱是Pubpc Key Cryptography Standards(公鑰加密標準),這是RSA實驗室制定的一系列的公鑰密碼編譯標準,比較著名的有pkcs1, pkcs5, pkcs7, pkcs8這四個,它們分別管理的是不同的內容。

在這里我們只是用它來填充,所以我們只關注pkcs5和pkcs7就夠了。

那么pkcs5和pkcs7有什么區別呢?其實在填充方面它們兩個的算法是一樣的,pkcs5是pkcs7的一個子集,區別在于pkcs5是8字節固定的,而pkcs7可以是1到255之間的任意字節。

但用在AES算法上,因為AES標準規定塊大小必須是16字節或者24字節或者32字節,不可能用pkcs5的8字節,所以AES算法只能用pkcs7填充。

但是由于java早期工程師犯的一個命名上的錯誤,他們把AES填充算法的名稱設定為pkcs5,而實際實現中實現的是pkcs7,所以我們在java端開發解密的時候需要使用pkcs5。

AES-CBC談完了不安全的AES-ECB,我們來做一下相對安全一些的AES-CBC模式。

1. AES-CBC的Javascript加密直接上代碼:constcipher=forge.cipher.createCipher('AES-CBC','這里是16字節密鑰');cipher.start({iv:'這里是16字節偏移量'});cipher.update(forge.util.createBuffer('這里是明文'));cipher.finish();constresult=forge.util.encode64(cipher.output.getBytes());跟上面的AES-ECB差不多,唯一區別只是在start函數里定義了一個iv。

2. AES-CBC的Java解密下面是Java代碼:try{Ciphercipher=Cipher.getInstance("AES/CBC/PKCS5Padding");cipher.init(Cipher.DECRYPT_MODE,newSecretKeySpec("這里是16字節密鑰".getBytes(),"AES"),newIvParameterSpec("這里是16字節偏移量".getBytes()));Stringplaintext=newString(cipher.doFinal(Base64.getDecoder().decode("這里是明文".getBytes())),"UTF-8");System.out.println(plaintext);}catch(Exceptione){System.out.println("解密出錯:"+e.toString());}也是同樣,跟上面用AES-ECB時的模式幾乎一模一樣,只是增加了一個IvParameterSpec,用來生成iv,在cipher.init里面增加了一個iv參數,除此之外完全相同,就這樣我們就已經實現了一個簡單的CBC模式。

RSA但是以上兩種做法都明顯是非常不安全的,因為我們把加密用的密鑰和iv參數都直接暴露在了前端,為此我們需要一種更加安全的加密方法——RSA。

因為RSA是非對稱加密,即使我們把加密用的公鑰完全暴露在前端也不必擔心,別人即使截獲了我們的密文,但因為他們沒有解密密鑰,是無法解出我們的明文的。

1. 生成密鑰對要用RSA加密,首先我們需要生成一個公鑰和一個私鑰,我們可以直接執行命令ssh-keygen。

它會問我們密鑰文件保存的文件夾,注意一定要單獨找一個文件夾存放,不要放在缺省文件夾下,否則你日常使用的ssh公鑰和私鑰就都被覆蓋了。

得到公鑰文件之后,由于這個公鑰文件是rfc4716格式的,而我們的forge庫要求一個pkcs1格式的公鑰,所以這里我們需要把它轉換成pem格式(也就是pkcs1格式):ssh-keygen-f公鑰文件名-mpem-e2. RSA的Javascript加密得到pem格式的公鑰之后,我們來看一下js的代碼:forge.util.encode64(forge.pki.pubpcKeyFromPem('-----BEGINRSAPUBLICKEY-----MIIBCfdsafasfasfafsdaafdsaAB-----ENDRSAPUBLICKEY-----').encrypt('這里是明文','RSA-OAEP',{md:forge.md.sha256.create(),mgf1:{md:forge.md.sha1.create()}});一句話就完成整個加密過程了,這就是forge的強大之處。

3. RSA的Java解密接下來我們看解密。

對于私鑰,因為Java只支持PKCS8,而我們用ssh-keygen生成的私鑰是pkcs1的,所以還需要用以下命令把pkcs1的私鑰轉換為pkcs8的私鑰:opensslpkcs8-topk8-informPEM-outformPEM-nocrypt-in私鑰文件名-out導出文件名得到pkcs8格式的私鑰之后,我們把這個文件的頭和尾去掉,然后放入以下Java代碼:try{Ciphercipher=Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding");cipher.init(Cipher.DECRYPT_MODE,KeyFactory.getInstance("RSA").generatePrivate(newPKCS8EncodedKeySpec(Base64.getDecoder().decode("這里是私鑰"))));Stringplaintext=newString(cipher.doFinal(Base64.getDecoder().decode("這里是密文".getBytes())),"UTF-8");System.out.println(plaintext);}catch(Exceptione){System.out.println("解密出錯:"+e.toString());}和上面的AES解密類似,只是增加了KeyFactory讀取PKCS8格式私鑰的部分,這樣我們就完成了Java端的RSA解密。

以上我們用最簡單的方式實現了js端加密,java端解密的過程,感興趣的朋友可以在這里下載文件加密系統親自驗證一下數據加密的效果。


  • 上一篇:量子解密未來的加密數據將面臨什么
  • 下一篇:那些陷入數據泄露門的公司,最后怎么樣了?
  • Copyright © 2021 深圳市維創信息技術有限公司 版權所有

    粵ICP備2021016007號

    主站蜘蛛池模板: 91久久久久国产精品嫩草影院 | 国产精品久在线观看 | 国产AV一区二区三区最新精品 | 国产福利不卡免费视频在线观看 | 欧美人妻中文字幕天天弄 | 一区二区三区网站 | 久操网在线 | 欧美一区二区三区在线可观看 | 久久一区二区三区精华液 | 苍井空a v 免费视频 | 国产日韩欧美另类 | 97涩涩涩 | 国产又硬又粗进去好爽A片软件 | 国产精品无码不卡动漫在线播 | 被特种兵啪到哭BL | 久久国产乱子伦精品免费台湾 | 欧洲精品卡1区2卡三卡四卡 | 亚洲.日韩.欧美另类 | 美女黄网十八禁免费看 | 韩国理伦三级做爰在线播放 | 婷婷激情综合色五月久久竹菊影视 | 亚洲第一卡二新区乱码 | 日本免费一区二区视频 | 国产成人精品免费视频大全 | 国产hs免费高清在线观看 | 日本工口里画番全彩 | 91天堂在线视 | 国产69式性姿免费视频穿越剧 | 中文字母在线免费观看视频网站 | 亚洲国产精品一区二区第四页 | 国产成人精品cao在线 | 高清国产美女一级a毛片录像 | 六月丁香婷婷综合在线观看 | 91国内揄拍国内 | 成人免费无码毛片黄网 | 久久国产这里只精 | 国产成人久久综合777777麻豆 | 蜜桃麻豆www久久国产精品 | 裸体美女扒开下部无遮挡网站免费 | 免费日本黄色网址 | 在线精品视频免费 |