A. 世界上的密碼
密碼學是研究編制密碼和破譯密碼的技術科學。研究密碼變化的客觀規律,應用於編制密碼以保守通信秘密的,稱為編碼學;應用於破譯密碼以獲取通信情報的,稱為破譯學,總稱密碼學。
密碼是通信雙方按約定的法則進行信息特殊變換的一種重要保密手段。依照這些法則,變明文為密文,稱為加密變換;變密文為明文,稱為脫密變換。密碼在早期僅對文字或數碼進行加、脫密變換,隨著通信技術的發展,對語音、圖像、數據等都可實施加、脫密變換。
密碼學是在編碼與破譯的斗爭實踐中逐步發展起來的,並隨著先進科學技術的應用,已成為一門綜合性的尖端技術科學。它與語言學、數學、電子學、聲學、資訊理論、計算機科學等有著廣泛而密切的聯系。它的現實研究成果,特別是各國政府現用的密碼編制及破譯手段都具有高度的機密性。
進行明密變換的法則,稱為密碼的體制。指示這種變換的參數,稱為密鑰。它們是密碼編制的重要組成部分。密碼體制的基本類型可以分為四種:錯亂——按照規定的圖形和線路,改變明文字母或數碼等的位置成為密文;代替——用一個或多個代替表將明文字母或數碼等代替為密文;密本——用預先編定的字母或數字密碼組,代替一定的片語單詞等變明文為密文;加亂——用有限元素組成的一串序列作為亂數,按規定的演算法,同明文序列相結合變成密文。以上四種密碼體制,既可單獨使用,也可混合使用 ,以編制出各種復雜度很高的實用密碼。
20世紀70年代以來,一些學者提出了公開密鑰體制,即運用單向函數的數學原理,以實現加、脫密密鑰的分離。加密密鑰是公開的,脫密密鑰是保密的。這種新的密碼體制,引起了密碼學界的廣泛注意和探討。
利用文字和密碼的規律,在一定條件下,採取各種技術手段,通過對截取密文的分析,以求得明文,還原密碼編制,即破譯密碼。破譯不同強度的密碼,對條件的要求也不相同,甚至很不相同。
中國古代秘密通信的手段,已有一些近於密碼的雛形。宋曾公亮、丁度等編撰《武經總要》「字驗」記載,北宋前期,在作戰中曾用一首五言律詩的40個漢字,分別代表40種情況或要求,這種方式已具有了密本體制的特點。
1871年,由上海大北水線電報公司選用6899個漢字,代以四碼數字,成為中國最初的商用明碼本,同時也設計了由明碼本改編為密本及進行加亂的方法。在此基礎上,逐步發展為各種比較復雜的密碼。
在歐洲,公元前405年,斯巴達的將領來山得使用了原始的錯亂密碼;公元前一世紀,古羅馬皇帝凱撒曾使用有序的單表代替密碼;之後逐步發展為密本、多表代替及加亂等各種密碼體制。
二十世紀初,產生了最初的可以實用的機械式和電動式密碼機,同時出現了商業密碼機公司和市場。60年代後,電子密碼機得到較快的發展和廣泛的應用,使密碼的發展進入了一個新的階段。
密碼破譯是隨著密碼的使用而逐步產生和發展的。1412年,波斯人卡勒卡尚迪所編的網路全書中載有破譯簡單代替密碼的方法。到16世紀末期,歐洲一些國家設有專職的破譯人員,以破譯截獲的密信。密碼破譯技術有了相當的發展。1863年普魯士人卡西斯基所著《密碼和破譯技術》,以及1883年法國人克爾克霍夫所著《軍事密碼學》等著作,都對密碼學的理論和方法做過一些論述和探討。1949年美國人香農發表了《秘密體制的通信理論》一文,應用資訊理論的原理分析了密碼學中的一些基本問題。
自19世紀以來,由於電報特別是無線電報的廣泛使用,為密碼通信和第三者的截收都提供了極為有利的條件。通信保密和偵收破譯形成了一條斗爭十分激烈的隱蔽戰線。
1917年,英國破譯了德國外長齊默爾曼的電報,促成了美國對德宣戰。1942年,美國從破譯日本海軍密報中,獲悉日軍對中途島地區的作戰意圖和兵力部署,從而能以劣勢兵力擊破日本海軍的主力,扭轉了太平洋地區的戰局。在保衛英倫三島和其他許多著名的歷史事件中,密碼破譯的成功都起到了極其重要的作用,這些事例也從反面說明了密碼保密的重要地位和意義。
當今世界各主要國家的政府都十分重視密碼工作,有的設立龐大機構,撥出巨額經費,集中數以萬計的專家和科技人員,投入大量高速的電子計算機和其他先進設備進行工作。與此同時,各民間企業和學術界也對密碼日益重視,不少數學家、計算機學家和其他有關學科的專家也投身於密碼學的研究行列,更加速了密碼學的發展。
現在密碼已經成為單獨的學科,從傳統意義上來說,密碼學是研究如何把信息轉換成一種隱蔽的方式並阻止其他人得到它。
密碼學是一門跨學科科目,從很多領域衍生而來:它可以被看做是信息理論,卻使用了大量的數學領域的工具,眾所周知的如數論和有限數學。
原始的信息,也就是需要被密碼保護的信息,被稱為明文。加密是把原始信息轉換成不可讀形式,也就是密碼的過程。解密是加密的逆過程,從加密過的信息中得到原始信息。cipher是加密和解密時使用的演算法。
最早的隱寫術只需紙筆,現在稱為經典密碼學。其兩大類別為置換加密法,將字母的順序重新排列;替換加密法,將一組字母換成其他字母或符號。經典加密法的資訊易受統計的攻破,資料越多,破解就更容易,使用分析頻率就是好辦法。經典密碼學現在仍未消失,經常出現在智力游戲之中。在二十世紀早期,包括轉輪機在內的一些機械設備被發明出來用於加密,其中最著名的是用於第二次世界大戰的密碼機Enigma。這些機器產生的密碼相當大地增加了密碼分析的難度。比如針對Enigma各種各樣的攻擊,在付出了相當大的努力後才得以成功。
傳統密碼學
Autokey密碼
置換密碼
二字母組代替密碼 (by Charles Wheatstone)
多字母替換密碼
希爾密碼
維吉尼亞密碼
替換密碼
凱撒密碼
ROT13
仿射密碼
Atbash密碼
換位密碼
Scytale
Grille密碼
VIC密碼 (一種復雜的手工密碼,在五十年代早期被至少一名蘇聯間諜使用過,在當時是十分安全的)
對傳統密碼學的攻擊
頻率分析
重合指數
現代演算法,方法評估與選擇工程
標准機構
the Federal Information Processing Standards Publication program (run by NIST to proce standards in many areas to guide operations of the US Federal government; many FIPS Pubs are cryptography related, ongoing)
the ANSI standardization process (proces many standards in many areas; some are cryptography related, ongoing)
ISO standardization process (proces many standards in many areas; some are cryptography related, ongoing)
IEEE standardization process (proces many standards in many areas; some are cryptography related, ongoing)
IETF standardization process (proces many standards (called RFCs) in many areas; some are cryptography related, ongoing)
See Cryptography standards
加密組織
NSA internal evaluation/selections (surely extensive, nothing is publicly known of the process or its results for internal use; NSA is charged with assisting NIST in its cryptographic responsibilities)
GCHQ internal evaluation/selections (surely extensive, nothing is publicly known of the process or its results for GCHQ use; a division of GCHQ is charged with developing and recommending cryptographic standards for the UK government)
DSD Australian SIGINT agency - part of ECHELON
Communications Security Establishment (CSE) — Canadian intelligence agency.
公開的努力成果
the DES selection (NBS selection process, ended 1976)
the RIPE division of the RACE project (sponsored by the European Union, ended mid-'80s)
the AES competition (a 'break-off' sponsored by NIST; ended 2001)
the NESSIE Project (evaluation/selection program sponsored by the European Union; ended 2002)
the CRYPTREC program (Japanese government sponsored evaluation/recommendation project; draft recommendations published 2003)
the Internet Engineering Task Force (technical body responsible for Internet standards -- the Request for Comment series: ongoing)
the CrypTool project (eLearning programme in English and German; freeware; exhaustive ecational tool about cryptography and cryptanalysis)
加密散列函數 (消息摘要演算法,MD演算法)
加密散列函數
消息認證碼
Keyed-hash message authentication code
EMAC (NESSIE selection MAC)
HMAC (NESSIE selection MAC; ISO/IEC 9797-1, FIPS and IETF RFC)
TTMAC 也稱 Two-Track-MAC (NESSIE selection MAC; K.U.Leuven (Belgium) & debis AG (Germany))
UMAC (NESSIE selection MAC; Intel, UNevada Reno, IBM, Technion, & UCal Davis)
MD5 (系列消息摘要演算法之一,由MIT的Ron Rivest教授提出; 128位摘要)
SHA-1 (NSA開發的160位摘要,FIPS標准之一;第一個發行發行版本被發現有缺陷而被該版本代替; NIST/NSA 已經發布了幾個具有更長'摘要'長度的變種; CRYPTREC推薦 (limited))
SHA-256 (NESSIE 系列消息摘要演算法, FIPS標准之一180-2,摘要長度256位 CRYPTREC recommendation)
SHA-384 (NESSIE 列消息摘要演算法, FIPS標准之一180-2,摘要長度384位; CRYPTREC recommendation)
SHA-512 (NESSIE 列消息摘要演算法, FIPS標准之一180-2,摘要長度512位; CRYPTREC recommendation)
RIPEMD-160 (在歐洲為 RIPE 項目開發, 160位摘要;CRYPTREC 推薦 (limited))
Tiger (by Ross Anderson et al)
Snefru
Whirlpool (NESSIE selection hash function, Scopus Tecnologia S.A. (Brazil) & K.U.Leuven (Belgium))
公/私鑰加密演算法(也稱 非對稱性密鑰演算法)
ACE-KEM (NESSIE selection asymmetric encryption scheme; IBM Zurich Research)
ACE Encrypt
Chor-Rivest
Diffie-Hellman (key agreement; CRYPTREC 推薦)
El Gamal (離散對數)
ECC(橢圓曲線密碼演算法) (離散對數變種)
PSEC-KEM (NESSIE selection asymmetric encryption scheme; NTT (Japan); CRYPTREC recommendation only in DEM construction w/SEC1 parameters) )
ECIES (Elliptic Curve Integrated Encryption System; Certicom Corp)
ECIES-KEM
ECDH (橢圓曲線Diffie-Hellman 密鑰協議; CRYPTREC推薦)
EPOC
Merkle-Hellman (knapsack scheme)
McEliece
NTRUEncrypt
RSA (因數分解)
RSA-KEM (NESSIE selection asymmetric encryption scheme; ISO/IEC 18033-2 draft)
RSA-OAEP (CRYPTREC 推薦)
Rabin cryptosystem (因數分解)
Rabin-SAEP
HIME(R)
XTR
公/私鑰簽名演算法
DSA(zh:數字簽名;zh-tw:數位簽章演算法) (來自NSA,zh:數字簽名;zh-tw:數位簽章標准(DSS)的一部分; CRYPTREC 推薦)
Elliptic Curve DSA (NESSIE selection digital signature scheme; Certicom Corp); CRYPTREC recommendation as ANSI X9.62, SEC1)
Schnorr signatures
RSA簽名
RSA-PSS (NESSIE selection digital signature scheme; RSA Laboratories); CRYPTREC recommendation)
RSASSA-PKCS1 v1.5 (CRYPTREC recommendation)
Nyberg-Rueppel signatures
MQV protocol
Gennaro-Halevi-Rabin signature scheme
Cramer-Shoup signature scheme
One-time signatures
Lamport signature scheme
Bos-Chaum signature scheme
Undeniable signatures
Chaum-van Antwerpen signature scheme
Fail-stop signatures
Ong-Schnorr-Shamir signature scheme
Birational permutation scheme
ESIGN
ESIGN-D
ESIGN-R
Direct anonymous attestation
NTRUSign用於移動設備的公鑰加密演算法, 密鑰比較短小但也能達到高密鑰ECC的加密效果
SFLASH (NESSIE selection digital signature scheme (esp for smartcard applications and similar); Schlumberger (France))
Quartz
密碼鑒定
Key authentication
Public Key Infrastructure (PKI)
Identity-Based Cryptograph (IBC)
X.509
Public key certificate
Certificate authority
Certificate revocation list
ID-based cryptography
Certificate-based encryption
Secure key issuing cryptography
Certificateless cryptography
匿名認證系統
GPS (NESSIE selection anonymous identification scheme; Ecole Normale Supérieure, France Télécom, & La Poste)
秘密鑰演算法 (也稱 對稱性密鑰演算法)
流密碼
A5/1, A5/2 (GSM行動電話標准中指定的密碼標准)
BMGL
Chameleon
FISH (by Siemens AG)
二戰'Fish'密碼
Geheimfernschreiber (二戰時期Siemens AG的機械式一次一密密碼, 被布萊奇利(Bletchley)庄園稱為STURGEON)
Schlusselzusatz (二戰時期 Lorenz的機械式一次一密密碼, 被布萊奇利(Bletchley)庄園稱為[[tunny)
HELIX
ISAAC (作為偽隨機數發生器使用)
Leviathan (cipher)
LILI-128
MUG1 (CRYPTREC 推薦使用)
MULTI-S01 (CRYPTREC 推薦使用)
一次一密 (Vernam and Mauborgne, patented mid-'20s; an extreme stream cypher)
Panama
Pike (improvement on FISH by Ross Anderson)
RC4 (ARCFOUR) (one of a series by Prof Ron Rivest of MIT; CRYPTREC 推薦使用 (limited to 128-bit key))
CipherSaber (RC4 variant with 10 byte random IV, 易於實現)
SEAL
SNOW
SOBER
SOBER-t16
SOBER-t32
WAKE
分組密碼
分組密碼操作模式
乘積密碼
Feistel cipher (由Horst Feistel提出的分組密碼設計模式)
Advanced Encryption Standard (分組長度為128位; NIST selection for the AES, FIPS 197, 2001 -- by Joan Daemen and Vincent Rijmen; NESSIE selection; CRYPTREC 推薦使用)
Anubis (128-bit block)
BEAR (由流密碼和Hash函數構造的分組密碼, by Ross Anderson)
Blowfish (分組長度為128位; by Bruce Schneier, et al)
Camellia (分組長度為128位; NESSIE selection (NTT & Mitsubishi Electric); CRYPTREC 推薦使用)
CAST-128 (CAST5) (64 bit block; one of a series of algorithms by Carlisle Adams and Stafford Tavares, who are insistent (indeed, adamant) that the name is not e to their initials)
CAST-256 (CAST6) (128位分組長度; CAST-128的後繼者,AES的競爭者之一)
CIPHERUNICORN-A (分組長度為128位; CRYPTREC 推薦使用)
CIPHERUNICORN-E (64 bit block; CRYPTREC 推薦使用 (limited))
CMEA — 在美國行動電話中使用的密碼,被發現有弱點.
CS-Cipher (64位分組長度)
DESzh:數字;zh-tw:數位加密標准(64位分組長度; FIPS 46-3, 1976)
DEAL — 由DES演變來的一種AES候選演算法
DES-X 一種DES變種,增加了密鑰長度.
FEAL
GDES —一個DES派生,被設計用來提高加密速度.
Grand Cru (128位分組長度)
Hierocrypt-3 (128位分組長度; CRYPTREC 推薦使用))
Hierocrypt-L1 (64位分組長度; CRYPTREC 推薦使用 (limited))
International Data Encryption Algorithm (IDEA) (64位分組長度-- 蘇黎世ETH的James Massey & X Lai)
Iraqi Block Cipher (IBC)
KASUMI (64位分組長度; 基於MISTY1, 被用於下一代W-CDMA cellular phone 保密)
KHAZAD (64-bit block designed by Barretto and Rijmen)
Khufu and Khafre (64位分組密碼)
LION (由流密碼和Hash函數構造的分組密碼, by Ross Anderson)
LOKI89/91 (64位分組密碼)
LOKI97 (128位分組長度的密碼, AES候選者)
Lucifer (by Tuchman et al of IBM, early 1970s; modified by NSA/NBS and released as DES)
MAGENTA (AES 候選者)
Mars (AES finalist, by Don Coppersmith et al)
MISTY1 (NESSIE selection 64-bit block; Mitsubishi Electric (Japan); CRYPTREC 推薦使用 (limited))
MISTY2 (分組長度為128位: Mitsubishi Electric (Japan))
Nimbus (64位分組)
Noekeon (分組長度為128位)
NUSH (可變分組長度(64 - 256位))
Q (分組長度為128位)
RC2 64位分組,密鑰長度可變.
RC6 (可變分組長度; AES finalist, by Ron Rivest et al)
RC5 (by Ron Rivest)
SAFER (可變分組長度)
SC2000 (分組長度為128位; CRYPTREC 推薦使用)
Serpent (分組長度為128位; AES finalist by Ross Anderson, Eli Biham, Lars Knudsen)
SHACAL-1 (256-bit block)
SHACAL-2 (256-bit block cypher; NESSIE selection Gemplus (France))
Shark (grandfather of Rijndael/AES, by Daemen and Rijmen)
Square (father of Rijndael/AES, by Daemen and Rijmen)
3-Way (96 bit block by Joan Daemen)
TEA(小型加密演算法)(by David Wheeler & Roger Needham)
Triple DES (by Walter Tuchman, leader of the Lucifer design team -- not all triple uses of DES increase security, Tuchman's does; CRYPTREC 推薦使用 (limited), only when used as in FIPS Pub 46-3)
Twofish (分組長度為128位; AES finalist by Bruce Schneier, et al)
XTEA (by David Wheeler & Roger Needham)
多表代替密碼機密碼
Enigma (二戰德國轉輪密碼機--有很多變種,多數變種有很大的用戶網路)
紫密(Purple) (二戰日本外交最高等級密碼機;日本海軍設計)
SIGABA (二戰美國密碼機,由William Friedman, Frank Rowlett, 等人設計)
TypeX (二戰英國密碼機)
Hybrid code/cypher combinations
JN-25 (二戰日本海軍的高級密碼; 有很多變種)
Naval Cypher 3 (30年代和二戰時期英國皇家海軍的高級密碼)
可視密碼
有密級的 密碼 (美國)
EKMS NSA的電子密鑰管理系統
FNBDT NSA的加密窄帶話音標准
Fortezza encryption based on portable crypto token in PC Card format
KW-26 ROMULUS 電傳加密機(1960s - 1980s)
KY-57 VINSON 戰術電台語音加密
SINCGARS 密碼控制跳頻的戰術電台
STE 加密電話
STU-III 較老的加密電話
TEMPEST prevents compromising emanations
Type 1 procts
破譯密碼
被動攻擊
選擇明文攻擊
選擇密文攻擊
自適應選擇密文攻擊
暴力攻擊
密鑰長度
唯一解距離
密碼分析學
中間相會攻擊
差分密碼分析
線性密碼分析
Slide attack cryptanalysis
Algebraic cryptanalysis
XSL attack
Mod n cryptanalysis
弱密鑰和基於口令的密碼
暴力攻擊
字典攻擊
相關密鑰攻擊
Key derivation function
弱密鑰
口令
Password-authenticated key agreement
Passphrase
Salt
密鑰傳輸/交換
BAN Logic
Needham-Schroeder
Otway-Rees
Wide Mouth Frog
Diffie-Hellman
中間人攻擊
偽的和真的隨機數發生器
PRNG
CSPRNG
硬體隨機數發生器
Blum Blum Shub
Yarrow (by Schneier, et al)
Fortuna (by Schneier, et al)
ISAAC
基於SHA-1的偽隨機數發生器, in ANSI X9.42-2001 Annex C.1 (CRYPTREC example)
PRNG based on SHA-1 for general purposes in FIPS Pub 186-2 (inc change notice 1) Appendix 3.1 (CRYPTREC example)
PRNG based on SHA-1 for general purposes in FIPS Pub 186-2 (inc change notice 1) revised Appendix 3.1 (CRYPTREC example)
匿名通訊
Dining cryptographers protocol (by David Chaum)
匿名投遞
pseudonymity
匿名網路銀行業務
Onion Routing
法律問題
Cryptography as free speech
Bernstein v. United States
DeCSS
Phil Zimmermann
Export of cryptography
Key escrow and Clipper Chip
Digital Millennium Copyright Act
zh:數字版權管理;zh-tw:數位版權管理 (DRM)
Cryptography patents
RSA (now public domain}
David Chaum and digital cash
Cryptography and Law Enforcement
Wiretaps
Espionage
不同國家的密碼相關法律
Official Secrets Act (United Kingdom)
Regulation of Investigatory Powers Act 2000 (United Kingdom)
術語
加密金鑰
加密
密文
明文
加密法
Tabula recta
書籍和出版物
密碼學相關書籍
《密碼傳奇》,趙燕楓著,北京:科學出版社,2008年4月
密碼學領域重要出版物
密碼學家
參見List of cryptographers
密碼技術應用
Commitment schemes
Secure multiparty computations
電子投票
認證
數位簽名
Cryptographic engineering
Crypto systems
雜項
Echelon
Espionage
IACR
Ultra
Security engineering
SIGINT
Steganography
Cryptographers
安全套接字層(SSL)
量子密碼
Crypto-anarchism
Cypherpunk
Key escrow
零知識證明
Random oracle model
盲簽名
Blinding (cryptography)
數字時間戳
秘密共享
可信操作系統
Oracle (cryptography)
免費/開源的密碼系統(特指演算法+協議+體制設計)
PGP (a name for any of several related crypto systems, some of which, beginning with the acquisition of the name by Network Associates, have not been Free Software in the GNU sense)
FileCrypt (an open source/commercial command line version of PGP from Veridis of Denmark, see PGP)
GPG (an open source implementation of the OpenPGP IETF standard crypto system)
SSH (Secure SHell implementing cryptographically protected variants of several common Unix utilities, First developed as open source in Finland by Tatu Ylonen. There is now OpenSSH, an open source implementation supporting both SSH v1 and SSH v2 protocols. There are also commercial implementations.
IPsec (網際網路協議安全IETF標准,IPv6 IETF 標準的必須的組成部分)
Free S/WAN (IPsec的一種開源實現
B. bm是什麼意思呢
1、BM,韓國男女混聲團體KARD成員。在2017年7月19日以首張迷你專輯《HOLA HOLA》正式出道。
2、BM指絕對標高,也就是說與理論的黃海平面基準的高度。BM即Bench Mark(水準點)。
3、BM效應是指賬面市值比效應,指BM值較高的公司平均月收益率高於BM值較低的公司。
4、BM:在計算機科學里,Boyer-Moore字元串搜索演算法是一種非常高效的字元串搜索演算法。它由Bob Boyer和J Strother Moore設計於1977年。此演算法僅對搜索目標字元串(關鍵字)進行預處理,而非被搜索的字元串。
5、BM區是天文學專有名詞。來自中國天文學名詞審定委員會審定發布的天文學專有名詞中文譯名,詞條譯名和中英文解釋數據版權由天文學名詞委所有。
6、BM是七八十年代的一個演唱組合,代表作品為《Daddy Cool》。
C. BM是啥意思
1、BM(BM匹配演算法):BM演算法被認為是亞線性串匹配演算法,它在最壞情況下找到模式所有出現的時間復雜度為O(mn),在最好情況下執行匹配找到模式所有出現的時間復雜度為O(n/m)。
2、BM(Black Matrix)是指在玻璃、塑料、金屬或樹脂等材料上進行的電子印刷。我們現有的智能手機屏幕上周邊的有色部分就是BM的一種。
3、BM(絕對標高)BM指絕對標高,也就是說與理論的黃海平面基準的高度。BM即Bench Mark(水準點)。
4、BM(魔獸爭霸獸族英雄):魔獸爭霸人物獸族英雄劍聖簡稱。劍聖(BM)一個物理輸出英雄,主要的操作技巧是前期合理運用疾風步去別人家裡騷擾,主偷敵人英雄,可以造成敵方前期相當大的牽制。
5、BM(前西德的波尼M(BoneyM)演唱組)前西德的波尼M (Boney M)演唱組是七八十年代十分受人矚目的一個演唱組,樂隊成員來自四面八方,有的來自西印度群島,有的來自牙買加。製作人是弗朗可·菲林(Frank Fariam)。
D. 編寫函數,該函數能在一個字元串中查找某個子串,並返回該子串首字出現的下標位置。
/*
Sunday-字元串匹配演算法--一種優於KMP的演算法
思想類似於BM演算法,只不過是從左向右匹配
遇到不匹配的看大串中匹配范圍之外的右側第一個字元在小串中的最右位置
另外:採用BM/KMP的預處理的做法,事先計算好移動步長,等到遇到不匹配的值直接使用
*/
#include<iostream>
#include<cstdlib>
#include<stdio.h>
#include<time.h>
#include<string.h>
#include<windows.h>
usingnamespacestd;
//一個字元8位最大256種
#defineMAX_CHAR_SIZE256/*設定每個字元最右移動步長,保存每個字元的移動步長
如果大串中匹配字元的右側一個字元沒在子串中,大串移動步長=整個串的距離+1
如果大串中匹配范圍內的右側一個字元在子串中,大串移動距離=子串長度-這個字元在子串中的位置
*/
int*setCharStep(char*subStr)
{
int*charStep=newint[MAX_CHAR_SIZE];
intsubStrLen=strlen(subStr);
for(inti=0;i<MAX_CHAR_SIZE;i++)
charStep[i]=subStrLen+1;
//從左向右掃描一遍保存子串中每個字元所需移動步長
for(inti=0;i<subStrLen;i++)
{
charStep[(unsignedchar)subStr[i]]=subStrLen-i;
}
returncharStep;
}
/*
演算法核心思想,從左向右匹配,遇到不匹配的看大串中匹配范圍之外的右側第一個字元在小串中的最右位置
根據事先計算好的移動步長移動大串指針,直到匹配
*/
intsundaySearch(char*mainStr,char*subStr,int*charStep)
{
intmainStrLen=strlen(mainStr);
intsubStrLen=strlen(subStr);
intmain_i=0;
intsub_j=0;
while(main_i<mainStrLen)
{
//保存大串每次開始匹配的起始位置,便於移動指針
inttem=main_i;
while(sub_j<subStrLen)
{
if(mainStr[main_i]==subStr[sub_j])
{
main_i++;
sub_j++;
continue;
}
else{
//如果匹配范圍外已經找不到右側第一個字元,則匹配失敗
if(tem+subStrLen>mainStrLen)
return-1;
//否則移動步長重新匹配
charfirstRightChar=mainStr[tem+subStrLen];
main_i=tem+charStep[(unsignedchar)firstRightChar];
sub_j=0;
break;//退出本次失敗匹配重新一輪匹配
}
}
if(sub_j==subStrLen)
returnmain_i-subStrLen;
}
return-1;
}
intmain()
{
unsigneStartTime=GetTickCount();
unsigneEndTime;
//隨機生成300位的二進制
inti,j,t,k;
charbins[1][300];//二維數組來存放
srand((int)time(0));//種子,防止隨機數據不變
for(i=0;i<1;i++){
for(j=0;j<300;j++){
bins[i][j]='0'+rand()%2;//放入隨機數
}
bins[i][j]=0;//字元串數組,所以最後一位'