加解密簡介

2021-04-25 15:53:32 字數 2340 閱讀 6405

加密技術,簽名技術的需要做到三防一確認。一防竊聽,二防篡改,三防抵賴,確認對方身份。

在電子商務過程中,開始時必須確認對方身份,不然談了半天,發現網際網路那頭真是一條狗,就悲劇了。

防竊聽是指,即便有人在網路傳輸過程中得到了資料,看到的也是亂七八糟,無法從中得知正常的資訊。舉個例子,談判前老總通過網路跟你商定了底價,不巧對方抓取到了此資訊,如果沒有合適的加密手段,他可能就據此在談判中佔盡上風。所以防竊聽是很重要的。

放篡改,即保證對方和自己說的話,原封不動的傳達到位。買200克**不能變成買20克。

放抵賴,現代商情瞬息萬變,電子商務要求不能否認已達成的交易。比如早上商定要進貨1噸,下午眼看**降了,想抵賴,必須有方法讓其不得否認。

技術基礎一:對稱加密和非對稱加密。這方面的資料很多,相對也複雜,這裡只簡單介紹。對稱加密,簡單說是加密時用乙個密匙,解密時用同乙個密匙。非對稱加密,加密時用乙個密匙(稱作私匙),解密用另乙個密匙(稱作公匙)。對稱加密演算法一般有des,3des,sha,rc2,aes。非對稱加密演算法有rsa等。防竊聽主要是通過加密技術實現的。另外非對稱加密相對對稱加密要慢很多。

技術基礎二:簽名。對整個訊息做摘要(如md5等),並對摘要用私匙加密,得到的就是簽名。簽名技術主要用於保證放篡改、放抵賴和身份確認。

目前業界通用的兩套加解密庫有開源的openssl和微軟系統自帶的cryptoapi。本文簡單介紹下cryptoapi的用法,想來openssl大同小異。例子是最好的教材,let's go。

des加密的例子。

1.cryptacquirecontext() // 取得csp(crypt service provider),即真正的加密演算法庫。微軟cryptoapi是對各種演算法,如加密、摘要、簽名、des、aes等的封裝,為程式設計師提供統一介面。當對效能或安全性(演算法的具體實現有時也會影響最終安全效果)有特殊要求時,可以另外提供硬體或軟體加密演算法庫。

參數列:

pszcontainer // 存放密匙的容器。一般是null,即存在預設地方。

pszprovider   // 一般是ms_strong_prov,微軟提供的演算法庫之一

dwflags        // 可以用crypt_silent,如果不用私匙的話,加上此標記將不出現互動介面

2.cryptcreatehash()  // 建立乙個hash物件,這是cryptoapi比較煩的乙個地方,如果有密匙"123456",不能直接用,必須放到乙個hash物件裡,再從hash物件匯出到hcryptkey(cryptoapi密匙控制代碼)。而且此時匯出的密匙實際上"123456"做過摘要之後的值。比如建立hash物件時選擇md5演算法,密匙就是md5("123456")。

參數列:

alg_id // 摘要演算法,一般是calg_md5

hkey     // 一般是null,用hmac或mac時可傳入此值。hmac和mac本文不詳述。

3.crypthashdata() // 沒有太多需要解釋的,把密匙放入hash物件

4.cryptderivekey() // 從hash物件中匯出真正使用的密匙。

參數列:

alg_id    // 加密演算法,可以是calg_des、calg_rc2等,詳見msdn。

dwflags   // 這個重要,很容易搞錯。是dword值,高16位表示要匯出多少位的密匙,des加密需要64位密匙,就是0x00400000。每種演算法需要多少位密匙一定不能搞錯,否則函式失敗,getlasterror提示引數不正確。低16位,是一些標誌位。其中crypt_no_salt非常重要,如果不選擇此標誌,匯出密匙時將附加不定位的鹽(取決於要匯出多少位),加密時也將使用該鹽。如果解密時不用同樣的鹽,解密會失敗。對於des加密,我建議選擇crypt_no_salt,這樣與演算法流程更貼合,與其他平台互動時也沒有不必要的麻煩。

5.cryptsetkeyparam() // 這個函式是可選的,可以用它設定一些引數。比如iv(初始化向量),加密模式,不設的話,iv預設均為空,模式預設為cbc。

6.cryptencrypt() // 真正的加密函式。一般呼叫兩次,第一次確定密文長度,根據此值分配空間後,第二次做真正的加密,得到密文。

7.cryptreleasecontext, cryptdestroykey, cryptdestoryhash。做c/c++的同志們對這個應該不陌生吧。記得次序問題,翻過來呼叫。

解密的例子:

加密時的cryptencrypt換成cryptdecrypt。沒有太多好解釋的。

另外幾個需要注意的地方:

1.cryptsetkeyparam,設定cbc和ecb模式是有效的,雖然從cryptgetkeyparam得到的結果一律是0.

2.cryptgethashparam取hashvalue時,必須呼叫兩次,否則無論你傳進去的緩衝區有多大,一律失敗,還會告訴你「有更多緩衝區可用」

加解密方法

imports system imports system.security.cryptography imports system.text imports system.io public class encryptor private shared iv as byte private sha...

字元加解密

using system using system.security.cryptography using system.web.security using system.io using system.text using system.configuration namespace x.com...

加解密演算法

工作中經常用到加解密演算法大概有以下三種 由不定長的資料轉化為固定長的字串,代表有 sha1 str raw out false 演算法不夠複雜raw out預設為false,生成乙個32位的加密串 如果為true,則生成乙個16位的二進位製流 md5 str strict false strict...