加密和解密(1):常用資料加密和解密方法彙總
資料加密技術是網路中最基本的安全技術,主要是通過對網路中傳輸的資訊進行資料加密來保障其安全性,這是一種主動安全防禦策略,用很小的代價即可為資訊提供相當大的安全保護。
一、加密的基本概念
"加密",是一種限制對網路上傳輸資料的訪問權的技術。原始資料(也稱為明文,plaintext)被加密裝置(硬體或軟體)和金鑰加密而產生的經過編碼的資料稱為密文(ciphertext)。將密文還原為原始明文的過程稱為解密,它是加密的反向處理,但解密者必須利用相同型別的加密裝置和金鑰對密文進行解密。
加密的基本功能包括:
1. 防止不速之客檢視機密的資料檔案;
2. 防止機密資料被洩露或篡改;
3. 防止特權使用者(如系統管理員)檢視私人資料檔案;
4. 使入侵者不能輕易地查詢一個系統的檔案。
資料加密是確保計算機網路安全的一種重要機制,雖然由於成本、技術和管理上的複雜性等原因,目前尚未在網路中普及,但資料加密的確是實現分散式系統和網路環境下資料安全的重要手段之一。
資料加密可在網路OSI七層協議(OSI是Open System Interconnect的縮寫,意為開放式系統互聯。國際標準組織(國際標準化組織)制定了OSI模型。這個模型把網路通訊的工作分為7層,分別是物理層、資料鏈路層、網路層、傳輸層、會話層、表示層和應用層。)的多層上實現、所以從加密技術應用的邏輯位置看,有三種方式:
①鏈路加密:通常把網路層以下的加密叫鏈路加密,主要用於保護通訊節點間傳輸的資料,加解密由置於線路上的密碼裝置實現。根據傳遞的資料的同步方式又可分為同步通訊加密和非同步通訊加密兩種,同步通訊加密又包含位元組同步通訊加密和位同步通訊加密。
②節點加密:是對鏈路加密的改進。在協議傳輸層上進行加密,主要是對源節點和目標節點之間傳輸資料進行加密保護,與鏈路加密類似.只是加密演算法要結合在依附於節點的加密模件中,克服了鏈路加密在節點處易遭非法存取的缺點。
③端對端加密:網路層以上的加密稱為端對端加密。是面向網路層主體。對應用層的資料資訊進行加密,易於用軟體實現,且成本低,但金鑰管理問題困難,主要適合大型網路系統中資訊在多個發方和收方之間傳輸的情況。
二、資料加密的應用
1、 媒體加密:DRM
2、 檔案加密:文字加密、pdf、word
3、 資料加密:ASP.NET(C#)中的資料加密
4、 硬體加密:加密狗
三.加密技術發展趨勢
①私用金鑰加密技術與公開金鑰加密技術相結合:鑑於兩種密碼體制加密的特點,在實際應用中可以採用折衷方案,即結合使用DES/IDEA和RSA,以DES為"核心",RSA為"外殼",對於網路中傳輸的資料可用DES或IDEA加密,而加密用的金鑰則用RSA加密傳送,此種方法既保證了資料安全又提高了加密和解密的速度,這也是目前加密技術發展的新方向之一。
②尋求新演算法:跳出以常見的迭代為基礎的構造思路,脫離基於某些數學問題複雜性的構造方法。如劉尊全先生提出的劉氏演算法,是一種基於金鑰的公開金鑰體制,它採用了隨機性原理構造加解密變換,並將其全部運算控制隱匿於金鑰中,金鑰長度可變。它是採用選取一定長度的分割來構造大的搜尋空間,從而實現一次非線性變換。此種加密演算法加密強度高、速度快、計算開銷低。
③加密最終將被整合到系統和網路中,例如IPV6協議就已有了內建加密的支援,在硬體方面,Intel公司正研製一種加密協處理器。它可以整合到微機的主極上。
四、加密技術的分類
加密型別可以簡單地分為四種:
1. 根本不考慮解密問題;
2. 私用金鑰加密技術:對稱式加密(Symmetric Key Encryption):對稱式加密方式對加密和解密使用相同的金鑰。通常,這種加密方式在應用中難以實施,因為用同一種安全方式共享金鑰很難。如:RC4、RC2、DES 和 AES 系列加密演算法。
3. 公開金鑰加密技術:非對稱金鑰加密(Asymmetric Key Encryption):非對稱金鑰加密使用一組公共/私人金鑰系統,加密時使用一種金鑰,解密時使用另一種金鑰。公共金鑰可以廣泛的共享和透露。當需要用加密方式向伺服器外部傳送資料時,這種加密方式更方便。如: RSA
4. 數字證書。(Certificate):數字證書是一種非對稱金鑰加密,但是,一個組織可以使用證書並通過數字簽名將一組公鑰和私鑰與其擁有者相關聯。
五、對稱加密之DES加密與解密
1、 對稱加密
對稱加密,是一種比較傳統的加密方式,其加密運算、解密運算使用的是同樣的金鑰,資訊的傳送者和資訊的接收者在進行資訊的傳輸與處理時,必須共同持有該密碼(稱為對稱密碼)。因此,通訊雙方都必須獲得這把鑰匙,並保持鑰匙的祕密。
單鑰密碼系統的安全性依賴於以下兩個因素:
第一、加密演算法必須是足夠強的,僅僅基於密文字身去解密資訊在實踐上是不可能的。
第二、加密方法的安全性依賴於金鑰的祕密性,而不是演算法的祕密性,因此,我們沒有必要確保演算法的祕密性(事實上,現實中使用的很多單鑰密碼系統的演算法都是公開的),但是我們一定要保證金鑰的祕密性。
DES(Data Encryption Standard)和TripleDES是對稱加密的兩種實現。
DES和TripleDES基本演算法一致,只是TripleDES演算法提供的key位數更多,加密可靠性更高。
DES使用的金鑰key為8位元組,初始向量IV也是8位元組。
TripleDES使用24位元組的key,初始向量IV也是8位元組。
兩種演算法都是以8位元組為一個塊進行加密,一個數據塊一個數據塊的加密,一個8位元組的明文加密後的密文也是8位元組。如果明文長度不為8位元組的整數倍,新增值為0的位元組湊滿8位元組整數倍。所以加密後的密文長度一定為8位元組的整數倍。
2、 加密解密過程
Figure 1. DES加密解密過程
上圖是整個DES和TripleDES演算法的加密解密過程,下面以TripleDES為例,結合dotnet分析加密解密的各個步驟,並給出相關實現程式碼。
1、 生成key和IV
System.Security.Cryptography. TripleDESCryptoServiceProvider類是dotnet中實現TripleDES演算法的主要的類。
TripleDESCryptoServiceProvider類只有一個構造方法TripleDESCryptoServiceProvider(),這個方法把一些屬性初始化:
KeySize(加密金鑰長度,以位為單位)= 192(24位元組)
BlockSize(加密處理的資料塊大小,以位為單位)= 64(8位元組)
FeedbackSize(加密資料塊後返回的資料大小,以位為單位)= 64(8位元組)
TripleDESCryptoServiceProvider構造方法同時會初始化一組隨機的key和IV。
預設的TripleDESCryptoServiceProvider的key為24位元組,IV為8位元組,加密資料塊為8位元組。
生成key和IV的程式碼很簡單:
TripleDESCryptoServiceProvider tDESalg = new TripleDESCryptoServiceProvider(); byte[] keyArray = tDESalg.Key; byte[] IVArray = tDESalg.IV;
生成的key和IV在加密過程和解密過程都要使用。
2、 字串明文轉成某一內碼表對應的編碼位元組流
待加密的資料可能有兩種形式,一種是二進位制的資料,本身就是一組位元組流,這樣的資料可以跳過這一步,直接進入加密步驟。還有一種情況是字串資料,字串中同樣的字元使用不同的內碼表會生成不同的位元組碼,所以從字串到位元組流的轉換是需要指定使用何種編碼的。在解密之後,要從位元組流轉換到字串就要使用相同的內碼表解碼,否則就會出現亂碼。
// 待加密的字串
string plainTextString = "Here is some data to encrypt. 這裡是一些要加密的資料。";
// 使用utf-8編碼(也可以使用其它的編碼)
Encoding sEncoding = Encoding.GetEncoding("utf-8");
// 把字串明文轉換成utf-8編碼的位元組流
byte[] plainTextArray = sEncoding.GetBytes(plainTextString);
3、 加密操作
加密的原料是明文位元組流,TripleDES演算法對位元組流進行加密,返回的是加密後的位元組流。同時要給定加密使用的key和IV。
// 把字串明文轉換成utf-8編碼的位元組流
byte[] plainTextArray = sEncoding.GetBytes(plainTextString); public static byte[] EncryptString(byte[] plainTextArray, byte[] Key, byte[] IV) { // 建立一個MemoryStream,這裡面存放加密後的資料流 MemoryStream mStream = new MemoryStream(); // 使用MemoryStream 和key、IV新建一個CryptoStream 物件 CryptoStream cStream = new CryptoStream(mStream, new TripleDESCryptoServiceProvider().CreateEncryptor(Key, IV), CryptoStreamMode.Write); // 將加密後的位元組流寫入到MemoryStream cStream.Write(plainTextArray, 0, plainTextArray.Length); //把緩衝區中的最後狀態更新到MemoryStream,並清除cStream的快取區 cStream.FlushFinalBlock(); // 把解密後的資料流轉成位元組流 byte[] ret = mStream.ToArray(); // 關閉兩個streams. cStream.Close(); mStream.Close(); return ret; }
4、 解密操作
解密操作解密上面步驟生成的密文byte[],需要使用到加密步驟使用的同一組Key和IV。
// 呼叫解密方法,返回已解密資料的byte[]
byte[] finalPlainTextArray = DecryptTextFromMemory(Data, keyArray, IVArray); public static byte[] DecryptTextFromMemory(byte[] EncryptedDataArray, byte[] Key, byte[] IV) { // 建立一個MemoryStream,這裡面存放加密後的資料流 MemoryStream msDecrypt = new MemoryStream(EncryptedDataArray); // 使用MemoryStream 和key、IV新建一個CryptoStream 物件 CryptoStream csDecrypt = new CryptoStream(msDecrypt, new TripleDESCryptoServiceProvider().CreateDecryptor(Key, IV), CryptoStreamMode.Read); // 根據密文byte[]的長度(可能比加密前的明文長),新建一個存放解密後明文的byte[] byte[] DecryptDataArray = new byte[EncryptedDataArray.Length]; // 把解密後的資料讀入到DecryptDataArray csDecrypt.Read(DecryptDataArray, 0, DecryptDataArray.Length); msDecrypt.Close(); csDecrypt.Close(); return DecryptDataArray; }
有一點需要注意,DES加密是以資料塊為單位加密的,8個位元組一個數據塊,如果待加密明byte[]的長度不是8位元組的整數倍,演算法先用值為“0”的byte補足8個位元組,然後進行加密。所以加密後的密文長度一定是8的整數倍。這樣的密文解密後如果補了0值的byte,則解密後這些0值的byte依然存在。比如上例中要加密的明文是:
“Here is some data to encrypt. 這裡是一些要加密的資料。”
轉成明文byte[]後是66個位元組,DES演算法就會補上6個0值的byte,補到72個位元組。這樣加密後再解密回來的密文byte[]解碼後的字串就是這樣的:
"Here is some data to encrypt. 這裡是一些要加密的資料。\0\0\0\0\0\0"
5、 從編碼位元組流轉成字串明文
// 使用前面定義的Encoding,utf-8的編碼把byte[]轉成字串
plainTextString = sEncoding.GetString(finalPlainTextArray);
六、非對稱加密之RSA加密和解密的講解
RSA公鑰加密演算法是1977年由Ron Rivest、Adi Shamirh和LenAdleman在(美國麻省理工學院)開發的。RSA取名來自開發他們三者的名字。RSA是目前最有影響力的公鑰加密演算法,它能夠抵抗到目前為止已知的所有密碼攻擊,已被ISO推薦為公鑰資料加密標準。RSA演算法基於一個十分簡單的數論事實:將兩個大素數相乘十分容易,但那時想要對其乘積進行因式分解卻極其困難,因此可以將乘積公開作為加密金鑰。RSA演算法是第一個能同時用於加密和數字簽名的演算法,也易於理解和操作。
RSA是被研究得最廣泛的公鑰演算法,從提出到現在已近二十年,經歷了各種攻擊的考驗,逐漸為人們接受,普遍認為是目前最優秀的公鑰方案之一。RSA的安全性依賴於大數的因子分解,但並沒有從理論上證明破譯RSA的難度與大數分解難度等價。即RSA的重大缺陷是無法從理論上把握它的保密效能如何,而且密碼學界多數人士傾向於因子分解不是NPC問題。
RSA的缺點主要有:
A)產生金鑰很麻煩,受到素數產生技術的限制,因而難以做到一次一密。
B)分組長度太大,為保證安全性,n 至少也要 600bits以上,使運算代價很高,尤其是速度較慢,較對稱密碼演算法慢幾個數量級;且隨著大數分解技術的發展,這個
長度還在增加,不利於資料格式的標準化。目前,SET(Secure Electronic Transaction)協議中要求CA採用2048bits長的金鑰,其他實體使用1024位元的金鑰。C)RSA金鑰長度隨著保密級別提高,增加很快。下表列出了對同一安全級別所對應的金鑰長度。
保密級別 |
對稱金鑰長度(bit) |
RSA金鑰長度(bit) |
ECC金鑰長度(bit) |
保密年限 |
80 |
80 |
1024 |
160 |
2010 |
112 |
112 |
2048 |
224 |
2030 |
128 |
128 |
3072 |
256 |
2040 |
192 |
192 |
7680 |
384 |
2080 |
256 |
256 |
15360 |
512 |
2120 |
這種演算法1978年就出現了,它是第一個既能用於資料加密也能用於數字簽名的演算法。它易於理解和操作,也很流行。演算法的名字以發明者的名字命名:Ron Rivest, AdiShamir 和Leonard Adleman。早在1973年,英國國家通訊總局的數學家Clifford Cocks就發現了類似的演算法。但是他的發現被列為絕密,直到1998年才公諸於世。
RSA演算法是一種非對稱密碼演算法,所謂非對稱,就是指該演算法需要一對金鑰,使用其中一個加密,則需要用另一個才能解密。
RSA的演算法涉及三個引數,n、e1、e2。
其中,n是兩個大質數p、q的積,n的二進位制表示時所佔用的位數,就是所謂的金鑰長度。
e1和e2是一對相關的值,e1可以任意取,但要求e1與(p-1)*(q-1)互質;再選擇e2,要求(e2*e1)mod((p-1)*(q-1))=1。
(n及e1),(n及e2)就是金鑰對。
RSA加解密的演算法完全相同,設A為明文,B為密文,則:A=B^e1 mod n;B=A^e2 mod n;
e1和e2可以互換使用,即:
A=B^e2 mod n;B=A^e1 mod n;
C#程式碼實現
需引用using System.Security.Cryptography;
/// <summary> /// RSA加密 /// </summary> /// <param name="publickey"></param> /// <param name="content"></param> /// <returns></returns> public static string RSAEncrypt(string publickey, string content) { publickey = @"<RSAKeyValue><Modulus>5m9m14XH3oqLJ8bNGw9e4rGpXpcktv9MSkHSVFVMjHbfv+SJ5v0ubqQxa5YjLN4vc49z7SVju8s0X4gZ6AzZTn06jzWOgyPRV54Q4I0DCYadWW4Ze3e+BOtwgVU1Og3qHKn8vygoj40J6U85Z/PTJu3hN1m75Zr195ju7g9v4Hk=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>"; RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); byte[] cipherbytes; rsa.FromXmlString(publickey); cipherbytes = rsa.Encrypt(Encoding.UTF8.GetBytes(content), false); return Convert.ToBase64String(cipherbytes); } /// <summary> /// RSA解密 /// </summary> /// <param name="privatekey"></param> /// <param name="content"></param> /// <returns></returns> public static string RSADecrypt(string privatekey, string content) { privatekey = @"<RSAKeyValue><Modulus>5m9m14XH3oqLJ8bNGw9e4rGpXpcktv9MSkHSVFVMjHbfv+SJ5v0ubqQxa5YjLN4vc49z7SVju8s0X4gZ6AzZTn06jzWOgyPRV54Q4I0DCYadWW4Ze3e+BOtwgVU1Og3qHKn8vygoj40J6U85Z/PTJu3hN1m75Zr195ju7g9v4Hk=</Modulus><Exponent>AQAB</Exponent><P>/hf2dnK7rNfl3lbqghWcpFdu778hUpIEBixCDL5WiBtpkZdpSw90aERmHJYaW2RGvGRi6zSftLh00KHsPcNUMw==</P><Q>6Cn/jOLrPapDTEp1Fkq+uz++1Do0eeX7HYqi9rY29CqShzCeI7LEYOoSwYuAJ3xA/DuCdQENPSoJ9KFbO4Wsow==</Q><DP>ga1rHIJro8e/yhxjrKYo/nqc5ICQGhrpMNlPkD9n3CjZVPOISkWF7FzUHEzDANeJfkZhcZa21z24aG3rKo5Qnw==</DP><DQ>MNGsCB8rYlMsRZ2ek2pyQwO7h/sZT8y5ilO9wu08Dwnot/7UMiOEQfDWstY3w5XQQHnvC9WFyCfP4h4QBissyw==</DQ><InverseQ>EG02S7SADhH1EVT9DD0Z62Y0uY7gIYvxX/uq+IzKSCwB8M2G7Qv9xgZQaQlLpCaeKbux3Y59hHM+KpamGL19Kg==</InverseQ><D>vmaYHEbPAgOJvaEXQl+t8DQKFT1fudEysTy31LTyXjGu6XiltXXHUuZaa2IPyHgBz0Nd7znwsW/S44iql0Fen1kzKioEL3svANui63O3o5xdDeExVM6zOf1wUUh/oldovPweChyoAdMtUzgvCbJk1sYDJf++Nr0FeNW1RB1XG30=</D></RSAKeyValue>"; RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); byte[] cipherbytes; rsa.FromXmlString(privatekey); cipherbytes = rsa.Decrypt(Convert.FromBase64String(content), false); return Encoding.UTF8.GetString(cipherbytes); }
七、ASP.NET(C#)常用加密類呼叫的講解
1、C#常用加密解密類庫程式碼如下:
/// <summary> /// MD5 加密靜態方法 /// </summary> /// <param name="EncryptString">待加密的密文</param> /// <returns>returns</returns> public static string MD5Encrypt(string EncryptString) { if (string.IsNullOrEmpty(EncryptString)) { throw (new Exception("密文不得為空")); } MD5 m_ClassMD5 = new MD5CryptoServiceProvider(); string m_strEncrypt = ""; try { m_strEncrypt = BitConverter.ToString(m_ClassMD5.ComputeHash(Encoding.Default.GetBytes(EncryptString))).Replace("-", ""); } catch (ArgumentException ex) { throw ex; } catch (CryptographicException ex) { throw ex; } catch (Exception ex) { throw ex; } finally { m_ClassMD5.Clear(); } return m_strEncrypt; } /// <summary> /// DES 加密(資料加密標準,速度較快,適用於加密大量資料的場合) /// </summary> /// <param name="EncryptString">待加密的密文</param> /// <param name="EncryptKey">加密的金鑰</param> /// <returns>returns</returns> public static string DESEncrypt(string EncryptString, string EncryptKey) { if (string.IsNullOrEmpty(EncryptString)) { throw (new Exception("密文不得為空")); } if (string.IsNullOrEmpty(EncryptKey)) { throw (new Exception("金鑰不得為空")); } if (EncryptKey.Length != 8) { throw (new Exception("金鑰必須為8位")); } byte[] m_btIV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF }; string m_strEncrypt = ""; DESCryptoServiceProvider m_DESProvider = new DESCryptoServiceProvider(); try { byte[] m_btEncryptString = Encoding.Default.GetBytes(EncryptString); MemoryStream m_stream = new MemoryStream(); CryptoStream m_cstream = new CryptoStream(m_stream, m_DESProvider.CreateEncryptor(Encoding.Default.GetBytes(EncryptKey), m_btIV), CryptoStreamMode.Write); m_cstream.Write(m_btEncryptString, 0, m_btEncryptString.Length); m_cstream.FlushFinalBlock(); m_strEncrypt = Convert.ToBase64String(m_stream.ToArray()); m_stream.Close(); m_stream.Dispose(); m_cstream.Close(); m_cstream.Dispose(); } catch (IOException ex) { throw ex; } catch (CryptographicException ex) { throw ex; } catch (ArgumentException ex) { throw ex; } catch (Exception ex) { throw ex; } finally { m_DESProvider.Clear(); } return m_strEncrypt; } /// <summary> /// DES 解密(資料加密標準,速度較快,適用於加密大量資料的場合) /// </summary> /// <param name="DecryptString">待解密的密文</param> /// <param name="DecryptKey">解密的金鑰</param> /// <returns>returns</returns> public static string DESDecrypt(string DecryptString, string DecryptKey) { if (string.IsNullOrEmpty(DecryptString)) { throw (new Exception("密文不得為空")); } if (string.IsNullOrEmpty(DecryptKey)) { throw (new Exception("金鑰不得為空")); } if (DecryptKey.Length != 8) { throw (new Exception("金鑰必須為8位")); } byte[] m_btIV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF }; string m_strDecrypt = ""; DESCryptoServiceProvider m_DESProvider = new DESCryptoServiceProvider(); try { byte[] m_btDecryptString = Convert.FromBase64String(DecryptString); MemoryStream m_stream = new MemoryStream(); CryptoStream m_cstream = new CryptoStream(m_stream, m_DESProvider.CreateDecryptor(Encoding.Default.GetBytes(DecryptKey), m_btIV), CryptoStreamMode.Write); m_cstream.Write(m_btDecryptString, 0, m_btDecryptString.Length); m_cstream.FlushFinalBlock(); m_strDecrypt = Encoding.Default.GetString(m_stream.ToArray()); m_stream.Close(); m_stream.Dispose(); m_cstream.Close(); m_cstream.Dispose(); } catch (IOException ex) { throw ex; } catch (CryptographicException ex) { throw ex; } catch (ArgumentException ex) { throw ex; } catch (Exception ex) { throw ex; } finally { m_DESProvider.Clear(); } return m_strDecrypt; } /// <summary> /// RC2 加密(用變長金鑰對大量資料進行加密) /// </summary> /// <param name="EncryptString">待加密密文</param> /// <param name="EncryptKey">加密金鑰</param> /// <returns>returns</returns>相關推薦
加密和解密(1):常用資料加密和解密方法彙總
資料加密技術是網路中最基本的安全技術,主要是通過對網路中傳輸的資訊進行資料加密來保障其安全性,這是一種主動安全防禦策略,用很小的代價即可為資訊提供相當大的安全保護。 一、加密的基本概念 "加密",是一種限制對網路上傳輸資料的訪問權的技術。原始資料(也稱為明文
資料結構:表、棧、和佇列(1)——抽象資料型別
引子:程式設計的基本法則之一是模組化,即每個模組是一個邏輯單位,並能實現某個特定的功能。其優點有三點:一、模組化的程式,在除錯上較為容易。二、模組化程式程式設計,更容易實現多人可以同時工作。三、一個好的模組化程式把某些依賴關係只侷限在一個例程中,這樣使得修改起
繼承和派生(1):繼承概念和繼承方式
派生類的定義: 看一個有趣的例子: #include <iostream> using namespace std; class A { public: void f(int i){cout<<i<<endl;}
1.4 資料庫和常用SQL語句(正文)——MySQL資料庫命令和SQL語句
前面我們已經講述了,登入時,我們使用mysql –u root –p命令進行,此時如果設定了密碼,則需要輸入密碼。 輸入密碼後即進入MySQL的操作介面,此時,命令列窗體左側顯示“mysql>”表示此時可接受mysql命令。 (1)列出全部資料庫命令 我們使用“show databases;”命令列
第10章 網路安全(1)_對稱加密和非對稱加密
1 網路安全概述 1.1 計算機網路面臨的安全威協 (1)截獲:攻擊者從網路上竊聽他人的通訊內容,通常把這類攻擊稱為“截獲”。在被動攻擊中,攻擊者只是觀察和分析某一個協議資料單元(PDU)而不干擾資訊流。 (2)篡改:攻擊者篡改網路上傳遞的報文。這裡包括徹底中斷傳遞的報文,甚至把完
python爬蟲系列(1):使用python3和正則表示式獲取貓眼電影排行榜資料
簡述 這次打算寫一個爬蟲系列,一邊也想好好總結鞏固學習的知識,一邊做總結筆記,方便以後回憶。這次我們使用Python3和正則表示式來爬取一個簡單html頁面資訊,就從貓眼電影的排行榜單開始吧。如果讀到這篇文章的是位大神,期望您能不吝賜教,指正錯誤,如果您是小白,咋們可以一同
考研資料結構與演算法----單鏈表的建立和讀取(1)
先來個簡單的,晚上再把整表刪除神馬的加上,懶得註釋了,貼出來就是給同樣考研的同志們做個參考。 話說現在大學折騰的越來越水,當年我們學資料結構的時候單鏈表就算是五個實驗裡面第二難的了,最難的是一個二叉樹的,最後反正是都沒做出來直接往上抄的。其實現在回頭看過來倒
MySQL數據庫常用命令和概念 (1)
完成 ash 函數 gen 創建表 規則 ren 數值類型 mysql 一、數據庫的創建: 1、創建一個名稱為mydb1的數據庫 create database mydb1; 2、創建一個使用utf8字符集的mydb2數據庫。
【CAN總線】CAN代碼相關問題和註釋(1) ------------4.6更新
配置 註釋 一次 保護 tex 擴展 控制 xca 比較 前言: 在看如何用FPGA實現can_controller ,本來想把代碼上傳上來的,結果沒成功。如果有意向研究的,可以自己去下載 pudn就有。can tb有點問題,我也只是在剛剛研究,如果有意向可以和我交流
struts2學習(13)struts2文件上傳和下載(1)
action alt for ide 上傳文件 fig .org dac str 一、Struts2文件上傳: 二、配置文件的大小以及允許上傳的文件類型: 三、大文件上傳: 如果不配置上傳文件的大小,struts2默認允許上傳文件最大為2M; 2097152Byte;
Echares入門(1)——常用圖組件
log -s enter 顯示 均值 像素 point gin str Option對象
Html(1)——常用標簽
str mil 字號 log 項目 網頁 鏈接 type 接收 Html常用標簽 一.基本標簽 <!DOCTYPE html>:引用官方的DTD文件——對標簽的使用進行了一定的約束 <ht
C#類和結構(1)
mar 安全 類型安全 readline 參數 部分 public 方法的參數 play 1、結構功能特性? 實現代碼? 結構用struct關鍵字定義的,與類類似,但有本質區別。結構實質是一個值類型,它不需要對分配的。 結構的特性: (1)、結構作為參數傳遞時,是值傳遞。
Python基礎(二)之數據類型和運算(1)——數字
spa 發生 double類型 圖片 body poi 存在 discard 交互模式 數據類型初識 數字 2 是一個整數的例子。 長整數 不過是大一些的整數。 3.23和52.3E-4是浮點數的例子。E標記表示10的冪。在這裏,52.3E-4表示52.3 * 1
【JVM虛擬機】(1)---常用JVM配置參數
str spa void 經歷 color borde free TE per 常用JVM配置參數 常用JVM配置參數主要有:Trace跟蹤參數、堆的分配參數、棧的分配參數。 一、Trace跟蹤參數 跟蹤參數用於跟蹤監控JVM,對於開發人員
內置函數(1)判斷子類和是不是對象
IV print color sta ins 對象 instance type 子類 1.判斷是不是對象 原本判斷時 type(參數)is (參數) 現用內置函數: class Foo: pass obj=Foo() print(isinstance(obj,Fo
docker版mysql的使用和配置(1)——docker的基本操作
spa uci 信息 5.5 8.0 ash 隨機 server expec 最近實在是忙成狗,其他的內容等稍微閑一點了一起更新。 這篇主要是講docker版的mysql的使用和配置信息。因為實習公司需要搞一個docker做測試環境用,還需要包括基本的依賴。最重要的是,因為
javaEE學習筆記:maven下載和安裝(1)
本文只作學習筆記,僅代表個人觀點,若有雷同,純屬巧合; 工具:編輯器Eclipse,Tomcat7.0(下載地址:https://tomcat.apache.org/) JDK1.8版本 第一步:官網下載地址: http://maven.apache.org/download.cgi
理解Docker(1):Docker 安裝和基礎用法
來源:https://www.cnblogs.com/sammyliu/p/5875470.html 1. 安裝 1.1 在 Ubuntu 14.04 上安裝 Docker 前提要求: 核心版本必須是3.10或者以上 依次執行下面的步驟: sudo apt-g
Python學習(1)——基礎資料型別
目錄 1、Python的應用 2、Python的優缺點 2.1 優點 2.2缺點 3.使用者輸入 4、格式化輸出 5、資料型別 5.1 bytes 5.2 字串 5.3 列表 5.4 元組 5.5 字典 5.6 集合 6、綜合例項 1、