8.1-加密算法

加密算法

對稱加密

對稱加密.png

??加密過程的每一步都是可逆的。加密和解密用的是同一組密鑰线婚。異或是最簡單的對稱加密算法塞弊。

//XOR 異或運算,要求plain和key的長度相同
func XOR(plain string, key []byte) string {
    bPlain := []byte(plain)
    bCipher := make([]byte, len(key))
    for i, k := range key {
        bCipher[i] = k ^ bPlain[i]
    }
    cipher := string(bCipher)
    return cipher
}

??DES(Data Encryption Standard)數(shù)據(jù)加密標準饰抒,是目前最為流行的加密算法之一诀黍。對原始數(shù)據(jù)(明文)進行分組,每組64位枣宫,最后一組不足64位時按一定規(guī)則填充吃环。每一組上單獨施加DES算法。
DES子密鑰生成
??初始密鑰64位歇拆,實際有效位56位范咨,每隔7位有一個校驗位渠啊。根據(jù)初始密鑰生成16個48位的子密鑰。

DES子密鑰生成.png

DES子密鑰生成2.png

??N取值從1到16贯溅,N和x有固定的映射表。

DES加密過程

DES加密過程1.png

DES加密過程2.png

??L1, R1 = f(L0, R0, K1),依此循環(huán)鄙麦,得到L16和R16镊折。
??S盒替換。輸入48位骂因,輸出32位赃泡。各分為8組,輸入每組6位,輸出每組4位蹦肴。分別在每組上施加S盒替換阴幌,一共8個S盒。

S盒替換.png

DES加密過程

DES加密過程3.png

??分組模式渊抽。CBC(Cipher Block Chaining )密文分組鏈接模式懒闷,將當前明文分組與前一個密文分組進行異或運算栈幸,然后再進行加密。其他分組模式還有ECB, CTR, CFR, OFB玩焰。

func DesEncryptCBC(text string, key []byte) (string, error) {
    src := []byte(text)
    block, err := des.NewCipher(key) //用des創(chuàng)建一個加密器cipher
    if err != nil {
        return "", err
    }
    blockSize := block.BlockSize()           //分組的大小芍锚,blockSize=8
    src = common.ZeroPadding(src, blockSize) //填充

    out := make([]byte, len(src))                   //密文和明文的長度一致
    encrypter := cipher.NewCBCEncrypter(block, key) //CBC分組模式加密
    encrypter.CryptBlocks(out, src)
    return hex.EncodeToString(out), nil
}

func DesDecryptCBC(text string, key []byte) (string, error) {
    src, err := hex.DecodeString(text) //轉成[]byte
    if err != nil {
        return "", err
    }
    block, err := des.NewCipher(key)
    if err != nil {
        return "", err
    }

    out := make([]byte, len(src))                   //密文和明文的長度一致
    encrypter := cipher.NewCBCDecrypter(block, key) //CBC分組模式解密
    encrypter.CryptBlocks(out, src)
    out = common.ZeroUnPadding(out) //反填充
    return string(out), nil
}

??AES(Advanced Encryption Standard)高級加密標準,旨在取代DES默刚。

非對稱加密

  • 使用公鑰加密羡棵,使用私鑰解密。
  • 公鑰和私鑰不同皂冰。
  • 公鑰可以公布給所有人秃流。
  • 私鑰只有自己保存。
  • 相比于對稱加密概说,運算速度非常慢嚣伐。
非對稱加密.png

??對稱加密和非對稱加密結合使用的案例轩端。小明要給小紅傳輸機密文件,他倆先交換各自的公鑰基茵,然后:

  1. 小明生成一個隨機的AES口令拱层,然后用小紅的公鑰通過RSA加密這個口令,并發(fā)給小紅根灯。
  2. 小紅用自己的RSA私鑰解密得到AES口令烙肺。
  3. 雙方使用這個共享的AES口令用AES加密通信。
加密通信.png

??RSA是三個發(fā)明人名字的縮寫:Ron Rivest兆旬,Adi Shamir怎栽,Leonard Adleman。密鑰越長脚祟,越難破解。 目前768位的密鑰還無法破解(至少沒人公開宣布)为黎。因此可以認為1024位的RSA密鑰基本安全行您,2048位的密鑰極其安全娃循。RSA的算法原理主要用到了數(shù)論。
RSA加密過程

  1. 隨機選擇兩個不相等的質(zhì)數(shù)p和q捌斧。p=61, q=53
  2. 計算p和q的乘積n。n=3233
  3. 計算n的歐拉函數(shù)φ(n) = (p-1)(q-1)妇押。 φ(n) =3120
  4. 隨機選擇一個整數(shù)e姓迅,使得1< e < φ(n)敲霍,且e與φ(n) 互質(zhì)队贱。e=17
  5. 計算e對于φ(n)的模反元素d柱嫌,即求解ed+ φ(n)y=1屯换。d=2753, y=-15
  6. 將n和e封裝成公鑰,n和d封裝成私鑰嘉抓。公鑰=(3233晕窑,17),公鑰=(3233杨赤,2753)
// RSA加密
func RsaEncrypt(origData []byte) ([]byte, error) {
    //解密pem格式的公鑰
    block, _ := pem.Decode(publicKey)
    if block == nil {
        return nil, errors.New("public key error")
    }
    // 解析公鑰
    pubInterface, err := x509.ParsePKIXPublicKey(block.Bytes) //目前的數(shù)字證書一般都是基于ITU(國際電信聯(lián)盟)制定的X.509標準
    if err != nil {
        return nil, err
    }
    // 類型斷言
    pub := pubInterface.(*rsa.PublicKey)
    //加密
    return rsa.EncryptPKCS1v15(rand.Reader, pub, origData)
}

// RSA解密
func RsaDecrypt(ciphertext []byte) ([]byte, error) {
    //解密
    block, _ := pem.Decode(privateKey)
    if block == nil {
        return nil, errors.New("private key error!")
    }
    //解析PKCS1格式的私鑰
    priv, err := x509.ParsePKCS1PrivateKey(block.Bytes)
    if err != nil {
        return nil, err
    }
    // 解密
    return rsa.DecryptPKCS1v15(rand.Reader, priv, ciphertext)
}

??ECC(Elliptic Curve Cryptography)橢圓曲線加密算法截汪,相比RSA衙解,ECC可以使用更短的密鑰焰枢,來實現(xiàn)與RSA相當或更高的安全。定義了橢圓曲線上的加法和二倍運算暑椰。橢圓曲線依賴的數(shù)學難題是:k為正整數(shù)拟淮,P是橢圓曲線上的點(稱為基點), k*P=Q , 已知Q和P,很難計算出k角虫。

func genPrivateKey() (*ecies.PrivateKey, error) {
    pubkeyCurve := elliptic.P256() // 初始化橢圓曲線
    // 隨機挑選基點,生成私鑰
    p, err := ecdsa.GenerateKey(pubkeyCurve, rand.Reader) //用golang標準庫生成公私鑰對
    if err != nil {
        return nil, err
    } else {
        return ecies.ImportECDSA(p), nil //轉換成以太坊的公私鑰對
    }
}

//ECCEncrypt 橢圓曲線加密
func ECCEncrypt(plain string, pubKey *ecies.PublicKey) ([]byte, error) {
    src := []byte(plain)
    return ecies.Encrypt(rand.Reader, pubKey, src, nil, nil)
}

//ECCDecrypt 橢圓曲線解密
func ECCDecrypt(cipher []byte, prvKey *ecies.PrivateKey) (string, error) {
    if src, err := prvKey.Decrypt(cipher, nil, nil); err != nil {
        return "", err
    } else {
        return string(src), nil
    }
}

哈希算法

哈希函數(shù)的基本特征

  1. 輸入可以是任意長度委造。
  2. 輸出是固定長度。
  3. 根據(jù)輸入很容易計算出輸出昏兆。
  4. 根據(jù)輸出很難計算出輸入(幾乎不可能)。
  5. 兩個不同的輸入幾乎不可能得到相同的輸出隶债。

??SHA(Secure Hash Algorithm) 安全散列算法跑筝,是一系列密碼散列函數(shù)曲梗,有多個不同安全等級的版本:SHA-1,SHA-224,SHA-256,SHA-384,SHA-512。其作用是防偽裝愧旦,防竄擾定罢,保證信息的合法性和完整性笤虫。
sha-1算法大致過程

  1. 填充。使得數(shù)據(jù)長度對512求余的結果為448耕皮。
  2. 在信息摘要后面附加64bit凌停,表示原始信息摘要的長度。
  3. 初始化h0到h4台诗,每個h都是32位赐俗。
  4. h0到h4歷經(jīng)80輪復雜的變換。
  5. 把h0到h4拼接起來粱快,構成160位叔扼,返回。
func Sha1(data string) string {
    sha1 := sha1.New()
    sha1.Write([]byte(data))
    return hex.EncodeToString(sha1.Sum(nil))
}

??MD5(Message-Digest Algorithm 5)信息-摘要算法5瓜富,算法流程跟SHA-1大體相似。MD5的輸出是128位与柑,比SHA-1短了32位价捧。MD5相對易受密碼分析的攻擊,運算速度比SHA-1快脯倚。

func Md5(data string) string {
    md5 := md5.New()
    md5.Write([]byte(data))
    return hex.EncodeToString(md5.Sum(nil))
}

哈希函數(shù)的應用場景

  • 用戶密碼的存儲椎眯。
  • 文件上傳/下載完整性校驗胳岂。
  • mysql大字段的快速對比。
    數(shù)字簽名
數(shù)字簽名.png

??比特幣中驗證交易記錄的真實性用的就是數(shù)字簽名乳丰。先hash再用私鑰加密的原因是:非對稱加密計算量比較大,先hash可以把原始數(shù)據(jù)轉一條很短的信息,提高計算效率夜郁。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末粘勒,一起剝皮案震驚了整個濱河市庙睡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌统台,老刑警劉巖啡邑,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谤逼,死亡現(xiàn)場離奇詭異贵扰,居然都是意外死亡森缠,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門列肢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宾茂,“玉大人跨晴,你說我怎么就攤上這事《伺瑁” “怎么了焕妙?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長焚鹊。 經(jīng)常有香客問我,道長研叫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任渊啰,我火速辦了婚禮申屹,結果婚禮上,老公的妹妹穿的比我還像新娘迈窟。我一直安慰自己忌栅,他們只是感情好,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布湖员。 她就那樣靜靜地躺著瑞驱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪唤反。 梳的紋絲不亂的頭發(fā)上彤侍,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天,我揣著相機與錄音晒奕,去河邊找鬼名斟。 笑死,一個胖子當著我的面吹牛闷袒,可吹牛的內(nèi)容都是我干的楞卡。 我是一名探鬼主播霜运,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼淘捡,長吁一口氣:“原來是場噩夢啊……” “哼池摧!你這毒婦竟也來了?” 一聲冷哼從身側響起作彤,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤竭讳,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后灿渴,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體胰舆,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡缚窿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了倦零。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡女嘲,死狀恐怖诞帐,靈堂內(nèi)的尸體忽然破棺而出停蕉,到底是詐尸還是另有隱情,我是刑警寧澤慧起,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布蚓挤,位于F島的核電站驻子,受9級特大地震影響估灿,放射性物質(zhì)發(fā)生泄漏崇呵。R本人自食惡果不足惜馅袁,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一汗销、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧叠骑,春花似錦削茁、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至睬隶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間苏潜,已是汗流浹背变勇。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留飞袋,地道東北人链患。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓麻捻,卻偏偏與公主長得像呀袱,于是被迫代替她去往敵國和親郑叠。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容