1. 程式人生 > >DES、3DES 加密演算法的呼叫

DES、3DES 加密演算法的呼叫

DES加密常用的概念

  • 加密模式

    • ECB模式 全稱Electronic Codebook模式,譯為電子密碼本模式
    • CBC模式 全稱Cipher Block Chaining模式,譯為密文分組連結模式
    • CFB模式 全稱Cipher FeedBack模式,譯為密文反饋模式
    • OFB模式 全稱Output Feedback模式,譯為輸出反饋模式。
    • CTR模式 全稱Counter模式,譯為計數器模式。
  • 初始向量

    當加密第一個明文分組時,由於不存在 “前一個密文分組”,因此需要事先準備一個長度為一個分組的位元序列來代替 “前一個密文分組”,這個位元序列稱為初始化向量(InitializationVector),通常縮寫為 IV。

  • 填充方式

    當明文長度不為分組長度的整數倍時,需要在最後一個分組中填充一些資料使其湊滿一個分組長度。

    • NoPadding

      API或演算法本身不對資料進行處理,加密資料由加密雙方約定填補演算法。例如若對字串資料進行加解密,可以補充\0或者空格,然後trim

    • PKCS5Padding

      加密前:資料位元組長度對8取餘,餘數為m,若m>0,則補足8-m個位元組,位元組數值為8-m,即差幾個位元組就補幾個位元組,位元組數值即為補充的位元組數,若為0則補充8個位元組的8

      解密後:取最後一個位元組,值為m,則從資料尾部刪除m個位元組,剩餘資料即為加密前的原文。

      加密字串為為AAA,則補位為AAA55555;加密字串為BBBBBB,則補位為BBBBBB22;加密字串為CCCCCCCC,則補位為CCCCCCCC88888888。

    • PKCS7Padding

      PKCS7Padding 的填充方式和PKCS5Padding 填充方式一樣。只是加密塊的位元組數不同。PKCS5Padding明確定義了加密塊是8位元組,PKCS7Padding加密快可以是1-255之間。

實現 DES 加密和解密

採用3DES、CBC模式、pkcs5padding,初始向量用key充當;另外,對於zero padding,還得約定好,對於資料長度剛好是block size的整數倍時,是否需要額外填充。

crypto/des包

Go中crypto/des包實現了 Data Encryption Standard (DES) and the Triple Data Encryption Algorithm (TDEA)。

檢視該包文件,發現相當簡單:定義了DES塊大小(8bytes),定義了一個KeySizeError。另外定義了兩個我們需要特別關注的函式,即

    func NewCipher(key []byte) (cipher.Block, error)

    func NewTripleDESCipher(key []byte) (cipher.Block, error)

他們都是用來獲得一個cipher.Block。從名字可以很容易知道,DES使用NewCipher,3DES使用NewTripleDESCipher。引數都是金鑰(key)

加密

使用DES加密 (des.NewCipher) ,加密模式為CBC (cipher.NewCBCEncrypter(block, key)),填充方式 PKCS5Padding

func DesEncrypt(origData, key []byte) ([]byte, error) {

    block, err := des.NewCipher(key)
    if err != nil {
        return nil, err
    }
    origData = PKCS5Padding(origData, block.BlockSize())
    blockMode := cipher.NewCBCEncrypter(block, key)
    crypted := make([]byte, len(origData))
    blockMode.CryptBlocks(crypted, origData)
    return crypted, nil
}

解密

func DesDecrypt(crypted, key []byte) ([]byte, error) {
    block, err := des.NewCipher(key)
    if err != nil {
        return nil, err
    }
    blockMode := cipher.NewCBCDecrypter(block, key)
    origData := make([]byte, len(crypted))
    blockMode.CryptBlocks(origData, crypted)
    origData = PKCS5UnPadding(origData)
    return origData, nil
}

des加密的詳細程式碼

package main

import (
    "bytes"
    "crypto/cipher"
    "crypto/des"
    "encoding/base64"
    "fmt"
)

func main() {
    key := []byte("12345678")
    result, err := DesEncrypt([]byte("hello world"), key)
    if err != nil {
        panic(err)
    }
    fmt.Println(base64.StdEncoding.EncodeToString(result))


    origData, err := DesDecrypt(result, key)
    if err != nil {
        panic(err)
    }
    fmt.Println(string(origData))
}

func DesEncrypt(origData, key []byte) ([]byte, error) {
    block, err := des.NewCipher(key)
    if err != nil {
        return nil, err
    }
    origData = PKCS5Padding(origData, block.BlockSize())
    blockMode := cipher.NewCBCEncrypter(block, key)
    crypted := make([]byte, len(origData))
    blockMode.CryptBlocks(crypted, origData)
    return crypted, nil
}

func DesDecrypt(crypted, key []byte) ([]byte, error) {
    block, err := des.NewCipher(key)
    if err != nil {
        return nil, err
    }
    blockMode := cipher.NewCBCDecrypter(block, key)
    origData := make([]byte, len(crypted))
    blockMode.CryptBlocks(origData, crypted)
    origData = PKCS5UnPadding(origData)
    return origData, nil
}

func PKCS5Padding(ciphertext []byte, blockSize int) []byte {
    padding := blockSize - len(ciphertext)%blockSize
    padtext := bytes.Repeat([]byte{byte(padding)}, padding)
    return append(ciphertext, padtext...)
}

func PKCS5UnPadding(origData []byte) []byte {
    length := len(origData)
    // 去掉最後一個位元組 unpadding 次
    unpadding := int(origData[length-1])
    return origData[:(length - unpadding)]
}

3DES 加密及解密

加密

對比DES,發現只是換了NewTripleDESCipher。不過,需要注意的是,金鑰長度必須24byte,否則直接返回錯誤。

func TripleDesEncrypt(origData, key []byte) ([]byte, error) {
    block, err := des.NewTripleDESCipher(key)
    if err != nil {
        return nil, err
    }
    origData = PKCS5Padding(origData, block.BlockSize())
    blockMode := cipher.NewCBCEncrypter(block, key[:8])
    crypted := make([]byte, len(origData))
    blockMode.CryptBlocks(crypted, origData)
    return crypted, nil
}

主函式

func main() {
    // 3DES加解密
    key := []byte("123456789012345678901234")
    result, err := TripleDesEncrypt([]byte("hello world"), key)
    if err != nil {
        panic(err)
    }
    fmt.Println(base64.StdEncoding.EncodeToString(result))
    origData, err := TripleDesDecrypt(result, key)
    if err != nil {
        panic(err)
    }
    fmt.Println(string(origData))
}

如果我們把主函式中 key 改為25位的 1234567890123456789012345 執行 go run 3des.go,提示出現如下錯誤:

go run 3des.go
panic: crypto/des: invalid key size 25

goroutine 1 [running]:

詳細程式碼

package main

import (
    "bytes"
    "crypto/cipher"
    "crypto/des"
    "encoding/base64"
    "fmt"
)

func main() {
    // 3DES加解密
    key := []byte("123456789012345678901234")
    result, err := TripleDesEncrypt([]byte("hello world"), key)
    if err != nil {
        panic(err)
    }
    fmt.Println(base64.StdEncoding.EncodeToString(result))
    origData, err := TripleDesDecrypt(result, key)
    if err != nil {
        panic(err)
    }
    fmt.Println(string(origData))
}


// 3DES加密
func TripleDesEncrypt(origData, key []byte) ([]byte, error) {
    block, err := des.NewTripleDESCipher(key)
    if err != nil {
        return nil, err
    }
    origData = PKCS5Padding(origData, block.BlockSize())
    blockMode := cipher.NewCBCEncrypter(block, key[:8])
    crypted := make([]byte, len(origData))
    blockMode.CryptBlocks(crypted, origData)
    return crypted, nil
}

// 3DES解密
func TripleDesDecrypt(crypted, key []byte) ([]byte, error) {
    block, err := des.NewTripleDESCipher(key)
    if err != nil {
        return nil, err
    }
    blockMode := cipher.NewCBCDecrypter(block, key[:8])
    origData := make([]byte, len(crypted))
    blockMode.CryptBlocks(origData, crypted)
    origData = PKCS5UnPadding(origData)
    return origData, nil
}

func PKCS5Padding(ciphertext []byte, blockSize int) []byte {
    padding := blockSize - len(ciphertext)%blockSize
    padtext := bytes.Repeat([]byte{byte(padding)}, padding)
    return append(ciphertext, padtext...)
}

func PKCS5UnPadding(origData []byte) []byte {
    length := len(origData)
    // 去掉最後一個位元組 unpadding 次
    unpadding := int(origData[length-1])
    return origData[:(length - unpadding)]
}

相關推薦

DES3DES 加密演算法呼叫

DES加密常用的概念 加密模式 ECB模式 全稱Electronic Codebook模式,譯為電子密碼本模式 CBC模式 全稱Cipher Block Chaining模式,譯為密文分組連結模式 CFB模式 全稱Cipher FeedBack模式,譯為密

區塊鏈教程區塊鏈背後的資訊保安2DES3DES加密演算法原理二

Feistel輪函式 每次Feistel輪函式內部,均經過4種運算,即: 1、擴充套件置換:右側32位做擴充套件置換,擴充套件置換將32位輸入擴充套件成為48位輸出,使得擴充套件後輸出資料長度與48位子金鑰等長。 2、異或運算:右側32位擴充套件置換為48位後,與48位子金鑰做異或運算。 3

加密演算法詳解 DES3DESAESRSAMD5sha1

DES、3DES、AES、RSA、MD5、sha1 加密演算法總結一、簡介DES:全稱為Data Encryption Standard,即資料加密標準,是一種使用金鑰加密的塊演算法;DES現在已經不是一種安全的加密方法,主要因為它使用的56位金鑰過短。1999年1月,di

JAVA 常用的加密演算法之對稱加密DES3DES和AES

1、對稱加密演算法 1.1 定義 對稱加密演算法是應用較早的加密演算法,技術成熟。在對稱加密演算法中,資料發信方將明文(原始資料)和加密金鑰一起經過特殊加密演算法處理後,使其變成複雜的加密密文傳送出去。收信方收到密文後,若想解讀原文,則需要使用加密用過的金鑰

分組對稱金鑰加密演算法——DES3DES(DESede 或 TDES)AES

一、常用的 "分組對稱金鑰加密演算法" 分為以下3種 (1)DES(Data Encryption Standard,標準加密演算法)   1977年1月,美國政府頒佈:採納IBM公司設計的方案作為非機密資料的正式資料加密標準(DES Data Encryption Sta

DES3DESAESPBE對稱加密演算法實現及應用

1.對稱加密演算法概述 對稱加密演算法是應用較早的加密演算法,技術成熟。在對稱加密演算法中,資料發信方將明文和加密金鑰一起經過特殊加密演算法處理後,使其變成複雜的加密密文傳送出去。收信方收到密文後,若想解讀原文,則需要使用加密用過的金鑰及相同演算法的逆演算法對密文進行解密,才能使其恢復成可讀明文。 在對稱加密

<golang>常用對稱加密DES3DES具體實現

版權宣告:本文為作者原創,如需轉載,請註明出處 https://blog.csdn.net/weixin_42940826 注:分組加密演算法需要用分組模式的知識,在我上一篇帖子裡有具體介紹,歡迎來戳對稱加密演算法常用的五種分組模式(ECB/CBC/CFB/OFB/CTR)

常用對稱加密DES3DES具體實現(go語言)

DES簡介和實現 DES – Data Encryption Standard (已經被破解不再使用,但是很有研究價值,而且誕生出了3DES還可以使用) 常見問題 Q1 :是不是分組密碼? A :是, 先對資料進行分組, 然後在加密或解密 Q2:D

[Python]實現DES加密演算法3DES加密演算法

pyDes.py ############################################################################# # Documentation

Android比DES加密更安全的演算法——3DES加密演算法

    在前面的文章裡面,我們討論了DES演算法,同時也明白瞭如何才能保證不同平臺下的加密和解密結果的一致性。但是DES作為出現了很長時間的一種加密演算法,隨著計算機運算能力的加強,DES加密容易被暴力破解,其安全性變得有點低。於是,為了增強資料的安全性,3DES演算法

DESAESRSAMD5加密演算法辨析與應用場景

資訊保安Cryptographic Techniques 對稱加密演算法 Data Encryption Standard(DES) DES 是一種典型的塊加密方法:將固定長度的明文通過一系列複雜的操作變成同樣長度的密文,塊的長度為64位。同時,DE

Android資料加密DES3DESAES

    在Android開發中,可能會遇到對資料進行加密的情況。典型的對稱加密演算法有DES、3DES、AES等。 一.DES     DES演算法的入口引數有三個:Key、Data、Mode。其中Key為7個位元組共56位,是DES演算法的工作金鑰;Data為8個位元組6

DES3DESAES

DES 1977年1月,美國政府頒佈:採納IBM公司設計的方案作為非機密資料的正式資料加密標準(DES Data Encryption Standard) 。 目前在國內,隨著三金工程尤其是金卡工程的啟動,DES演算法在POS、ATM、磁卡及智慧卡(IC卡)、加油站

區塊鏈教程區塊鏈背後的信息安全2DES3DES加密算法原理二

sci lang 實現 單獨 enc row ret ini 一次 Feistel輪函數 每次Feistel輪函數內部,均經過4種運算,即: 1、擴展置換:右側32位做擴展置換,擴展置換將32位輸入擴展成為48位輸出,使得擴展後輸出數據長度與48位子密鑰等長。 2、異或運

區塊鏈教程區塊鏈背後的信息安全2DES3DES加密算法原理一

人才 對稱加密 異或運算 加密和解密 enc aes 其中 binary 錯誤 區塊鏈教程區塊鏈背後的信息安全2DES、3DES加密算法原理一,2018年下半年,區塊鏈行業正逐漸褪去發展之初的浮躁、回歸理性,表面上看相關人才需求與身價似乎正在回落。但事實上,正是初期泡沫的漸

單向雜湊 —— 簡介SHA256加密演算法RIPEMD160加密演算法

單向雜湊 單向雜湊演算法,又稱hash函式(雜湊函式,或者雜湊演算法),就是把任意輸入訊息字串變成固定長的輸出串的一種函式,這個輸出串稱為該訊息的雜湊值,一般使用產生訊息摘要,金鑰加密等。具體指的是根據輸入訊息計算後,輸出固定長度數值的演算法,輸出數值也成為“雜湊值”或訊息摘要,其長度通常在

使用js實現5種加密解密演算法(凱撒密碼字母倒排序單表置換維基利亞轉換加密演算法

在學習作業系統的時候,我們會學到系統安全的章節,而在這一塊會有關於加密解密演算法的學習。 一共有5種常見的加密解密演算法:凱撒密碼、字母倒排序、單表置換、維基利亞、轉換加密演算法。  我使用了js實現了這5種演算法,而且做了視覺化處理、輸入輸出格式化處理,使得操作起來非常

基於java類庫的3DES加密演算法實現

別看3DES的程式碼很複雜,其實和DES程式碼一樣,核心程式碼就那麼幾行 加密部分的核心 Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding"); cipher.init(Cipher.E

golang常用加密解密演算法總結(AESDESRSASha1MD5)

在專案開發過程中,當操作一些使用者的隱私資訊,諸如密碼、帳戶金鑰等資料時,往往需要加密後可以在網上傳輸。這時,需要一些高效地、簡單易用的加密演算法加密資料,然後把加密後的資料存入資料庫或進行其他操作;當需要讀取資料時,把加密後的資料取出來,再通過演算法解密。 關於加密解密 當前我們專案中常用

對稱加密演算法-DES,3DES,AES

1.jdk與bc實現DES演算法: package com.samlai.security; import java.security.Key; import java.security.NoSuchAlgorithmException; import java.sec