标签 crypto 下的文章

“”

BLAKE和BLAKE2是基于丹尼尔·J·伯恩斯坦ChaCha流密码的密码散列函数。与SHA-2一样,有两种不同字大小的变体。BLAKE-256和BLAKE-224使用32位字,分别产生256位和224位的摘要大小,而BLAKE-512和BLAKE-384分别使用64位字,产生512位和384位的摘要大小。在64位的x64和ARM体系结构上运行时,BLAKE2b比SHA-3,SHA-2,SHA-1和MD5更快。BLAKE2的安全性提供类似于SHA-3,优于SHA-2:免疫长度扩展攻击,来自随机预言机的无差异性等。BLAKE的改进版本BLAKE2于2012年12月21日宣布推出。BLAKE3于2020年1月9日宣布推出。
代码:

package main

import (
    "fmt"

    "golang.org/x/crypto/blake2b"
)

func main() {
    fmt.Println("go crypto blake2b_512 demo.")
    str1 := "https://const.net.cn/"
    w := blake2b.Sum512([]byte(str1))

    hashstr := fmt.Sprintf("blake2b_512 = %x ,blake2b_512 len = %d", w, len(w))
    fmt.Println(hashstr)
}

输出:

go run .
go crypto blake2b_512 demo.
blake2b_512 = 4331451a749ca61a9d10f856f5eef9c453c34df8f519d21d2e336037aada9d9f0a234477ea8c44157dcd5349b993c65f5a22ddc8703e30041bba5679b5ecd936 ,blake2b_512 len = 64
echo -n "https://const.net.cn/" | openssl dgst -blake2b512
(stdin)= 4331451a749ca61a9d10f856f5eef9c453c34df8f519d21d2e336037aada9d9f0a234477ea8c44157dcd5349b993c65f5a22ddc8703e30041bba5679b5ecd936

BLAKE和BLAKE2是基于丹尼尔·J·伯恩斯坦ChaCha流密码的密码散列函数。与SHA-2一样,有两种不同字大小的变体。BLAKE-256和BLAKE-224使用32位字,分别产生256位和224位的摘要大小,而BLAKE-512和BLAKE-384分别使用64位字,产生512位和384位的摘要大小。在64位的x64和ARM体系结构上运行时,BLAKE2b比SHA-3,SHA-2,SHA-1和MD5更快。BLAKE2的安全性提供类似于SHA-3,优于SHA-2:免疫长度扩展攻击,来自随机预言机的无差异性等。BLAKE的改进版本BLAKE2于2012年12月21日宣布推出。BLAKE3于2020年1月9日宣布推出。

If you are planning to produce checksum for files, you can consider using BLAKE2 is a cryptographic hash function. According to the official site, it is faster than MD5, SHA-1, SHA-2, and SHA-3.

代码:

package main

import (
    "encoding/hex"
    "fmt"
    "io"
    "log"
    "os"

    "golang.org/x/crypto/blake2b"
)

func main() {
    fmt.Println("go crypto blake2b_512 demo. blake2b hash file demo. blake2b hash file example.")
    str1 := "https://const.net.cn"
    str2 := "/"
    w, _ := blake2b.New512(nil)
    io.WriteString(w, str1)
    io.WriteString(w, str2)
    hash := w.Sum(nil)
    hashstr := fmt.Sprintf("blake2b_512 = %x ,blake2b_512 len = %d", hash, len(hash))
    fmt.Println(hashstr)

    //blake2b_512 hash file
    hasher, _ := blake2b.New512(nil)

    path := "/const/net/cn/file"
    f, err := os.Open(path)
    if err != nil {
        log.Fatal(err)
    }

    defer f.Close()

    if _, err := io.Copy(hasher, f); err != nil {
        log.Fatal(err)
    }

    filehash := hasher.Sum(nil)
    encodedHex := hex.EncodeToString(filehash[:])
    fmt.Printf("/const/net/cn/file hash = %s", encodedHex)
}

输出:

echo -n "https://const.net.cn/" > /const/net/cn/file
go run .
go crypto blake2b_512 demo. blake2b hash file demo. blake2b hash file example.
blake2b_512 = 4331451a749ca61a9d10f856f5eef9c453c34df8f519d21d2e336037aada9d9f0a234477ea8c44157dcd5349b993c65f5a22ddc8703e30041bba5679b5ecd936 ,blake2b_512 len = 64
/const/net/cn/file hash = 4331451a749ca61a9d10f856f5eef9c453c34df8f519d21d2e336037aada9d9f0a234477ea8c44157dcd5349b993c65f5a22ddc8703e30041bba5679b5ecd936

包含了md5,sha256,sha512,sha3_512,black2s,black2b等hash算法示例。
代码:

package main

import (
    "crypto/md5"
    "crypto/sha256"
    "crypto/sha512"
    "fmt"

    "golang.org/x/crypto/blake2b"
    "golang.org/x/crypto/blake2s"
    "golang.org/x/crypto/sha3"
)

func getHash(input string, hashType string) string {
    switch hashType {
    case "MD5":
        return fmt.Sprintf("%x", md5.Sum([]byte(input)))
    case "SHA256":
        return fmt.Sprintf("%x", sha256.Sum256([]byte(input)))
    case "SHA512":
        return fmt.Sprintf("%x", sha512.Sum512([]byte(input)))
    case "SHA3_512":
        return fmt.Sprintf("%x", sha3.Sum512([]byte(input)))
    case "BLAKE2s_256":
        return fmt.Sprintf("%x", blake2s.Sum256([]byte(input)))
    case "BLAKE2b_512":
        return fmt.Sprintf("%x", blake2b.Sum512([]byte(input)))
    default:
        return fmt.Sprintf("%x", sha256.Sum256([]byte(input)))
    }
}

func main() {
    fmt.Println("go md5,sha256,sha512,sha3_512,blake2s_256,blake2b_512 hash demo")
    fmt.Println("MD5:", getHash("https://const.net.cn/", "MD5"))
    fmt.Println("SHA256:", getHash("https://const.net.cn/", "SHA256"))
    fmt.Println("SHA512:", getHash("https://const.net.cn/", "SHA512"))
    fmt.Println("SHA3_512:", getHash("https://const.net.cn/", "SHA3_512"))
    fmt.Println("BLAKE2s_256:", getHash("https://const.net.cn/", "BLAKE2s_256"))
    fmt.Println("BLAKE2b_512:", getHash("https://const.net.cn/", "BLAKE2b_512"))
}

输出:

go run .
go md5,sha256,sha512,sha3_512,blake2s_256,blake2b_512 hash demo
MD5: 4b655b565c09136dd867a7e523371391
SHA256: 2249a0aa015fa72b155b297b331bc0e7e34052096c43297d9a2de3a2df38bded
SHA512: dee0877970a321da947b39223110525fa0d9a47d703bce0c5cd39066e25b1078b76d21d83657c35451484db62e5ef80e43a33769b1f626bb8940ad3890e64fd5
SHA3_512: 540bc484763d923575db2aec61fab3502524225f127270301d1cf7f572bf17cd252241322c9df8875df159e732f344cd2cb83991bfc1f3dfbe43c1887f366380
BLAKE2s_256: 5d91ecdf175b8f81bf3cd76c96f7fa1174d4cba8f4bcfa17d183bf4b20f7cdca
BLAKE2b_512: 4331451a749ca61a9d10f856f5eef9c453c34df8f519d21d2e336037aada9d9f0a234477ea8c44157dcd5349b993c65f5a22ddc8703e30041bba5679b5ecd936

高级加密标准(英语:Advanced Encryption Standard,缩写:AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。现在,高级加密标准已然成为对称密钥加密中最流行的算法之一。

代码:

package main

import (
    "bytes"
    "crypto/aes"
    "crypto/cipher"
    "crypto/md5"
    "fmt"
)

func main() {
    fmt.Println("go crypto aes-128-cbc demo/example.")
    message := []byte("https://const.net.cn/")
    //指定密钥h
    key := []byte("1234567812345678")
    //加密
    cipherText := AES_CBC_Encrypt(message, key)
    fmt.Printf("加密后:%x\n", cipherText)
    fmt.Printf("MD5后为:%x\n", md5.Sum(cipherText))
    //解密
    plainText := AES_CBC_Decrypt(cipherText, key)
    fmt.Println("解密后为:", string(plainText))
}

//对明文进行填充
func Padding(plainText []byte, blockSize int) []byte {
    //计算要填充的长度
    n := blockSize - len(plainText)%blockSize
    //对原来的明文填充n个n
    temp := bytes.Repeat([]byte{byte(n)}, n)
    plainText = append(plainText, temp...)
    return plainText
}

//对密文删除填充
func UnPadding(cipherText []byte) []byte {
    //取出密文最后一个字节end
    end := cipherText[len(cipherText)-1]
    //删除填充
    cipherText = cipherText[:len(cipherText)-int(end)]
    return cipherText
}

//AES加密(CBC模式)
func AES_CBC_Encrypt(plainText []byte, key []byte) []byte {
    //指定加密算法,返回一个AES算法的Block接口对象
    block, err := aes.NewCipher(key)
    if err != nil {
        panic(err)
    }
    //进行填充
    plainText = Padding(plainText, block.BlockSize())
    //指定初始向量vi,长度和block的块尺寸一致
    iv := []byte("1234567812345678")
    //指定分组模式,返回一个BlockMode接口对象
    blockMode := cipher.NewCBCEncrypter(block, iv)
    //加密连续数据库
    cipherText := make([]byte, len(plainText))
    blockMode.CryptBlocks(cipherText, plainText)
    //返回密文
    return cipherText
}

//AES解密(CBC模式)
func AES_CBC_Decrypt(cipherText []byte, key []byte) []byte {
    //指定解密算法,返回一个AES算法的Block接口对象
    block, err := aes.NewCipher(key)
    if err != nil {
        panic(err)
    }
    //指定初始化向量IV,和加密的一致
    iv := []byte("1234567812345678")
    //指定分组模式,返回一个BlockMode接口对象
    blockMode := cipher.NewCBCDecrypter(block, iv)
    //解密
    plainText := make([]byte, len(cipherText))
    blockMode.CryptBlocks(plainText, cipherText)
    //删除填充
    plainText = UnPadding(plainText)
    return plainText
}

输出:

go run .
go crypto aes-128-cbc demo/example.
加密后:7c3d609dad2a0ba771088602d5c3ac8d74c4d9c6be86a925daa3964a4f567d0d
MD5后为:e209153d97b93e25ed7ec8ee05b39eb6
解密后为: https://const.net.cn/

验证:

echo -n "https://const.net.cn/" |openssl enc -aes-128-cbc -K 31323334353637383132333435363738 -iv 31323334353637383132333435363738 | hexdump -C
00000000  7c 3d 60 9d ad 2a 0b a7  71 08 86 02 d5 c3 ac 8d  ||=`..*..q.......|
00000010  74 c4 d9 c6 be 86 a9 25  da a3 96 4a 4f 56 7d 0d  |t......%...JOV}.|
00000020
echo -n "https://const.net.cn/" |openssl enc -aes-128-cbc -K 31323334353637383132333435363738 -iv 31323334353637383132333435363738 | openssl dgst -md5
(stdin)= e209153d97b93e25ed7ec8ee05b39eb6

高级加密标准(英语:Advanced Encryption Standard,缩写:AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。现在,高级加密标准已然成为对称密钥加密中最流行的算法之一。

aes-192-cbc相较于aes-128-cbc,主要差别在于密钥的长度,aes-192-cbc密钥的长度为24字节,aes-256-cbc密钥的长度为32字节,aes-128-cbc密码的长度为16字节。

代码:

package main

import (
    "bytes"
    "crypto/aes"
    "crypto/cipher"
    "crypto/md5"
    "fmt"
)

func main() {
    fmt.Println("go crypto aes-192-cbc demo/example.")
    message := []byte("https://const.net.cn")
    //指定密钥
    key := []byte("123456781234567812345678")
    //加密
    cipherText := AES_CBC_Encrypt(message, key)
    fmt.Printf("加密后:%x\n", cipherText)
    fmt.Printf("MD5后为:%x\n", md5.Sum(cipherText))
    //解密
    plainText := AES_CBC_Decrypt(cipherText, key)
    fmt.Println("解密后为:", string(plainText))
}

//对明文进行填充
func Padding(plainText []byte, blockSize int) []byte {
    //计算要填充的长度
    n := blockSize - len(plainText)%blockSize
    //对原来的明文填充n个n
    temp := bytes.Repeat([]byte{byte(n)}, n)
    plainText = append(plainText, temp...)
    return plainText
}

//对密文删除填充
func UnPadding(cipherText []byte) []byte {
    //取出密文最后一个字节end
    end := cipherText[len(cipherText)-1]
    //删除填充
    cipherText = cipherText[:len(cipherText)-int(end)]
    return cipherText
}

//AES加密(CBC模式)
func AES_CBC_Encrypt(plainText []byte, key []byte) []byte {
    //指定加密算法,返回一个AES算法的Block接口对象
    block, err := aes.NewCipher(key)
    if err != nil {
        panic(err)
    }
    //进行填充
    plainText = Padding(plainText, block.BlockSize())
    //指定初始向量vi,长度和block的块尺寸一致
    iv := []byte("1234567812345678")
    //指定分组模式,返回一个BlockMode接口对象
    blockMode := cipher.NewCBCEncrypter(block, iv)
    //加密连续数据库
    cipherText := make([]byte, len(plainText))
    blockMode.CryptBlocks(cipherText, plainText)
    //返回密文
    return cipherText
}

//AES解密(CBC模式)
func AES_CBC_Decrypt(cipherText []byte, key []byte) []byte {
    //指定解密算法,返回一个AES算法的Block接口对象
    block, err := aes.NewCipher(key)
    if err != nil {
        panic(err)
    }
    //指定初始化向量IV,和加密的一致
    iv := []byte("1234567812345678")
    //指定分组模式,返回一个BlockMode接口对象
    blockMode := cipher.NewCBCDecrypter(block, iv)
    //解密
    plainText := make([]byte, len(cipherText))
    blockMode.CryptBlocks(plainText, cipherText)
    //删除填充
    plainText = UnPadding(plainText)
    return plainText
}

输出:

go run .
go crypto aes-192-cbc demo/example.
加密后:52a880797d51a84f7eb659185fd02da1d84839a415bd802cef844ba41fa0f538
MD5后为:e3642d3d1059f59bbf5601b5687df351
解密后为: https://const.net.cn
echo -n "https://const.net.cn" | openssl enc -aes-192-cbc -K 313233343536373831323334353637383132333435363738 -iv 31323334353637383132333435363738 |openssl dgst -md5
(stdin)= e3642d3d1059f59bbf5601b5687df351
echo -n "https://const.net.cn" | openssl enc -aes-192-cbc -K 313233343536373831323334353637383132333435363738 -iv 31323334353637383132333435363738 |hexdump -e '32/1 "%02x" "\n"'
52a880797d51a84f7eb659185fd02da1d84839a415bd802cef844ba41fa0f538