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#连接MySQL数据库的方法步骤

    下面是C#连接MySQL数据库的方法步骤的完整攻略。 1. 准备工作 在连接MySQL数据库之前,需要在计算机上安装MySQL数据库,并创建相应的数据库和数据表。此外,还需要下载MySql.Data.dll和MySQL Connector/NET。在连接MySQL数据库之前,还需要在Visual Studio中引用这些dll。 2. 导入命名空间 在C#代码…

    C 2023年5月22日
    00
  • 详解C/C++中低耦合代码的设计实现

    详解C/C++中低耦合代码的设计实现 在C/C++开发过程中,低耦合的代码设计和实现可以提高代码的可读性、可维护性和可重用性,更加适合大型项目的开发。下面我们将详细讲解如何实现低耦合的代码设计。 1. 引入头文件的精简化 在编写C/C++代码的时候,我们会引入许多头文件,这些头文件中可能包含了许多不必要的定义和声明。这些不必要的定义和声明会增加代码的耦合度。…

    C 2023年5月30日
    00
  • C语言中如何进行指针操作?

    C语言中指针操作非常重要,通过指针可以直接操作内存,能够帮助我们更好地利用计算机资源。下面我将详细讲解C语言中指针操作的方法。 一、定义指针(声明和初始化) 在C语言中,声明指针使用*,例如: int *p; 指针定义完成后,需要为其赋值,使其指向一个具有内存地址的变量,例如: int a = 1; int *p = &a; 说明:&符号表示…

    C 2023年4月27日
    00
  • Java日常练习题,每天进步一点点(43)

    以下是Java日常练习题43的完整攻略。 题目描述 本题目要求实现一个方法,该方法接受一个整数数组,返回数组中最大的两个数之和。 方法签名 public static int maxTwoSum(int[] nums) 示例输入输出 示例1: 输入: [1,2,3,4,5] 输出: 9 示例2: 输入: [7,5,1,6,3,0] 输出: 13 解题思路 这…

    C 2023年5月22日
    00
  • mysql8.0 JSON_CONTAINS的使用说明

    mysql8.0 JSON_CONTAINS函数详解 简介 JSON_CONTAINS()函数用于检查是否存在指定JSON值。在MySQL8.0中,可以用该函数判断JSON数组或对象是否包含某个JSON值。 该函数返回值boolean类型,如果待查找的JSON存在于目标JSON中,则返回1,否则返回0。 JSON_CONTAINS()函数的完整语法如下: J…

    C 2023年5月23日
    00
  • C语言编程之三个方法实现strlen函数

    以下是详细的讲解“C语言编程之三个方法实现strlen函数”的完整攻略。 目录 什么是strlen函数 方法一:遍历字符串计数 方法二:使用指针递增统计 方法三:调用标准库函数strlen 总结 什么是strlen函数 strlen是一个C语言标准库函数,用来计算字符串的长度,即该字符串中字符的个数。函数的原型如下: size_t strlen(const …

    C 2023年5月23日
    00
  • C&C++设计风格选择 命名规范

    C/C++设计风格选择 什么是代码风格 代码风格是指编写代码时所遵循的规范和习惯,它涉及到如下几个方面: 命名规则(变量名、函数名、常量名等) 缩进和布局(tab还是空格、括号位置等) 注释规则(注释的格式、位置等) 代码组织(使用头文件、源文件等) 恰当的代码风格可以使程序更加清晰明了,便于日后的维护和修改。 C/C++代码风格 C/C++是一种老牌编程语…

    C 2023年5月23日
    00
  • golang中json和struct的使用说明

    当我们进行Web开发时,经常需要将数据发送和接收作为JSON格式,此时就需要掌握golang中json和struct的使用。 1. struct和json的概述 在golang中,我们可以使用struct表示一个自定义的数据类型。当我们需要发送和接收网络请求的时候,我们需要将一个struct对象序列化为JSON字符串,并且在收到响应后将JSON字符串反序列化…

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