golang常用加密解密算法总结(AES、DES、RSA、Sha1、MD5)

Golang常用加密解密算法总结

Golang提供了丰富的加密解密算法库,本篇文章将介绍常用的加密解密算法:AES、DES、RSA、Sha1、MD5。

AES(Advanced Encryption Standard)

AES加密算法是目前应用最广泛的对称加密算法,在网络传输中常作为对称加密方式使用。AES算法支持多种不同的密钥长度,包括128位,192位和256位密钥长度。

下面是使用Go语言进行AES加密解密的示例:

package main

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

func encrypt(key, plaintext []byte) ([]byte, error) {
    block, err := aes.NewCipher(key)
    if err != nil {
        return nil, err
    }
    ciphertext := make([]byte, aes.BlockSize+len(plaintext))
    iv := ciphertext[:aes.BlockSize]
    if _, err := rand.Read(iv); err != nil {
        return nil, err
    }
    stream := cipher.NewCFBEncrypter(block, iv)
    stream.XORKeyStream(ciphertext[aes.BlockSize:], plaintext)
    return ciphertext, nil
}

func decrypt(key, ciphertext []byte) ([]byte, error) {
    block, err := aes.NewCipher(key)
    if err != nil {
        return nil, err
    }
    if len(ciphertext) < aes.BlockSize {
        return nil, errors.New("ciphertext too short")
    }
    iv := ciphertext[:aes.BlockSize]
    ciphertext = ciphertext[aes.BlockSize:]
    stream := cipher.NewCFBDecrypter(block, iv)
    stream.XORKeyStream(ciphertext, ciphertext)
    return ciphertext, nil
}

func main() {
    key := []byte("thisisapassword12345")
    plaintext := []byte("The quick brown fox jumps over the lazy dog")
    ciphertext, err := encrypt(key, plaintext)
    if err != nil {
        panic(err)
    }
    fmt.Printf("AES encrypted value: %x\n", ciphertext)

    decrypted, err := decrypt(key, ciphertext)
    if err != nil {
        panic(err)
    }
    fmt.Printf("AES decrypted value: %s\n", decrypted)
}

DES(Data Encryption Standard)

DES加密算法是一种对称加密算法,密钥长度是56位。由于随着计算机技术的不断发展,DES算法越来越容易被攻破,因此目前已经不再被推荐使用。

下面是使用Go语言进行DES加密解密的示例:

package main

import (
    "crypto/cipher"
    "crypto/des"
    "fmt"
)

func encryptDES(key, plaintext []byte) ([]byte, error) {
    block, err := des.NewCipher(key)
    if err != nil {
        return nil, err
    }
    ciphertext := make([]byte, len(plaintext))
    cbc := cipher.NewCBCEncrypter(block, key[:8])
    cbc.CryptBlocks(ciphertext, plaintext)
    return ciphertext, nil
}

func decryptDES(key, ciphertext []byte) ([]byte, error) {
    block, err := des.NewCipher(key)
    if err != nil {
        return nil, err
    }
    plaintext := make([]byte, len(ciphertext))
    cbc := cipher.NewCBCDecrypter(block, key[:8])
    cbc.CryptBlocks(plaintext, ciphertext)
    return plaintext, nil
}

func main() {
    key := []byte("password")
    plaintext := []byte("The quick brown fox jumps over the lazy dog")
    ciphertext, err := encryptDES(key, plaintext)
    if err != nil {
        panic(err)
    }
    fmt.Printf("DES encrypted value: %x\n", ciphertext)

    decrypted, err := decryptDES(key, ciphertext)
    if err != nil {
        panic(err)
    }
    fmt.Printf("DES decrypted value: %s\n", decrypted)
}

RSA(Rivest–Shamir–Adleman)

RSA算法是一种非对称加密算法,密钥分为公钥和私钥,用公钥加密数据,只有对应的私钥才能解密,反之亦然。RSA算法常防范网络中的中间人攻击。

下面是使用Go语言进行RSA加密解密的示例:

package main

import (
    "crypto/rand"
    "crypto/rsa"
    "fmt"
)

func encryptRSA(pubkey *rsa.PublicKey, plaintext []byte) ([]byte, error) {
    ciphertext, err := rsa.EncryptPKCS1v15(rand.Reader, pubkey, plaintext)
    if err != nil {
        return nil, err
    }
    return ciphertext, nil
}

func decryptRSA(privkey *rsa.PrivateKey, ciphertext []byte) ([]byte, error) {
    plaintext, err := rsa.DecryptPKCS1v15(rand.Reader, privkey, ciphertext)
    if err != nil {
        return nil, err
    }
    return plaintext, nil
}

func main() {
    // 生成RSA密钥对
    privkey, err := rsa.GenerateKey(rand.Reader, 2048)
    if err != nil {
        panic(err)
    }

    // 使用公钥加密
    pubkey := &privkey.PublicKey
    plaintext := []byte("The quick brown fox jumps over the lazy dog")
    ciphertext, err := encryptRSA(pubkey, plaintext)
    if err != nil {
        panic(err)
    }
    fmt.Printf("RSA encrypted value: %x\n", ciphertext)

    // 使用私钥解密
    decrypted, err := decryptRSA(privkey, ciphertext)
    if err != nil {
        panic(err)
    }
    fmt.Printf("RSA decrypted value: %s\n", decrypted)
}

SHA1(Secure Hash Algorithm 1)

SHA1算法是一种哈希算法,用于生成消息摘要,其输出是160位的二进制字符串。SHA1算法通常用于数字签名和认证应用程序。

下面是使用Go语言进行SHA1哈希的示例:

package main

import (
    "crypto/sha1"
    "fmt"
)

func sha1Hash(input []byte) []byte {
    h := sha1.New()
    h.Write(input)
    return h.Sum(nil)
}

func main() {
    input := []byte("The quick brown fox jumps over the lazy dog")
    hashed := sha1Hash(input)
    fmt.Printf("SHA1 HASH of %s: %x\n", input, hashed)
}

MD5(Message-Digest Algorithm 5)

MD5算法是一种哈希算法,通常用于一致性验证、数字签名和密码哈希存储等领域。其输出是128位的二进制字符串。

下面是使用Go语言进行MD5哈希的示例:

package main

import (
    "crypto/md5"
    "fmt"
)

func md5Hash(input []byte) []byte {
    h := md5.New()
    h.Write(input)
    return h.Sum(nil)
}

func main() {
    input := []byte("The quick brown fox jumps over the lazy dog")
    hashed := md5Hash(input)
    fmt.Printf("MD5 of %s: %x\n", input, hashed)
}

以上就是常用的加密解密算法在Go语言中的使用总结。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:golang常用加密解密算法总结(AES、DES、RSA、Sha1、MD5) - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • C++ 中构造函数的实例详解

    C++ 中构造函数的实例详解 什么是构造函数 在 C++ 中,构造函数是一个特殊的函数,用于在对象被创建时进行初始化的操作。每个类都必须拥有至少一个构造函数,否则编译器将会自动为其创建一个默认构造函数。 构造函数的定义和调用 构造函数与普通函数类似,也有参数和函数体,但是它没有返回值和函数名称与类名相同。构造函数在创建对象时自动调用。 class MyCla…

    C 2023年5月22日
    00
  • C++基于特征向量的KNN分类算法

    C++基于特征向量的KNN分类算法的完整攻略可以分为以下几个步骤: 1. 数据预处理 首先,需要对训练数据进行预处理,将其转换为特征向量的形式。对于图像等多维数据,可以使用特征提取的方法,如SIFT、HOG等来获得其特征向量;对于其他数据,可以根据具体情况选择适当的方法将其转换为特征向量。 2. 计算距离 KNN算法是一种基于距离的分类算法,因此在使用KNN…

    C 2023年5月22日
    00
  • 在Python 中将类对象序列化为JSON

    序列化(Serialization)指的是将数据结构或对象状态转换为可以存储或传输的格式的过程。其中,将数据转换成JSON格式是常见的序列化方式之一。Python 中提供了通用的序列化模块 json 来实现将数据转换为JSON格式,其中也包括对象的序列化操作。 下面是将 Python 类对象序列化为 JSON 的完整操作步骤: 导入 JSON 模块 json…

    C 2023年5月23日
    00
  • 解析C++中的字符串处理函数和指针

    解析C++中的字符串处理函数和指针 在C++中,字符串(String)是一种常见的数据类型。在使用字符串时,我们常常需要进行一些处理,例如拼接字符串、查找字符、截取子串等。此时,就需要用到字符串处理函数和指针。以下是详细的解析攻略。 字符串处理函数 在C++中,有一些常用的字符串处理函数,下面来一一介绍。 strlen strlen 函数用于计算字符串的长度…

    C 2023年5月23日
    00
  • C++隐式转换问题分析及解决办法

    C++隐式转换问题分析及解决办法 背景 C++是一门强类型语言,变量必须先定义类型才能使用,这样可以提高代码的可靠性和执行效率。但在一些情况下,C++的强类型编程方式反而降低了编码的便利性和灵活性。因此,C++提供了隐式类型转换(implicit type conversion)机制,可以方便地将一种类型的变量转换成另一种类型的变量,这也是C++语言的特性之…

    C 2023年5月23日
    00
  • C++11中的原子量和内存序详解

    C++11中的原子量和内存序详解 什么是原子量? 在多线程编程中,有一个非常重要的概念就是“原子操作”。简单来说,原子操作就是指这个操作一旦开始执行,就不会被其他线程打断,直到完成为止。多个线程同时操作同一个内存地址时,可能会产生竞争,导致数据不一致的问题。当使用原子操作时,可以保证对这个内存地址的操作都是原子级别,不会被打断。 在C++11标准中,增加了一…

    C 2023年5月22日
    00
  • C 标准库 time.h

    time.h 是 C 标准库中的一个头文件,它提供了一系列函数来操作日期和时间。下面我们来详细讲解如何使用 time.h 标准库。 时间表示法 在 time.h 中,通常使用 time_t 类型来表示时间戳(timestamp),即表示从 1970 年 1 月 1 日 0 时 0 分 0 秒到某一个时间点所经过的秒数。时间戳可以用 time() 函数获取。 …

    C 2023年5月10日
    00
  • DEV C++源码编译后控制台输出中文乱码问题解决

    以下是详细讲解“DEV C++源码编译后控制台输出中文乱码问题”的完整攻略: 问题原因及解决方案 开发过程中,我们经常会遇到中文输出乱码的问题。这是因为 C/C++ 标准库使用的是 ASCII 编码,而中文的编码不是 ASCII,所以输出会产生乱码。在 Windows 下,可以使用一些特殊的函数来解决这个问题。 解决方案 使用 _setmode 函数 _se…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部