1. 程式人生 > >加密解密實現和原理

加密解密實現和原理

我們有這樣的一個場景,有傳送方,接收方,第三方。傳送方想要傳送訊息給接收方,第三方想要擷取消並篡改訊息,然後再轉發給接收方。

怎樣才能襯得上是安全的交流方式呢?一般來說需要滿足下面的三個條件:

完整性(訊息不被篡改),保密性(第三方無法解密),可認證性(接收方知道訊息是由誰傳送的)。

首先,我們來講下MD5加密,嚴格來說,MD5並不能稱為加密,它只是一種雜湊運算,對訊息進行雜湊運算,可以獲得訊息的摘要(Digest,指紋)。

MD5演算法有三個特點,

1. 雜湊演算法是不可逆的,可以將雜湊運算理解為單向的加密:根據原訊息運算得到摘要,根據摘要,無法推匯出原訊息。比如只要有一個完整的人,就可以獲取它的指紋;但是如果只有指紋,是無法獲取這個人的全部資訊的。

2.任何不同的檔案,哪怕只有一個位元組的細微差別,得到的摘要都是完全不同的。

3.無論原始訊息的大小如何,運算得到的摘要資訊是固定長度的。

下面是判斷訊息是否被篡改的流程。

傳送方對訊息進行雜湊運算,得到訊息摘要,傳送訊息摘要和訊息,並說明摘要所使用的雜湊演算法,如MD5。

接收方獲得訊息和摘要,使用相同的雜湊演算法對收到的訊息進行雜湊運算,獲得新的摘要

接收方判斷髮送方的摘要和自己生成的摘要是否相同,相同則認為訊息沒有被篡改,否則就被篡改了。

但是這個不能保證第三方擷取訊息,篡改訊息,重新生成摘要,再轉發。

對稱加密

對稱加密表示加密解密使用相同的金鑰,對稱加密演算法DES(資料加密標準),AES(高階加密標準)等。

對稱加密需要雙方都持有金鑰,並保證金鑰不被洩露。但是傳送至和接受者總要有一次初始的通訊,用來傳遞金鑰,此時如何保證安全。

非對稱加密

非對稱加密有一組金鑰對,一個是對外公開的,任何人都可以獲取,稱為公鑰。一個是自行保管並嚴格保密的,稱為私鑰。訊息由公鑰加密則只能由私鑰解密,由私鑰加密只能由公鑰解密。通過RSA演算法加密解密。

這種加密方式,第三方沒有私鑰,是無法解密的。但是公鑰是任何人都可以獲得,任何人都可以用公鑰來加密併發送給接收者,因此它無法滿足條件可認證性。

認證模式

在認證模式中,有訊息的傳送方釋出公鑰,持有私鑰,步驟如下

1.傳送方公佈自己的公鑰,任何人都可以獲得

2.傳送發使用自己的私鑰對訊息進行加密,然後傳送

3.接收方使用傳送方的公鑰對訊息進行解密。

在這種模式下,假如傳送方A,接收方B,因為B持有A的公鑰,所以B能夠解密並且知道訊息是由A傳送過來的。這樣就滿足了可認證性的條件

但是因為A的公鑰是公開的,所以第三方截取了訊息都能通過公鑰解密,訊息相當於是公開的。不滿足保密性

非對稱加密運算過程相對耗時,不適合大資料。因此,對它的認證模式進行了改進,形成一種新的加密方式,叫做數字簽名。

數字簽名

數字簽名和認證模式很相似,只不過加入了雜湊演算法。步驟如下

1.傳送方對訊息進行雜湊運算,得到原始訊息摘要。

2.傳送方使用自己的私鑰對訊息摘要進行加密,該過程也叫作簽名。

3.接收方使用傳送方的公鑰對收到的訊息進行解密,得到摘要。

4.接收方對訊息進行雜湊運算,得到本地摘要。

5.判斷髮送方的摘要和本地摘要是否相等,以判斷訊息是否被篡改。

數字簽名同時滿足了完整性和可認證性。但是沒有對訊息本身進行加密,第三方如果截獲訊息,就能看到訊息的內容。如果傳遞的是保密性不高的非敏感資料,那麼數字簽名將是非常好的選擇。

綜合實現

傳送方步驟

1.將訊息進行雜湊運算,得到訊息摘要。

2.使用傳送方的私鑰對訊息摘要加密(認證模式,確保了接收方能夠確認自己)

3.使用接收方的公鑰對訊息進行加密(加密模式,確保了訊息只能由期望的接收方解密)

4.傳送訊息和訊息摘要

接收方步驟

1.使用傳送方的公鑰對訊息摘要進行解密(認證模式:確認訊息是由誰傳送的),獲取原始訊息摘要

2.使用自己的私鑰對訊息進行解密(加密模式:安全地獲得訊息內容)

3.將訊息進行雜湊運算,獲取本地訊息摘要。

4.將原始訊息摘要和本地訊息摘要進行對比,確認訊息是否被篡改。

可以看到,通過上面的方式,綜合使用了接收方,傳送方全部的四個金鑰,再配合使用雜湊演算法,是的前面提出的三個安全條件都滿足了。但是非對稱加密演算法是一種相對耗時的操作,這個方案對於大資料來說是低效的。但是實際上,可以通過它來解決對稱加密中的金鑰傳遞問題,也就是說,金鑰傳遞使用這種綜合的方式來加密,之後採用對稱加密,因為現在這樣已經安全了。

證書機制

與數字簽名相關的一個概念就是證書機制,證書用來做什麼呢?在上面的各種模式中,一直存在這樣的一個假設:就是接收方或傳送方所持有的,對方的公鑰總是正確的。可實際上除非對方當面交接公鑰,否則在傳遞公鑰的時候,一樣有可能被篡改。那怎麼解決這個問題呢?這是就需要證書機制了:可以引入一個公正的第三方機構,當某一方想要釋出公鑰時,它將自身的身份資訊及公鑰提交給第三方,第三方對其身份進行證實,如果沒有問題,則將其資訊和公鑰打包成證書。當需要獲取公鑰時,只需要獲取其證書,就可以從中提取出公鑰了。

相關推薦

加密解密實現原理

我們有這樣的一個場景,有傳送方,接收方,第三方。傳送方想要傳送訊息給接收方,第三方想要擷取消並篡改訊息,然後再轉發給接收方。 怎樣才能襯得上是安全的交流方式呢?一般來說需要滿足下面的三個條件: 完整性(訊息不被篡改),保密性(第三方無法解密),可認證性(接收方知道訊息是由誰

C#, Java, PHP, PythonJavascript幾種語言的AES加密解密實現

博客 部分 結果 cat stx add 控制 res code 特別提示:本人博客部分有參考網絡其他博客,但均是本人親手編寫過並驗證通過。如發現博客有錯誤,請及時提出以免誤導其他人,謝謝!歡迎轉載,但記得標明文章出處:http://www.cnblogs.com/ma

RSA加密解密實現(JAVA)

1.關於RSA演算法的原理解析參考:http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html 2.RSA金鑰長度、明文長度和密文長度參考:https://blog.csdn.net/liuhuabai100/article/deta

Redis Sentinel(哨兵) Master+Slave(主從)的實現原理分析

最近需要將專案的的Redis的快取介入CacheCloundpingt來管理Redis的,所以找了下相關資料來更好的鞏固下Redis的相關知識; 原文地址(https://blog.csdn.net/qq_26334813/article/details/78298025?locationNum=

Java集合 --- HashMap底層實現原理

概述 文章的內容基於JDK1.7進行分析,之所以選用這個版本,是因為1.8的有些類做了改動,增加了閱讀的難度,雖然是1.7,但是對於1.8做了重大改動的內容,文章也會進行說明。 HashMap基於Map介面實現,元素以鍵值對的方式儲存,並且允許使用null 建和null值,因為ke

加密解密流程加密演算法的選擇、用途

加密演算法的分類: 雙向加密:分為對稱加密和非對稱加密。 對稱加密 採用單鑰密碼系統的加密方法,同一個金鑰可以同時用作資訊的加密和解密,這種加密方法稱為對稱加密,也稱為單金鑰加密。  需要對加密

Android應用啟動優化:一種DelayLoad的實現原理(下篇)(轉載)

我們使用第三種方法來實現延遲載入。不過上一篇寫的比較簡單,只是講解了如何去實現,這一篇就來講一下為何要這麼做,以及這麼做後面的原理。 其中會涉及到一些 Android 中的比較重要的類,以及 Activity 生命週期中比較重要的幾個函式。 其實這個其中的原理比較簡單,不過要弄清楚其實現的過程,還是一件蠻好

Android應用啟動優化:一種DelayLoad的實現原理(上篇)

轉自: http://www.androidperformance.com/2015/11/18/Android-app-lunch-optimize-delay-load.html 0. 應用啟動優化概述 在 Android 開發中,應用啟動速度是一個非常重要的點,

RSA加密解密實現

概述 RSA被稱為非對稱性加密演算法,意思就是加密和解密用的不是同一份金鑰。RSA演算法的金鑰分為公鑰和私鑰,兩者內容不同,用途也不同。公鑰用於加密,一般交給客戶端使用;私鑰用於解密,一般由伺服器管理。反過來,對稱性加密演算法,指的就是用同一份金鑰進行加密解密了,比如DES

SM4加密算法實現JavaC#相互加密解密

.net ++ println ffffff 預處理 AS 思路 load prop SM4加密算法實現Java和C#相互加密解密 近期由於項目需要使用SM4對數據進行加密,然後傳給Java後臺,Java後臺使用的也是SM4的加密算法但是就是解密不正確,經過一步步調

非對稱加密的簽名驗籤、加密解密的Java語言實現

本文采用java.security包的簽名和驗籤。採用A的私鑰簽名傳送至B,B採用A的公鑰進行驗籤。 加解密可以私鑰加密、公鑰解密(或者公鑰加密、私鑰解密)。 一般用於銀行報文傳輸、支付寶、微信、銀行以及各大銀行的資料交換。 package com.example.demo; impo

javajs實現aes加密解密

由於公司安全測試,要對重要資訊進行加密傳輸,使得java、android、ios一致。 java程式碼 package gov.communitycloud.user.utils; import java.math.BigInteger; import javax.cr

python實現aes加密解密,RSA簽名驗籤,RSA加密解密,並呼叫介面

用python實現呼叫介面的示例程式碼,過程涉及到很多的加密演算法,值得分享一下。首先公鑰和私鑰如何生成,並且能相容java平臺,嘗試了很多方法。最終決定用openssl命令前提,需要安裝openssl,Crypto庫生成公鑰私鑰對過程:生成私鑰: openssl ge

php實現c#一致的DES加密解密 (php中呼叫方法)

php實現和c#一致的DES加密解密,可以從網上搜到一大堆,但是測試後發現都沒法用。以下正確程式碼是我經過苦苦才找到的。希望大家在系統整合時能用的上。<p>注意:key的長度為8位以內。</p> //C# 版DES 加解密演算法 using Syst

RSA加密解密實現

根據RSA一堆原理,寫了個實現的程式碼,親測可用,哈哈記錄一下 #include <iostream> #include <cstdio> #include <math.

用CryptoJS 實現js端3des加密解密,用openssl_encrypt實現php的3des加密解密,相容javaC#c++等

       因為要開發社交平臺,涉及到聊天內容,這些敏感內容想用3des加密傳輸,百度了好多資料,測試了好多次,終於實現了功能,可以直接使用,這裡寫下來,希望幫助到其他朋友。      聽說微信小程式需要資料加密,相信這個能幫到大家。 這裡說一下,iv向量一般是8位

C# 實現 JAVA AES加密解密[原創]

com base gets tran con spec ole tor 技術分享 以下是網上普遍能收到的JAVA AES加密解密方法。 因為裏面用到了KeyGenerator 和 SecureRandom,但是.NET 裏面沒有這2個類。無法使用安全隨機數生成KEY。 我們

C/C++使用openssl進行摘要加密解密(md5, sha256, des, rsa)

fin hex pau 字節 system org key rate 釋放 openssl裏面有很多用於摘要哈希、加密解密的算法,方便集成於工程項目,被廣泛應用於網絡報文中的安全傳輸和認證。下面以md5,sha256,des,rsa幾個典型的api簡單使用作為例子。

凱撒密碼加密解密--JAVA實現(基礎)

soft ring java實現 sta 想是 clas pub sof print 凱撒密碼一種代換密碼,據說凱撒是率先使用加密函的古代將領之一,因此這種加密方法被稱為愷撒密碼。凱撒密碼的基本思想是:通過把字母移動一定的位數來實現加密和解密。明文中的所有字母都在字母表上向

Javascript實現前端AES加密解密功能

西安人 才網 西安人才網掌握的HTML中的js前端AES加密最近因為項目需求做了一次MITM,俄然即便發現運用HTTPS,也不能確保數據傳輸過程中的安全性。 經過中間人進犯,能夠直接獲取到Http協議的一切內容。 所以開端嘗試做一些簡略的加密,在一定程度上確保安全性。本次選用AES加密數據,所以客戶端