『壹』 易語言 用des加密後解密數據4位元組長度的解不出來
des加密要求8個位元組對齊,所以4個位元組肯定解密不出來的。不過有解決的辦法。
『貳』 開發中常見的加密方式及應用
開發中常見的加密方式及應用
一、base64
簡述:Base64是網路上最常見的用於傳輸8Bit 位元組碼 的編碼方式之一,Base64就是一種基於64個可列印字元來表示二進制數據的方法。所有的數據都能被編碼為並只用65個字元就能表示的文本文件。( 65字元:A~Z a~z 0~9 + / = )編碼後的數據~=編碼前數據的4/3,會大1/3左右(圖片轉化為base64格式會比原圖大一些)。
應用:Base64編碼是從二進制到字元的過程,可用於在 HTTP 環境下傳遞較長的標識信息。例如,在Java Persistence系統Hibernate中,就採用了Base64來將一個較長的唯一 標識符 (一般為128-bit的UUID)編碼為一個字元串,用作HTTP 表單 和HTTP GET URL中的參數。在其他應用程序中,也常常需要把二進制 數據編碼 為適合放在URL(包括隱藏 表單域 )中的形式。此時,採用Base64編碼具有不可讀性,需要解碼後才能閱讀。
命令行進行Base64編碼和解碼
編碼:base64 123.png -o 123.txt
解碼:base64 123.txt -o test.png -D Base64編碼的原理
原理:
1)將所有字元轉化為ASCII碼;
2)將ASCII碼轉化為8位二進制;
3)將二進制3個歸成一組(不足3個在後邊補0)共24位,再拆分成4組,每組6位;
4)統一在6位二進制前補兩個0湊足8位;
5)將補0後的二進制轉為十進制;
6)從Base64編碼表獲取十進制對應的Base64編碼;
Base64編碼的說明:
a.轉換的時候,將三個byte的數據,先後放入一個24bit的緩沖區中,先來的byte占高位。
b.數據不足3byte的話,於緩沖區中剩下的bit用0補足。然後,每次取出6個bit,按照其值選擇查表選擇對應的字元作為編碼後的輸出。
c.不斷進行,直到全部輸入數據轉換完成。
d.如果最後剩下兩個輸入數據,在編碼結果後加1個「=」;
e.如果最後剩下一個輸入數據,編碼結果後加2個「=」;
f.如果沒有剩下任何數據,就什麼都不要加,這樣才可以保證資料還原的正確性。
二、HASH加密/單向散列函數
簡述:Hash演算法特別的地方在於它是一種單向演算法,用戶可以通過Hash演算法對目標信息生成一段特定長度(32個字元)的唯一的Hash值,卻不能通過這個Hash值重新獲得目標信息。對用相同數據,加密之後的密文相同。 常見的Hash演算法有MD5和SHA。由於加密結果固定,所以基本上原始的哈希加密已經不再安全,於是衍生出了加鹽的方式。加鹽:先對原始數據拼接固定的字元串再進行MD5加密。
特點:
1) 加密 後密文的長度是定長(32個字元的密文)的
2)如果明文不一樣,那麼散列後的結果一定不一樣
3)如果明文一樣,那麼加密後的密文一定一樣(對相同數據加密,加密後的密文一樣)
4)所有的加密演算法是公開的
5)不可以逆推反算(不能根據密文推算出明文),但是可以暴力 破解 ,碰撞監測
原理:MD5消息摘要演算法,屬Hash演算法一類。MD5演算法對輸入任意長度的消息進行運行,產生一個128位的消息摘要。
1)數據填充
對消息進行數據填充,使消息的長度對512取模得448,設消息長度為X,即滿足X mod 512=448。根據此公式得出需要填充的數據長度。
填充方法:在消息後面進行填充,填充第一位為1,其餘為0。
2)添加信息長度
在第一步結果之後再填充上原消息的長度,可用來進行的存儲長度為64位。如果消息長度大於264,則只使用其低64位的值,即(消息長度 對264取模)。
在此步驟進行完畢後,最終消息長度就是512的整數倍。
3)數據處理
准備需要用到的數據:
4個常數:A = 0x67452301, B = 0x0EFCDAB89, C = 0x98BADCFE, D = 0x10325476;
4個函數:F(X,Y,Z)=(X & Y) | ((~X) & Z);G(X,Y,Z)=(X & Z) | (Y & (~Z));H(X,Y,Z)=X ^ Y ^ Z;I(X,Y,Z)=Y ^ (X | (~Z));
把消息分以512位為一分組進行處理,每一個分組進行4輪變換,以上面所說4個常數為起始變數進行計算,重新輸出4個變數,以這4個變數再進行下一分組的運算,如果已經是最後一個分組,則這4個變數為最後的結果,即MD5值。
三、對稱加密
經典演算法:
1)DES數據加密標准
DES演算法的入口參數有三個:Key、Data、Mode。其中Key為8個位元組共64位,是DES演算法的工作密鑰;Data也為8個位元組64位,是要被加密或被解密的數據;Mode為DES的工作方式,有兩種:加密或解密。
DES演算法是這樣工作的:如Mode為加密,則用Key去把數據Data進行加密, 生成Data的密碼形式(64位)作為DES的輸出結果;如Mode為解密,則用Key去把密碼形式的數據Data解密,還原為Data的明碼形式(64位)作為DES的輸出結果。在通信網路的兩端,雙方約定一致的Key,在通信的源點用Key對核心數據進行DES加密,然後以密碼形式在公共通信網(如電話網)中傳輸到通信網路的終點,數據到達目的地後,用同樣的Key對密碼數據進行解密,便再現了明碼形式的核心數據。這樣,便保證了核心數據(如PIN、MAC等)在公共通信網中傳輸的安全性和可靠性。
2)3DES使用3個密鑰,對消息進行(密鑰1·加密)+(密鑰2·解密)+(密鑰3·加密)
3)AES高級加密標准
如圖,加密/解密使用相同的密碼,並且是可逆的
四、非對稱加密
特點:
1)使用公鑰加密,使用私鑰解密
2)公鑰是公開的,私鑰保密
3)加密處理安全,但是性能極差
經典演算法RSA:
1)RSA原理
(1)求N,准備兩個質數p和q,N = p x q
(2)求L,L是p-1和q-1的最小公倍數。L = lcm(p-1,q-1)
(3)求E,E和L的最大公約數為1(E和L互質)
(4)求D,E x D mode L = 1
五、數字簽名
原理以及應用場景:
1)數字簽名的應用場景
需要嚴格驗證發送方身份信息情況
2)數字簽名原理
(1)客戶端處理
對"消息"進行HASH得到"消息摘要"
發送方使用自己的私鑰對"消息摘要"加密(數字簽名)
把數字簽名附著在"報文"的末尾一起發送給接收方
(2)服務端處理
對"消息" HASH得到"報文摘要"
使用公鑰對"數字簽名"解密
對結果進行匹配
六、數字證書
簡單說明:
證書和駕照很相似,裡面記有姓名、組織、地址等個人信息,以及屬於此人的公鑰,並有認證機構施加數字簽名,只要看到公鑰證書,我們就可以知道認證機構認證該公鑰的確屬於此人。
數字證書的內容:
1)公鑰
2)認證機構的數字簽名
證書的生成步驟:
1)生成私鑰openssl genrsa -out private.pem 1024
2)創建證書請求openssl req -new -key private.pem -out rsacert.csr
3)生成證書並簽名,有效期10年openssl x509 -req -days 3650 -in rsacert.csr -signkey private.pem -out rsacert.crt
4)將PEM格式文件轉換成DER格式openssl x509 -outform der -in rsacert.crt -out rsacert.der
5)導出P12文件openssl pkcs12 -export -out p.p12 -inkey private.pem -in rsacert.crt
iOS開發中的注意點:
1)在iOS開發中,不能直接使用PEM格式的證書,因為其內部進行了Base64編碼,應該使用的是DER的證書,是二進制格式的;
2)OpenSSL默認生成的都是PEM格式的證書。
七、https
HTTPS和HTTP的區別:
超文本傳輸協議HTTP協議被用於在Web瀏覽器和網站伺服器之間傳遞信息。HTTP協議以明文方式發送內容,不提供任何方式的數據加密,如果攻擊者截取了Web瀏覽器和網站伺服器之間的傳輸報文,就可以直接讀懂其中的信息,因此HTTP協議不適合傳輸一些敏感信息,比如信用卡號、密碼等。
為了解決HTTP協議的這一缺陷,需要使用另一種協議:安全套接字層超文本傳輸協議HTTPS。為了數據傳輸的安全,HTTPS在HTTP的基礎上加入了SSL協議,SSL依靠證書來驗證伺服器的身份,並為瀏覽器和伺服器之間的通信加密。
HTTPS和HTTP的區別主要為以下四點:
1)https協議需要到ca申請證書,一般免費證書很少,需要交費。
2)http是 超文本傳輸協議 ,信息是明文傳輸,https則是具有 安全性 的 ssl 加密傳輸協議。
3)http和https使用的是完全不同的連接方式,用的埠也不一樣,前者是80,後者是443。
4)http的連接很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的 網路協議 ,比http協議安全。
5)SSL:Secure Sockets Layer安全套接字層;用數據加密(Encryption)技術,可確保數據在網路上傳輸過程中不會被截取及竊聽。目前一般通用之規格為40 bit之安全標准,美國則已推出128 bit之更高安全標准,但限制出境。只要3.0版本以上之I.E.或Netscape 瀏覽器 即可支持SSL。目前版本為3.0。SSL協議位於TCP/IP協議與各種應用層協議之間,為數據通訊提供安全支持。SSL協議可分為兩層:SSL記錄協議(SSL Record Protocol):它建立在可靠的傳輸協議(如TCP)之上,為高層協議提供數據封裝、壓縮、加密等基本功能的支持。SSL握手協議(SSL Handshake Protocol):它建立在SSL記錄協議之上,用於在實際的數據傳輸開始前,通訊雙方進行身份認證、協商加密演算法、交換加密密鑰等。
『叄』 四個位元組是多少個二進制位
4個位元組由8*4=32個二進制位組成。
位元組是二進制數據的單位。一個位元組通常8位長。但是,一些老型號計算機結構使用不同的長度。為了避免混亂,在大多數國際文獻中,使用詞代替byte。
在多數的計算機系統中,一個位元組是一個8位長的數據單位,大多數的計算機用一個位元組表示一個字元、數字或其他字元。一個位元組也可以表示一系列二進制位。在一些計算機系統中,4個位元組代表一個字,這是計算機在執行指令時能夠有效處理數據的單位。
不同數量級間:
1B(byte,位元組)= 8 bit。
1KB(Kibibyte,千位元組)=1024B= 2^10 B。
1MB(Mebibyte,兆位元組,百萬位元組,簡稱「兆」)=1024KB= 2^20 B。
1GB(Gigabyte,吉位元組,十億位元組,又稱「千兆」)=1024MB= 2^30 B。
1TB(Terabyte,萬億位元組,太位元組)=1024GB= 2^40 B。
1PB(Petabyte,千萬億位元組,拍位元組)=1024TB= 2^50 B。
1EB(Exabyte,百億億位元組,艾位元組)=1024PB= 2^60 B。
1ZB(Zettabyte,十萬億億位元組,澤位元組)= 1024EB= 2^70 B。
『肆』 對稱加密演算法以及使用方法
加密的原因:保證數據安全
加密必備要素:1、明文/密文 2、秘鑰 3、演算法
秘鑰:在密碼學中是一個定長的字元串、需要根據加密演算法確定其長度
加密演算法解密演算法一般互逆、也可能相同
常用的兩種加密方式:
對稱加密:秘鑰:加密解密使用同一個密鑰、數據的機密性雙向保證、加密效率高、適合加密於大數據大文件、加密強度不高(相對於非對稱加密)
非對稱加密:秘鑰:加密解密使用的不同秘鑰、有兩個密鑰、需要使用密鑰生成演算法生成兩個秘鑰、數據的機密性只能單向加密、如果想解決這個問題、雙向都需要各自有一對秘鑰、加密效率低、加密強度高
公鑰:可以公開出來的密鑰、公鑰加密私鑰解密
私鑰:需要自己妥善保管、不能公開、私鑰加密公鑰解密
安全程度高:多次加密
按位異或運算
凱撒密碼:加密方式 通過將銘文所使用的字母表按照一定的字數平移來進行加密
mod:取余
加密三要素:明文/密文(字母)、秘鑰(3)、演算法(向右平移3/-3)
安全常識:不要使用自己研發的演算法、不要鑽牛角尖、沒必要研究底層實現、了解怎麼應用;低強度的密碼比不進行任何加密更危險;任何密碼都會被破解;密碼只是信息安全的一部分
保證數據的機密性、完整性、認證、不可否認性
計算機操作對象不是文字、而是由0或1排列而成的比特序列、程序存儲在磁碟是二進制的字元串、為比特序列、將現實的東西映射為比特序列的操作稱為編碼、加密又稱之為編碼、解密稱之為解碼、根據ASCII對照表找到對應的數字、轉換成二進制
三種對稱加密演算法:DES\3DES\ AES
DES:已經被破解、除了用它來解密以前的明文、不再使用
密鑰長度為56bit/8、為7byte、每隔7個bit會設置一個用於錯誤檢查的比特、因此實際上是64bit
分組密碼(以組為單位進行處理):加密時是按照一個單位進行加密(8個位元組/64bit為一組)、每一組結合秘鑰通過加密演算法得到密文、加密後的長度不變
3DES:三重DES為了增加DES的強度、將DES重復三次所得到的一種加密演算法 密鑰長度24byte、分成三份 加密--解密--加密 目的:為了兼容DES、秘鑰1秘鑰2相同==三個秘鑰相同 ---加密一次 密鑰1秘鑰3相同--加密三次 三個密鑰不相同最好、此時解密相當於加密、中間的一次解密是為了有三個密鑰相同的情況
此時的解密操作與加密操作互逆,安全、效率低
數據先解密後加密可以么?可以、解密相當於加密、加密解密說的是演算法
AES:(首選推薦)底層演算法為Rijndael 分組長度為128bit、密鑰長度為128bit到256bit范圍內就可以 但是在AES中、密鑰長度只有128bit\192bit\256bit 在go提供的介面中、只能是16位元組(128bit)、其他語言中秘鑰可以選擇
目前為止最安全的、效率高
底層演算法
分組密碼的模式:
按位異或、對數據進行位運算、先將數據轉換成二進制、按位異或操作符^、相同為真、不同為假、非0為假 按位異或一次為加密操作、按位異或兩次為解密操作:a和b按位異或一次、結果再和b按位異或
ECB : 如果明文有規律、加密後的密文有規律不安全、go里不提供該介面、明文分組分成固定大小的塊、如果最後一個分組不滿足分組長度、則需要補位
CBC:密碼鏈
問題:如何對字元串進行按位異或?解決了ECB的規律可查缺點、但是他不能並行處理、最後一個明文分組也需要填充 、初始化向量長度與分組長度相同
CFB:密文反饋模式
不需要填充最後一個分組、對密文進行加密
OFB:
不需要對最後一組進行填充
CTR計數器:
不需要對最後一組進行填充、不需要初始化向量
Go中的實現
官方文檔中:
在創建aes或者是des介面時都是調用如下的方法、返回的block為一個介面
func NewCipher(key [] byte ) ( cipher . Block , error )
type Block interface {
// 返回加密位元組塊的大小
BlockSize() int
// 加密src的第一塊數據並寫入dst,src和dst可指向同一內存地址
Encrypt(dst, src []byte)
// 解密src的第一塊數據並寫入dst,src和dst可指向同一內存地址
Decrypt(dst, src []byte)
}
Block介面代表一個使用特定密鑰的底層塊加/解密器。它提供了加密和解密獨立數據塊的能力。
Block的Encrypt/Decrypt也能進行加密、但是只能加密第一組、因為aes的密鑰長度為16、所以進行操作的第一組數據長度也是16
如果分組模式選擇的是cbc
func NewCBCEncrypter(b Block, iv []byte) BlockMode 加密
func NewCBCDecrypter(b Block, iv []byte) BlockMode 解密
加密解密都調用同一個方法CryptBlocks()
並且cbc分組模式都會遇到明文最後一個分組的補充、所以會用到加密位元組的大小
返回一個密碼分組鏈接模式的、底層用b加密的BlockMode介面,初始向量iv的長度必須等於b的塊尺寸。iv自己定義
返回的BlockMode同樣也是一個介面類型
type BlockMode interface {
// 返回加密位元組塊的大小
BlockSize() int
// 加密或解密連續的數據塊,src的尺寸必須是塊大小的整數倍,src和dst可指向同一內存地址
CryptBlocks(dst, src []byte)
}
BlockMode介面代表一個工作在塊模式(如CBC、ECB等)的加/解密器
返回的BlockMode其實是一個cbc的指針類型中的b和iv
# 加密流程:
1. 創建一個底層使用des/3des/aes的密碼介面 "crypto/des" func NewCipher(key []byte) (cipher.Block, error) # -- des func NewTripleDESCipher(key []byte) (cipher.Block, error) # -- 3des "crypto/aes" func NewCipher(key []byte) (cipher.Block, error) # == aes
2. 如果使用的是cbc/ecb分組模式需要對明文分組進行填充
3. 創建一個密碼分組模式的介面對象 - cbc func NewCBCEncrypter(b Block, iv []byte) BlockMode # 加密 - cfb func NewCFBEncrypter(block Block, iv []byte) Stream # 加密 - ofb - ctr
4. 加密, 得到密文
流程:
填充明文:
先求出最後一組中的位元組數、創建新切片、長度為新切片、值也為切片的長度、然後利用bytes.Reapet將長度換成位元組切片、追加到原明文中
//明文補充
func padPlaintText(plaintText []byte,blockSize int)[]byte{
//1、求出需要填充的個數
padNum := blockSize-len(plaintText) % blockSize
//2、對填充的個數進行操作、與原明文進行合並
newPadding := []byte{byte(padNum)}
newPlain := bytes.Repeat(newPadding,padNum)
plaintText = append(plaintText,newPlain...)
return plaintText
}
去掉填充數據:
拿去切片中的最後一個位元組、得到尾部填充的位元組個數、截取返回
//解密後的明文曲調補充的地方
func createPlaintText(plaintText []byte,blockSize int)[]byte{
//1、得到最後一個位元組、並將位元組轉換成數字、去掉明文中此數字大小的位元組
padNum := int(plaintText[len(plaintText)-1])
newPadding := plaintText[:len(plaintText)-padNum]
return newPadding
}
des加密:
1、創建一個底層使用des的密碼介面、參數為秘鑰、返回一個介面
2、對明文進行填充
3、創建一個cbc模式的介面、需要創建iv初始化向量、返回一個blockmode對象
4、加密、調用blockmode中的cryptBlock函數進行加密、參數為目標參數和源參數
//des利用分組模式cbc進行加密
func EncryptoText(plaintText []byte,key []byte)[]byte{
//1、創建des對象
cipherBlock,err := des.NewCipher(key)
if err != nil {
panic(err)
}
//2、對明文進行填充
newText := padPlaintText(plaintText,cipherBlock.BlockSize())
//3、選擇分組模式、其中向量的長度必須與分組長度相同
iv := make([]byte,cipherBlock.BlockSize())
blockMode := cipher.NewCBCEncrypter(cipherBlock,iv)
//4、加密
blockMode.CryptBlocks(newText,newText)
return newText
}
des解密:
1、創建一個底層使用des的密碼介面、參數為秘鑰、返回一個介面
2、創建一個cbc模式的介面、需要創建iv初始化向量,返回一個blockmode對象
3、加密、調用blockmode中的cryptBlock函數進行解密、參數為目標參數和源參數
4、調用去掉填充數據的方法
//des利用分組模式cbc進行解密
func DecryptoText(cipherText []byte, key []byte)[]byte{
//1、創建des對象
cipherBlock,err := des.NewCipher(key)
if err != nil {
panic(err)
}
//2、創建cbc分組模式介面
iv := []byte("12345678")
blockMode := cipher.NewCBCDecrypter(cipherBlock,iv)
//3、解密
blockMode.CryptBlocks(cipherText,cipherText)
//4、將解密後的數據進行去除填充的數據
newText := clearPlaintText(cipherText,cipherBlock.BlockSize())
return newText
}
Main函數調用
func main(){
//需要進行加密的明文
plaintText := []byte("CBC--密文沒有規律、經常使用的加密方式,最後一個分組需要填充,需要初始化向量" +
"(一個數組、數組的長度與明文分組相等、數據來源:負責加密的人提供,加解密使用的初始化向量必須相同)")
//密鑰Key的長度需要與分組長度相同、且加密解密的密鑰相同
key := []byte("1234abcd")
//調用加密函數
cipherText := EncryptoText(plaintText,key)
newPlaintText := DecryptoText(cipherText,key)
fmt.Println(string(newPlaintText))
}
AES加密解密相同、所以只需要調用一次方法就可以加密、調用兩次則解密
推薦是用分組模式:cbc、ctr
aes利用分組模式cbc進行加密
//對明文進行補充
func paddingPlaintText(plaintText []byte , blockSize int ) []byte {
//1、求出分組余數
padNum := blockSize - len(plaintText) % blockSize
//2、將余數轉換為位元組切片、然後利用bytes.Repeat得出有該余數的大小的位元組切片
padByte := bytes.Repeat([]byte{byte(padNum)},padNum)
//3、將補充的位元組切片添加到原明文中
plaintText = append(plaintText,padByte...)
return plaintText
}
//aes加密
func encryptionText(plaintText []byte, key []byte) []byte {
//1、創建aes對象
block,err := aes.NewCipher(key)
if err != nil {
panic(err)
}
//2、明文補充
newText := paddingPlaintText(plaintText,block.BlockSize())
//3、創建cbc對象
iv := []byte("12345678abcdefgh")
blockMode := cipher.NewCBCEncrypter(block,iv)
//4、加密
blockMode.CryptBlocks(newText,newText)
return newText
}
//解密後的去尾
func clearplaintText(plaintText []byte, blockSize int) []byte {
//1、得到最後一個位元組、並轉換成整型數據
padNum := int(plaintText[len(plaintText)-1])
//2、截取明文位元組中去掉得到的整型數據之前的數據、此處出錯、沒有用len-padNum
newText := plaintText[:len(plaintText)-padNum]
return newText
}
//aes解密
func deCryptionText(crypherText []byte, key []byte ) []byte {
//1、創建aes對象
block, err := aes.NewCipher(key)
if err != nil {
panic(err)
}
//2、創建cbc對象
iv := []byte("12345678abcdefgh")
blockMode := cipher.NewCBCDecrypter(block,iv)
//3、解密
blockMode.CryptBlocks(crypherText,crypherText)
//4、去尾
newText := clearplaintText(crypherText,block.BlockSize())
return newText
}
func main(){
//需要進行加密的明文
plaintText := []byte("CBC--密文沒有規律、經常使用的加密方式,最後一個分組需要填充,需要初始化向量")
//密鑰Key的長度需要與分組長度相同、且加密解密的密鑰相同
key := []byte("12345678abcdefgh")
//調用加密函數
cipherText := encryptionText(plaintText,key)
//調用解密函數
newPlaintText := deCryptionText(cipherText,key)
fmt.Println("解密後",string(newPlaintText))
}
//aes--ctr加密
func encryptionCtrText(plaintText []byte, key []byte) []byte {
//1、創建aes對象
block,err := aes.NewCipher(key)
if err != nil {
panic(err)
}
//2、創建ctr對象,雖然ctr模式不需要iv,但是go中使用ctr時還是需要iv
iv := []byte("12345678abcdefgh")
stream := cipher.NewCTR(block,iv)
stream.XORKeyStream(plaintText,plaintText)
return plaintText
}
func main() {
//aes--ctr加密解密、調用兩次即為解密、因為加密解密函數相同stream.XORKeyStream
ctrcipherText := encryptionCtrText(plaintText, key)
ctrPlaintText := encryptionCtrText(ctrcipherText,key)
fmt.Println("aes解密後", string(ctrPlaintText))
}
英文單詞:
明文:plaintext 密文:ciphertext 填充:padding/fill 去掉clear 加密Encryption 解密Decryption
『伍』 單位元組、雙位元組、4位元組都是什麼意思
單位元組指只佔1個英文字元;雙位元組是佔2個英文字元的,中文字元都占兩個位元組,4位元組是指佔4個
英文字元。
計算機中的數據都是以0和1來表示的,其中一個0或者一個1稱之為一位,8位稱為一個位元組(Byte),兩個位元組稱為一個字(Word)(雙位元組),4個位元組稱為雙字(Dword)(四位元組)。
單位元組的英文是Byte;比特是最小的數值單位,它的英文是Bit。
(5)兩個數字加密4個位元組擴展閱讀:
位元組的換算:
1 B/byte(位元組) = 8 bit(比特) 。
1 KB(千位元組) = 1024 B/byte(位元組) 。
1 MB = 1024 KB 。
1 GB = 1024 MB 。
1TB =1024 GB 。
1 PB = 1024 TB 。
1 EB = 1024 PB。
比特和位:
比特和位實際上是同一個東西,計算機只能處理二進制數據流,二進制的0或1就代表一個位。 計算機中的32/64位指計算機的cpu一次能處理的最大位數。8位元組等於64位也就是說cpu可以一次處理8個位元組的數據。
參考資料:網路-位元組
『陸』 計算機裡面講的四個位元組,是什麼意思啊
計算機的存儲單位,信息存在計算機上是占磁碟空間的。
一個英文字母佔一個位元組;一人漢字占兩個位元組(即一個字),四人位元組是兩個字(即雙字)。
『柒』 誰知道這幾個漢字是用什麼方法加密的
單純從這幾個字分析出來很難。但可以肯定這樣幾點:
1、單個字加密,每字加密後長度4
2、對每個字的ASCII碼進行變化得到密文。因為每個漢字占兩個位元組,比如「許」的ASCII為208 237 ,「秀」的ASCII為208 227,密文的演算法首先對這兩個位元組的ASCII進行了變換(關鍵!!),可能最後轉化的是16進制的數字輸出
方便的話,可以再多提供幾組明文和密文,便於分析
『捌』 c語言 數據加密
什麼是異或演算法
異或的特點是原始值經過兩次異或某一個數後會變成原來的值,所以有時利用這個特性來進行加密,加密端把數據與一個密鑰進行異或操作,生成密文。接收方收到密文後利用加密方提供的密鑰進行再次異或操作就能得到明文。
常式:
/*以DWORD為單位對文件進行加密,將每個DWORD與0xfcba0000(密鑰)做異或,寫入另一個文件*/
#include<stdio.h>
#include<stdlib.h>
#defineDWORDunsignedlong
#defineBYTEunsignedchar
#definefalse0
#definetrue1
intmain(intargc,char*argv[])
{
FILE*hSource;
FILE*hDestination;
DWORDdwKey=0xfcba0000;
char*pbBuffer;
DWORDdwBufferLen=sizeof(DWORD);
DWORDdwCount;
DWORDdwData;
if(argv[1]==0||argv[2]==0)
{
printf("missingargument!
");
returnfalse;
}
char*szSource=argv[1];
char*szDestination=argv[2];
hSource=fopen(szSource,"rb");//打開源文件.
hDestination=fopen(szDestination,"wb");//打開目標文件
if(hSource==NULL){printf("openSourceFileerror!");returnfalse;}
if(hDestination==NULL){printf("openDestinationFileerror!");returnfalse;}
//分配緩沖區
pbBuffer=(char*)malloc(dwBufferLen);
do{
//從源文件中讀出dwBlockLen個位元組
dwCount=fread(pbBuffer,1,dwBufferLen,hSource);
//加密數據
dwData=*(DWORD*)pbBuffer;//char*TOdword
dwData^=dwKey;//xoroperation
pbBuffer=(char*)&dwData;
//將加密過的數據寫入目標文件
fwrite(pbBuffer,1,dwCount,hDestination);
}while(!feof(hSource));
//關閉文件、釋放內存
fclose(hSource);
fclose(hDestination);
printf("%sisencryptedto%s
",szSource,szDestination);
return0;
}
『玖』 數據以4位元組為一塊的對稱加密演算法有哪些
厲害了我的歌
『拾』 對稱加密演算法的加密演算法主要有哪些
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是密鑰位元組長度。
(10)兩個數字加密4個位元組擴展閱讀:
普遍而言,有3個獨立密鑰的3DES(密鑰選項1)的密鑰長度為168位(三個56位的DES密鑰),但由於中途相遇攻擊,它的有效安全性僅為112位。密鑰選項2將密鑰長度縮短到了112位,但該選項對特定的選擇明文攻擊和已知明文攻擊的強度較弱,因此NIST認定它只有80位的安全性。
對密鑰選項1的已知最佳攻擊需要約2組已知明文,2部,2次DES加密以及2位內存(該論文提到了時間和內存的其它分配方案)。
這在現在是不現實的,因此NIST認為密鑰選項1可以使用到2030年。若攻擊者試圖在一些可能的(而不是全部的)密鑰中找到正確的,有一種在內存效率上較高的攻擊方法可以用每個密鑰對應的少數選擇明文和約2次加密操作找到2個目標密鑰中的一個。