什麼是加密算法?

2021-02-13 程式設計師小灰

有很多朋友向我詢問昨天我司發生的事情,對於此事小灰也感到很震驚。在事情真相查清楚之前,希望大家能夠理性看待。當然,如果真相確實爆料內容所說,也絕對不容姑息。

Java的加密知識也是Java常見的領域之一,加密技術的底層確實很複雜,運用了大量的數學知識,要弄明白非常複雜。但是Java語言中運用密碼加密工具卻是非常簡單。我們在Java裡面運用這些加密技術,只需要把原理和使用場景等搞明白就可以了,具體底層實現不用研究。

常用的加密算法有對稱加密算法,非對稱加密算法,哈希算法,數字籤名等幾類。    

對稱加密顧名思義就是加密和解密是對稱的,加密時用一個秘鑰去加密,解密時用同一個秘鑰去解密,由信息發送方和接收方共同約定一個秘鑰。缺點是風險都在這個秘鑰上面,一旦被竊取,信息會暴露。所以安全級別不夠高。常用對稱加密算法有DES,3DES,AES等。在jdk中也都有封裝。

非對稱加密,顧名思義就是加密與解密的過程不是對稱的,不是用的同一個秘鑰。非對稱加密有個公私鑰對的概念,也就是有兩把秘鑰,一把是公鑰,一把是私鑰,一對公私鑰有固定的生成方法,在加密的時候,用公鑰去加密,接收方再用對應的私鑰去解密。使用時可以由接收方生成公私鑰對,然後將公鑰傳給加密方,這樣私鑰不會在網絡中傳輸,沒有被竊取的風險。比如github底層的ssh協議就是公私鑰非對稱加密。並且公鑰是可以由私鑰推導出來的,反過來卻不行,由通過公鑰無法推導出私鑰。常用算法有RSA,ECC等。ECC也是比特幣底層用的比較多的算法。通過和對稱加密的對比,可以看到,非對稱加密解決了秘鑰傳輸中的安全問題。

哈希算法,簡單說就是將任意數據都轉換成一個固定長度的字符串。通過哈希後的值幾乎無法推導出原文。而且兩個不同的原文哈希後結果一定不同。常用算法有MD5,SHA256等等。常用場景,md5常用場景是資料庫的密碼存儲。sha256在挖礦中可以用到。

非對稱加密也有一個問題,就是內容在發送前可能被篡改,因為公鑰是有可能被竊取的,所以竊取者完全可以改為發送別的內容。

解決的辦法就是數字籤名。數字籤名和非對稱加密是反過來的,也是有公私鑰對,但是是用私鑰籤名,用公鑰去驗證籤名。比如發送方除了發送用公鑰加密後的密文,還要發送籤名,籤名內容通常是密文哈希後的字符串,接收方首先驗證籤名是否正確,如果正確那麼密文解密後就是真正需要並且沒有被篡改過的內容。注意,籤名和非對稱用的是兩對不同的公私鑰。

上面是對幾個加密算法的一個簡單講解,除了上面的還有base58等,比特幣底層安全也是依賴於加密。後面會一個一個介紹要用到的加密算法的介紹和使用,但是僅僅是使用,底層不會講。

MD5

MD5即Message-Digest Algorithm 5(信息-摘要算法5),用於確保信息傳輸完整一致。是計算機廣泛使用的雜湊算法之一(又譯摘要算法、哈希算法),主流程式語言普遍已有MD5實現。將數據(如漢字)運算為另一固定長度值,是雜湊算法的基礎原理,MD5的前身有MD2、MD3和MD4。

MD5算法具有以下特點:

1、壓縮性:任意長度的數據,算出的MD5值長度都是固定的。

2、容易計算:從原數據計算出MD5值很容易。

3、抗修改性:對原數據進行任何改動,哪怕只修改1個字節,所得到的MD5值都有很大區別。

4、強抗碰撞:已知原數據和其MD5值,想找到一個具有相同MD5值的數據(即偽造數據)是非常困難的。

MD5的作用是讓大容量信息在用數字籤名軟體籤署私人密鑰前被"壓縮"成一種保密的格式(就是把一個任意長度的字節串變換成一定長的十六進位數字串)。除了MD5以外,其中比較有名的還有sha-1、RIPEMD以及Haval等。

JDK就自帶了md5加密算法,直接調用很方便。需要引入一個類:

import java.security.MessageDigest;

首先創建一個springboot項目,加上一個web以來,內容如下:

SHA256

學Java的對哈希算法都不陌生,畢竟每個類都有hashCode方法。


散列算法(Hash Algorithm),又稱哈希算法,雜湊算法,是一種從任意文件中創造小的數字「指紋」的方法。與指紋一樣,散列算法就是一種以較短的信息來保證文件唯一性的標誌,這種標誌與文件的每一個字節都相關,而且難以找到逆向規律。因此,當原有文件發生改變時,其標誌值也會發生改變,從而告訴文件使用者當前的文件已經不是你所需求的文件。

一個優秀的 hash 算法,將能實現:

正向快速:給定明文和 hash 算法,在有限時間和有限資源內能計算出 hash 值。

逆向困難:給定(若干) hash 值,在有限時間內很難(基本不可能)逆推出明文。

輸入敏感:原始輸入信息修改一點信息,產生的 hash 值看起來應該都有很大不同。

衝突避免:很難找到兩段內容不同的明文,使得它們的 hash 值一致(發生衝突)。即對於任意兩個不同的數據塊,其hash值相同的可能性極小;對於一個給定的數據塊,找到和它hash值相同的數據塊極為困難。

但在不同的使用場景中,如數據結構和安全領域裡,其中對某一些特點會有所側重。

安全散列算法(英語:Secure Hash Algorithm,縮寫為SHA)是一個密碼散列函數家族,是FIPS所認證的安全散列算法。能計算出一個數字消息所對應到的,長度固定的字符串(又稱消息摘要)的算法。且若輸入的消息不同,它們對應到不同字符串的機率很高。

SHA家族的五個算法,分別是SHA-1、SHA-224、SHA-256、SHA-384,和SHA-512。主要適用於數字籤名標準(DigitalSignature Standard DSS)裡面定義的數字籤名算法(Digital Signature Algorithm DSA)。比特幣裡面的就是SHA-256算法。

說簡單一些,就是對一個對象的多個關鍵不重複信息組合起來,通過算法生成一個加密字符串。

繼續上一個項目,在對應的包下建一個工具類:

package btcdemo.btcdemo.security;

public class Sha256Utils

引入的加密類和md5一樣:

import java.security.MessageDigest;

下面是算法的具體內容:

下面是算法的測試類內容:

運行可以看到如下結果:

目前目錄結構如下:

項目代碼:https://github.com/guoyb1990/btc-demo.git

BASE64&BASE58

Base64是網絡上最常見的用於傳輸8Bit字節碼的編碼方式之一,Base64就是一種基於64個可列印字符來表示二進位數據的方法。可查看RFC2045~RFC2049,上面有MIME的詳細規範。

Base64編碼是從二進位到字符的過程,可用於在HTTP環境下傳遞較長的標識信息。例如,在Java Persistence系統Hibernate中,就採用了Base64來將一個較長的唯一標識符(一般為128-bit的UUID)編碼為一個字符串,用作HTTP表單和HTTP GET URL中的參數。在其他應用程式中,也常常需要把二進位數據編碼為適合放在URL(包括隱藏表單域)中的形式。此時,採用Base64編碼具有不可讀性,需要解碼後才能閱讀。

Base64編碼要求把3個8位字節(3*8=24)轉化為4個6位的字節(4*6=24),之後在6位的前面補兩個0,形成8位一個字節的形式。 如果剩下的字符不足3個字節,則用0填充,輸出字符使用『=』,因此編碼後輸出的文本末尾可能會出現1或2個『=』。 

jdk的工具包中就自帶base64的工具類,使用base64的方法也非常簡單,先新建一個工具類:

base64是可逆的,加密解密內容如下:

可以看到使用非常簡單,下面是測試類內容:

執行測試方法,結果如下:

可以看到base64非常簡單。

base58和base64一樣是一種二進位轉可視字符串的算法,主要用來轉換大整數值。區別是,轉換出來的字符串,去除了幾個看起來會產生歧義的字符,如 0 (零), O (大寫字母O), I (大寫的字母i) and l (小寫的字母L) ,和幾個影響雙擊選擇的字符,如/, +。結果字符集正好58個字符(包括9個數字,24個大寫字母,25個小寫字母)。不同的應用實現中,base58 最後查詢的字母表可能不同,所以沒有具體的標準。

可以看出,base58是base64的一種人性化的版本,是站在使用者的角度考慮的。

新建一個Base58的工具類,目錄結構如下:

工具類的大概內容結構如下:

因為內容過多,可以通過下載源碼查看。

下面是測試代碼:

運行結果如下:

可以看到,base58的使用方法是一樣的。

項目代碼:https://github.com/guoyb1990/btc-demo.git

—————END—————

喜歡本文的朋友們,歡迎長按下圖關注訂閱號程式設計師小灰,收看更多精彩內容

相關焦點

  • 加密算法科普:des、aes加密、對稱、非對稱加密、Hash算法都是啥
    DSA (數字籤名用)常見的 Hash 算法:MD2、MD4、MD5、HAVAL、SHA、SHA-1、HMAC、HMAC-MD5、HMAC-SHA1分組加密算法中,有ECB,CBC,CFB,OFB這幾種算法模式什麼是對稱密碼算法網絡安全通信中要用到兩類密碼算法,加密一般分為對稱加密(Symmetric Key Encryption)和非對稱加密(Asymmetric Key
  • 加密類型:5種加密算法以及如何選擇正確的算法
    加密是一種將數據轉換為無法解密的格式,以便只有授權方才能訪問信息的方法。加密密鑰與加密算法一起使加密過程成為可能。並且,基於這些密鑰的應用方式,主要主要使用兩種類型的加密方法:「對稱加密」和「非對稱加密」。這兩種方法都使用不同的數學算法(即我們剛才提到的那些加密算法)對數據進行加密。常見的加密算法列表包括RSA,ECC,3DES,AES等。
  • 數據加密中的DES加密算法詳解
    [摘要] 本文詳細介紹了DES數據加密算法的原理,並給出了一個例子演示了如何使用c#中的加密包進行DES算法加密,最後對DES進行了評價。常用加密算法主要用來對敏感數據、摘要、籤名等信息進行加密。按照密鑰方式劃分,可分為對稱加密算法和非對稱加密算法。一、對稱加密算法對稱加密算法有時又叫做傳統密碼算法,加密密鑰可以從解密密鑰中推導出來,解密密鑰也可以從加密密鑰中推導出來。在大多數的對稱算法中,加密密鑰和解密密鑰是相同的,因此也成為秘密密鑰算法或者單密鑰算法。
  • 到底什麼是DES加密算法?這樣理解試試!
    在說DES加密算法之前,我們首先了解幾個基本概念:明文:明文是指沒有經過加密的數據。一般而言,明文都是等待傳輸的數據。由於沒有經過加密,明文很容易被識別與破解,因此在傳輸明文之前必須進行加密處理。密文:密文只是明文經過某種加密算法而得到的數據,通常密文的形式複雜難以識別及理解。
  • 最安全的加密算法RSA
    前幾天朋友讓我贈送她魔遊紀系列電影,於是贈送了,每部還剩四個名額不能浪費了,這裡送給大家,回復公眾號"魔遊紀N"得到對應的贈送連結,N代表第幾部,目前只有3、4、5。零、背景之前介紹了AES加密算法,這個算法的缺點是加密鑰匙和解密鑰匙一樣,缺少安全性。
  • DES、RC4、AES等加密算法優勢及應用
    程式設計師捍衛自己珍貴的代碼,全靠花式的加密算法。代碼加密有多重要?程式設計師半年做出的產品,盜版者可能半天就能完全破解。  加密算法的本質,首先是為了對數據進行保密並防止篡改,其次更具有了身份驗證的功能。像是你跟女友約定好的話術,這句話一說出來,她就知道是什麼意思,並且知道說話的人是你,但任何其他人根本不知道你們在說什麼。  根據密鑰類型的不同,加密算法分為對稱和非對稱兩種。
  • 區塊鏈丨對稱加密算法
    在前面的文章中,有提到「對稱加密算法」,這是一種相對應用得比較早的加密算法之一,其技術也是比較成熟的。在執行對稱加密時,數據發出方將需要明文(之前的文章中有解釋)和加密密鑰一起輸入至加密算法中進行處理,使之變成更為複雜的加密密文,之後再將密文發布出去。
  • 目前已知的最強加密算法RSA
    RSARSA是一種非對稱加密算法,1977年由羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir)和倫納德·阿德曼(Leonard Adleman)一起提出的,因此以三人姓氏的首字母命名了該非對稱加密算法,RSA算法。
  • 區塊鏈丨非對稱加密算法,區塊鏈的加密秘訣!
    前面講到了對稱加密算法,今天講講非對稱加密算法。可以說非對稱算法是對稱算法的升級,因為非對稱算法是基於對稱算法而被研究出來的。非對稱算法與對稱算法的不同之處在於非對稱算法省去了對稱加密算法時要分發密鑰的麻煩,所以說是對稱加密算法的升級。在非對稱加密算法中同樣具有兩種密鑰:私鑰(private key)和公鑰(public key)。
  • 一種基於DES加密算法的加密方法
    摘要:本發明公開了一種基於DES加密算法的加密方法,其加密方法採用服務端與客戶端共享密鑰集文件,實現通信過程中使用動態密鑰的對稱加密方法,建立密鑰集文件,密鑰集文件由三個互相垂直方向的X、Y、Z組成的長方體形的三維模型;伺服器端在X、Y有效值範圍內隨機一個坐標,確定一組密鑰,進行DES加密;將選取的X、Y分別值轉換為4位16進位數
  • 被證明的黎曼猜想跟區塊鏈加密算法有什麼關係?
    而區塊鏈屆跟著躁動,加密算法要被破解了。  菲爾茲獎和阿貝爾獎雙料得主、英國皇家學會前主席麥可· 阿提亞(Michael Atiyah,1929.4.22-)爵士宣稱自己證明了黎曼猜想,並將在9月24日海德堡獲獎者論壇上宣講。據了解,麥可· 阿提亞的主要研究領域是幾何,被譽為當代最偉大的數學家之一。
  • 利用彙編語言實現DES加密算法
    DES算法是一種數據加密算法。自從1977年公布以來,一直是國際上的商用保密通信和計算機通信的最常用的加密標準。DES算法的實現一般用高級語言。
  • 利用帕斯卡三角和謝爾賓斯基三角的加密算法
    本文中,我們將使用一種基於替換法和置換法的用於加解密的算法,這種算法基於要論述的帕斯卡三角和謝爾賓斯基三角的概念。帕斯卡三角的概念用於在一種特殊的模式下對純文本中字符進行異或運算,運算結束後得到我們想要的密文。二、參考文獻這一節裡,我們會提到一些經典和現代加密數據技術的概述。
  • 常見加密算法DES、AES和RSA的原理和特點
    本文轉載自【微信公眾號:strongerHuang,ID:strongerHuang】經微信公眾號授權轉載,如需轉載與原文作者聯繫主要總結下常用的對稱性加密算法DES和AES,非對稱性加密算法RSA。1DES加密算法1.DES含義DES全稱為Data Encryption Standard,即數據加密標準,是一種使用密鑰加密的塊算法,1977年被美國聯邦政府的國家標準局確定為聯邦資料處理標準(FIPS),並授權在非密級政府通信中使用,隨後該算法在國際上廣泛流傳開來。DES是對稱性加密裡常見的一種,是一種使用秘鑰加密的塊算法。
  • 小叮噹Python進階(二):爬蟲與加密算法Part2之DES
    DESDES算法為密碼體制中的對稱密碼體制,又被稱為數據加密標準。DES是一個分組加密算法,典型的DES以64位為分組對數據加密,加密和解密用的是同一個算法。在DES算法中,Key為7個字節共56位,是DES算法的工作密鑰;Data為8個字節64位,是要被加密或被解密的數據;Mode為DES的工作方式。有兩種工作方式,加密或解密。密鑰長64位,密鑰事實上是56位參與DES運算(第8、16、24、32、40、48、56、64位是校驗位,使得每個密鑰都有奇數個1),分組後的明文組和56位的密鑰按位替代或交換的方法形成密文組。
  • 什麼是非對稱加密?
    豪華陣容的背後只有一個目的,就是使用強大的加密算法來保護個人信息和隱私免受攻擊。而非對稱加密算法也是比特幣存在的重要基石,中本聰在密碼學基礎之上用代碼創造了比特幣,將非對稱加密推向了一個嶄新的高潮。了解非對稱加密之前,我們先要理解什麼是對稱加密?
  • 圖解|什麼是RSA算法
    加密算法的一點歷史我們知道常見的加密算法有:對稱加密和非對稱加密,非對稱加密是我們今天的主角。非對稱加密不是一蹴而就的,它是1976年之後才出現的,可以說非對稱加密是對稱加密的優化。如果密鑰洩露那麼再強大的對稱加密算法也是徒勞的,所以如何安全地交換對稱加密的規則和密鑰是短板。
  • 區塊鏈中的密碼學系列之對稱加密算法DES(六)
    前言DES是一種數據加密標準( Data Encryption Standard) , 有30多年歷史,是一種對稱密碼算法,是第一個得到廣泛應用的密碼算法,是一種分組加密算法,輸入的明文為64位,密鑰為64位(實際上只有56位,原因是每隔7個比特設置一個奇偶校驗位),生成的密文分組長度為64位。但是現在已經不再安全。課件來自我們老師上課的PPT。2.
  • 淺談對稱加密中的流加密
    之前介紹的對稱加密算法都是分組加密,如DES,3DES,SM4等。被加密的原文需要分成組,每組長度與密鑰長度相同,再分別加密。實際上,對稱加密裡還有一種類型算法叫做流加密。所謂流加密,就是使用一個與原文同樣長度的密鑰,與原文數據按位進行異或操作,得到的結果就是密文。
  • MD5 到底是不是加密?
    所謂的加密到底是什麼意思?MD5 的破解又是指的什麼?MD5:一種哈希算法實質上,MD5 只是一種哈希算法。哈希算法,即 hash,又叫散列算法,是一類把任意數據轉換為定長(或限制長度)數據的算法統稱。例如我叫張三,你叫李四,那麼「人 -> 人名」的算法就叫屬於一種哈希算法。