製作對稱加密
1、3DES演算法
3DES(即Triple DES)是DES向AES過渡的加密演算法(1999年,NIST將3-DES指定為過渡的加密標准),加密演算法,其具體實現如下:設Ek()和Dk()代表DES演算法的加密和解密過程,K代表DES演算法使用的密鑰,M代表明文,C代表密文,這樣:
3DES加密過程為:C=Ek3(Dk2(Ek1(M)))
3DES解密過程為:M=Dk1(EK2(Dk3(C)))
2、Blowfish演算法
BlowFish演算法用來加密64Bit長度的字元串。
BlowFish演算法使用兩個「盒」——unsignedlongpbox[18]和unsignedlongsbox[4,256]。
BlowFish演算法中,有一個核心加密函數:BF_En(後文詳細介紹)。該函數輸入64位信息,運算後,以64位密文的形式輸出。用BlowFish演算法加密信息,需要兩個過程:密鑰預處理和信息加密。
分別說明如下:
密鑰預處理:
BlowFish演算法的源密鑰——pbox和sbox是固定的。我們要加密一個信息,需要自己選擇一個key,用這個key對pbox和sbox進行變換,得到下一步信息加密所要用的key_pbox和key_sbox。具體的變化演算法如下:
1)用sbox填充key_sbox
2)用自己選擇的key8個一組地去異或pbox,用異或的結果填充key_pbox。key可以循環使用。
比如說:選的key是"abcdefghijklmn"。則異或過程為:
key_pbox[0]=pbox[0]abcdefgh;
key_pbox[1]=pbox[1]ijklmnab;
…………
…………
如此循環,直到key_pbox填充完畢。
3)用BF_En加密一個全0的64位信息,用輸出的結果替換key_pbox[0]和key_pbox[1],i=0;
4)用BF_En加密替換後的key_pbox,key_pbox[i+1],用輸出替代key_pbox[i+2]和key_pbox[i+3];
5)i+2,繼續第4步,直到key_pbox全部被替換;
6)用key_pbox[16]和key_pbox[17]做首次輸入(相當於上面的全0的輸入),用類似的方法,替換key_sbox信息加密。
信息加密就是用函數把待加密信息x分成32位的兩部分:xL,xRBF_En對輸入信息進行變換。
3、RC5演算法
RC5是種比較新的演算法,Rivest設計了RC5的一種特殊的實現方式,因此RC5演算法有一個面向字的結構:RC5-w/r/b,這里w是字長其值可以是16、32或64對於不同的字長明文和密文塊的分組長度為2w位,r是加密輪數,b是密鑰位元組長度。
(1)製作對稱加密擴展閱讀:
普遍而言,有3個獨立密鑰的3DES(密鑰選項1)的密鑰長度為168位(三個56位的DES密鑰),但由於中途相遇攻擊,它的有效安全性僅為112位。密鑰選項2將密鑰長度縮短到了112位,但該選項對特定的選擇明文攻擊和已知明文攻擊的強度較弱,因此NIST認定它只有80位的安全性。
對密鑰選項1的已知最佳攻擊需要約2組已知明文,2部,2次DES加密以及2位內存(該論文提到了時間和內存的其它分配方案)。
這在現在是不現實的,因此NIST認為密鑰選項1可以使用到2030年。若攻擊者試圖在一些可能的(而不是全部的)密鑰中找到正確的,有一種在內存效率上較高的攻擊方法可以用每個密鑰對應的少數選擇明文和約2次加密操作找到2個目標密鑰中的一個。
㈡ 對稱加密的工作過程
下面舉個例子來簡要說明一下對稱加密的工作過程。甲和乙是一對生意搭檔,他們住在不同的城市。由於生意上的需要,他們經常會相互之間郵寄重要的貨物。為了保證貨物的安全,他們商定製作一個保險盒,將物品放入其中。他們打造了兩把相同的鑰匙分別保管,以便在收到包裹時用這個鑰匙打開保險盒,以及在郵寄貨物前用這把鑰匙鎖上保險盒。
上面是一個將重要資源安全傳遞到目的地的傳統方式,只要甲乙小心保管好鑰匙,那麼就算有人得到保險盒,也無法打開。這個思想被用到了現代計算機通信的信息加密中。在對稱加密中,數據發送方將明文(原始數據)和加密密鑰一起經過特殊加密演算法處理後,使其變成復雜的加密密文發送出去。接收方收到密文後,若想解讀原文,則需要使用加密密鑰及相同演算法的逆演算法對密文進行解密,才能使其恢復成可讀明文。在對稱加密演算法中,使用的密鑰只有一個,發收信雙方都使用這個密鑰對數據進行加密和解密。
㈢ 對稱密鑰加密技術的工作流程
SQL Server 2005一個令人激動的特性是內置了加密的功能。在這個新版的SQL Server中,開發團隊直接在T-SQL中加入了加密工具、證書創建和密鑰管理的功能。對於因為法律要求或商業需求而需要加密表中的數據的人來說,這是一個好禮物。對於猶豫是否用加密來保證數據安全的人來說,做決定也更容易了。這篇文章介紹新的加密功能是怎麼工作,怎麼使用。
TSQL現在支持使用對稱密鑰和非對稱密鑰,證書和密碼。本文介紹如何創建、管理和使用對稱密鑰和證書。
根據涉及的內容,我決定把本文分為三節:
第一部分:服務主密鑰和資料庫主密鑰
第二部分:證書
第三部分:對稱密鑰
1. 服務主密鑰和資料庫主密鑰
圖:SQL Server 2005加密層次結構
1.1 服務主密鑰
當第一次需要使用服務主密鑰對鏈接伺服器密碼、憑據或資料庫主密鑰進行加密時,便會自動生成服務主密鑰。服務主密鑰為 SQL Server 加密層次結構的根。服務主密鑰直接或間接地保護樹中的所有其他密鑰和機密內容。使用本地計算機密鑰和 Windows 數據保護 API 對服務主密鑰進行加密。該 API 使用從 SQL Server 服務帳戶的 Windows 憑據中派生出來的密鑰。
因為服務主密鑰是自動生成且由系統管理的,它只需要很少的管理。服務主密鑰可以通過BACKUP SERVICE MASTER KEY語句來備份,格式為:
BACKUP SERVICE MASTER KEY TO FILE = 'path_to_file' ENCRYPTION BY PASSWORD = 'password'
'path_to_file' 指定要將服務主密鑰導出到的文件的完整路徑(包括文件名)。此路徑可以是本地路徑,也可以是網路位置的 UNC 路徑。
'password' 用於對備份文件中的服務主密鑰進行加密的密碼。此密碼應通過復雜性檢查。
應當對服務主密鑰進行備份,並將其存儲在另外一個單獨的安全位置。創建該備份應該是首先在伺服器中執行的管理操作之一。
如果需要從備份文件中恢復服務主密鑰,使用RESTORE SERVICE MASTER KEY語句。
RESTORE SERVICE MASTER KEY FROM FILE = 'path_to_file'
DECRYPTION BY PASSWORD = 'password' [FORCE]
'path_to_file' 指定存儲服務主密鑰的完整路徑(包括文件名)。path_to_file 可以是本地路徑,也可以是網路位置的 UNC 路徑。
PASSWORD = 'password' 指定對從文件中導入的服務主密鑰進行解密時所需的密碼。
FORCE 即使存在數據丟失的風險,也要強制替換服務主密鑰。
註:如果你在使用RESTORE SERVICE MASTER KEY時不得不使用FORCE選項,你可能會遇到部分或全部加密數據丟失的情況。
如果你的服務主密鑰泄露了,或者你想更改SQL Server服務帳戶,你可以通過ALTERSERVICE MASTER KEY語句重新生成或者恢復服務主密鑰。它的用法請參考聯機叢書。
因為服務主密鑰是SQL Server自動生成的,所以,它沒有對應的CREATE和DROP語句。
1.2 資料庫主密鑰
正如每個SQL Server有一個服務主密鑰,每個資料庫有自己的資料庫主密鑰。資料庫主密鑰通過CREATE MASTER KEY語句生成:
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'password'
這個語句創建資料庫主密鑰,使用指定的密碼加密它,並保存在資料庫中。同時,資料庫主密鑰也被使用服務主密鑰加密之後保存在master資料庫中,這就是所謂的「自動密鑰管理」。這個特性我們待會再講。
象服務主密鑰一樣,你可以備份和恢復資料庫主密鑰。使用BACKUP MASTER KEY備份資料庫主密鑰。語法類似於備份服務主密鑰:
BACKUP MASTER KEY TO FILE = 'path_to_file'
ENCRYPTION BY PASSWORD = 'password'
恢復資料庫主密鑰使用RESTORE MASTER KEY語句,它需要使用DECRYPTION BY PASSWORD子句提供備份時指定的加密密碼,還要使用ENCRYPTION BY PASSWORD子句,SQL Server使用它提供的密碼來加密資料庫主密鑰之後保存在資料庫中。
RESTORE MASTER KEY FROM FILE = 'path_to_file'
DECRYPTION BY PASSWORD = 'password'
ENCRYPTION BY PASSWORD = 'password'
[ FORCE ]
同樣,FORCE表示你將忽略在解密過程中的錯誤。
建議你在創建了資料庫主密鑰之後立即備份資料庫主密鑰,並把它保存到一個安全的地方。同樣,使用FORCE語句可能導致已加密數據的丟失。
要刪除資料庫主密鑰,使用DROP MASTER KEY語句,它刪除當前資料庫的主密鑰。在執行之前,確定你在正確的資料庫上下文中。
1.3 自動密鑰管理
當創建資料庫主密鑰時,它被使用提供的密碼加密然後被保存到當前資料庫中。同時,它被使用服務主密鑰加密並保存到master資料庫中。這份保存的資料庫主密鑰允許伺服器在需要的時候解密資料庫主密鑰,這就是自動密鑰管理。沒有自動密鑰管理的話,你必須在每次使用證書或密鑰加密或解密數據(它需要使用資料庫主密鑰)時使用OPEN MASTER KEY語句同時提供加密的密碼。使用自動密鑰管理,你不需要執行OPEN MASTER KEY語句,也不需要提供密碼。
自動密鑰管理的缺點就是每個sysadmin角色的成員都能夠解密資料庫主密鑰。你可以通過ALTER MASTER KEY語句的DROP ENCRYPTION BY SERVICE MASTER KEY子句,從而不使用自動密鑰管理。ALTER MASTER KEY的使用方法參見聯機叢書。
㈣ 對稱密鑰加密是如何進行的
對稱密鑰加密也叫秘密/專用密鑰加密(Secret Key Encryption),即發送和接收數據的雙方必須使用相同的/對稱的密鑰對明文進行加密和解密運算。
非對稱密鑰加密也叫公開密鑰加密(Public Key Encryption),是指每個人都有一對唯一對應的密鑰:公開密鑰和私有密鑰,公鑰對外公開,私鑰由個人秘密保存;用其中一把密鑰來加密,就只能用另一把密鑰來解密。發送數據的一方用另一方的公鑰對發送的信息進行加密,然後由接受者用自己的私鑰進行解密。公開密鑰加密技術解決了密鑰的發布和管理問題,是目前商業密碼的核心。使用公開密鑰技術,進行數據通信的雙方可以安全地確認對方身份和公開密鑰,提供通信的可鑒別性。
㈤ 加密技術的對稱加密
任何用戶如果想利用加密技術進行相互通信,首先都需要共有一個的密鑰。密鑰和演算法保密,由通信雙方妥善保管。
使用對稱加密技術對文件進行加密傳輸的實際過程分為三步:
首先,通信雙方利用絕對安全的渠道,協商確定共有密鑰,並妥善保管;
然後,發送方對需要傳輸的文件用自己的密鑰進行加密,然後通過網路把加密後的文件傳輸到接收方;
最後,接收方用自己的密鑰(實際上與發送方的密鑰相同)對收到的密文進行解密,最後得到發送方的明文。
㈥ 什麼是對稱加密
對稱加密採用單鑰密碼系統的加密方法,同一個密鑰可以同時用作信息的加密和解密,這種加密方法稱為對稱加密,也稱為單密鑰加密。
㈦ 求簡單的對稱加密演算法!!!!!!!!
你的加密有問題 會有歧義碼:
比如0->3 9->3 如果還原的話 3 還原到0,9就丟失了:
因為-1%9 = -1 所以要還原必須再多加一個周期
(9-1)%9 = 8:
void DeChar(char* p)
{
for( int i=0; i<strlen(p); i++ )
{
if (p[i] >= '0' && p[i] <= '9' )
{
p[i] = (((p[i] - 3 + '9'-'0') - '0') % ('9'-'0')) + '0';
}else if( p[i] >= 'a' && p[i] <= 'z' )
{
p[i] = (((p[i] - 4 + 'z' - 'a' ) - 'a') % ('z' - 'a') ) + 'a';
}else if( p[i] >= 'A' && p[i] <= 'Z' )
{
p[i] = (((p[i] - 5 + 'Z' - 'A' )- 'A') % ('Z' - 'A')) + 'A';
}
}
}
把取模增加1就好了 改一下:
void EnChar(char* p)
{
for( int i=0; i<strlen(p); i++ )
{
if (p[i] >= '0' && p[i] <= '9' )
{
p[i] = (((p[i] + 3) - '0') % ('9'-'0'+1)) + '0';
}else if( p[i] >= 'a' && p[i] <= 'z' )
{
p[i] = (((p[i] + 4) - 'a') % ('z' - 'a'+1) ) + 'a';
}else if( p[i] >= 'A' && p[i] <= 'Z' )
{
p[i] = (((p[i] + 5) - 'A') % ('Z' - 'A'+1)) + 'A';
}
}
}
void DeChar(char* p)
{
for( int i=0; i<strlen(p); i++ )
{
if (p[i] >= '0' && p[i] <= '9' )
{
p[i] = (((p[i] - 3 + '9'-'0'+1) - '0') % ('9'-'0'+1)) + '0';
}else if( p[i] >= 'a' && p[i] <= 'z' )
{
p[i] = (((p[i] - 4 + 'z' - 'a'+1 ) - 'a') % ('z' - 'a'+1) ) + 'a';
}else if( p[i] >= 'A' && p[i] <= 'Z' )
{
p[i] = (((p[i] - 5 + 'Z' - 'A' +1)- 'A') % ('Z' - 'A'+1)) + 'A';
}
}
}