跳转到主要内容

标签(标签)

资源精选(342) Go开发(108) Go语言(103) Go(99) angular(82) LLM(75) 大语言模型(63) 人工智能(53) 前端开发(50) LangChain(43) golang(43) 机器学习(39) Go工程师(38) Go程序员(38) Go开发者(36) React(33) Go基础(29) Python(24) Vue(22) Web开发(20) Web技术(19) 精选资源(19) 深度学习(19) Java(18) ChatGTP(17) Cookie(16) android(16) 前端框架(13) JavaScript(13) Next.js(12) 安卓(11) typescript(10) 资料精选(10) NLP(10) 第三方Cookie(9) Redwoodjs(9) LLMOps(9) Go语言中级开发(9) 自然语言处理(9) 聊天机器人(9) PostgreSQL(9) 区块链(9) mlops(9) 安全(9) 全栈开发(8) ChatGPT(8) OpenAI(8) Linux(8) AI(8) GraphQL(8) iOS(8) 软件架构(7) Go语言高级开发(7) AWS(7) C++(7) 数据科学(7) whisper(6) Prisma(6) 隐私保护(6) RAG(6) JSON(6) DevOps(6) 数据可视化(6) wasm(6) 计算机视觉(6) 算法(6) Rust(6) 微服务(6) 隐私沙盒(5) FedCM(5) 语音识别(5) Angular开发(5) 快速应用开发(5) 提示工程(5) Agent(5) LLaMA(5) 低代码开发(5) Go测试(5) gorm(5) REST API(5) 推荐系统(5) WebAssembly(5) GameDev(5) CMS(5) CSS(5) machine-learning(5) 机器人(5) 游戏开发(5) Blockchain(5) Web安全(5) Kotlin(5) 低代码平台(5) 机器学习资源(5) Go资源(5) Nodejs(5) PHP(5) Swift(5) 智能体(4) devin(4) Blitz(4) javascript框架(4) Redwood(4) GDPR(4) 生成式人工智能(4) Angular16(4) Alpaca(4) SAML(4) JWT(4) JSON处理(4) Go并发(4) kafka(4) 移动开发(4) 移动应用(4) security(4) 隐私(4) spring-boot(4) 物联网(4) nextjs(4) 网络安全(4) API(4) Ruby(4) 信息安全(4) flutter(4) 专家智能体(3) Chrome(3) CHIPS(3) 3PC(3) SSE(3) 人工智能软件工程师(3) LLM Agent(3) Remix(3) Ubuntu(3) GPT4All(3) 软件开发(3) 问答系统(3) 开发工具(3) 最佳实践(3) RxJS(3) SSR(3) Node.js(3) Dolly(3) 移动应用开发(3) 编程语言(3) 低代码(3) IAM(3) Web框架(3) CORS(3) 基准测试(3) Go语言数据库开发(3) Oauth2(3) 并发(3) 主题(3) Theme(3) earth(3) nginx(3) 软件工程(3) azure(3) keycloak(3) 生产力工具(3) gpt3(3) 工作流(3) C(3) jupyter(3) 认证(3) prometheus(3) GAN(3) Spring(3) 逆向工程(3) 应用安全(3) Docker(3) Django(3) R(3) .NET(3) 大数据(3) Hacking(3) 渗透测试(3) C++资源(3) Mac(3) 微信小程序(3) Python资源(3) JHipster(3) 大型语言模型(2) 语言模型(2) 可穿戴设备(2) JDK(2) SQL(2) Apache(2) Hashicorp Vault(2) Spring Cloud Vault(2) Go语言Web开发(2) Go测试工程师(2) WebSocket(2) 容器化(2) AES(2) 加密(2) 输入验证(2) ORM(2) Fiber(2) Postgres(2) Gorilla Mux(2) Go数据库开发(2) 模块(2) 泛型(2) 指针(2) HTTP(2) PostgreSQL开发(2) Vault(2) K8s(2) Spring boot(2) R语言(2) 深度学习资源(2) 半监督学习(2) semi-supervised-learning(2) architecture(2) 普罗米修斯(2) 嵌入模型(2) productivity(2) 编码(2) Qt(2) 前端(2) Rust语言(2) NeRF(2) 神经辐射场(2) 元宇宙(2) CPP(2) 数据分析(2) spark(2) 流处理(2) Ionic(2) 人体姿势估计(2) human-pose-estimation(2) 视频处理(2) deep-learning(2) kotlin语言(2) kotlin开发(2) burp(2) Chatbot(2) npm(2) quantum(2) OCR(2) 游戏(2) game(2) 内容管理系统(2) MySQL(2) python-books(2) pentest(2) opengl(2) IDE(2) 漏洞赏金(2) Web(2) 知识图谱(2) PyTorch(2) 数据库(2) reverse-engineering(2) 数据工程(2) swift开发(2) rest(2) robotics(2) ios-animation(2) 知识蒸馏(2) 安卓开发(2) nestjs(2) solidity(2) 爬虫(2) 面试(2) 容器(2) C++精选(2) 人工智能资源(2) Machine Learning(2) 备忘单(2) 编程书籍(2) angular资源(2) 速查表(2) cheatsheets(2) SecOps(2) mlops资源(2) R资源(2) DDD(2) 架构设计模式(2) 量化(2) Hacking资源(2) 强化学习(2) flask(2) 设计(2) 性能(2) Sysadmin(2) 系统管理员(2) Java资源(2) 机器学习精选(2) android资源(2) android-UI(2) Mac资源(2) iOS资源(2) Vue资源(2) flutter资源(2) JavaScript精选(2) JavaScript资源(2) Rust开发(2) deeplearning(2) RAD(2)

目标


在本教程结束时,您将能够……

  • 使用 AES 加密文本 - Go 中的高级加密标准
  • 然后,我们将研究将此加密消息写入文件
  • 最后,我们将看看如何使用共享密钥解密此消息

由此,您应该能够构建自己的简单加密系统,该系统可以执行各种操作,例如加密文件系统上的文件并使用只有您知道的密码来保护它们,或者为您正在工作的系统的各个部分添加简单加密上。

介绍


我们将从查看 AES 或高级加密标准开始,因为这是我们将用于加密和解密 Go 程序中的信息的标准。

然后我们将构建一个非常简单的加密程序,它将从命令行接收一个密码短语,并将其与 AES 结合使用来加密一段文本。

完成此操作后,我们将创建一个对应程序,该程序将使用我们用于加密文本的相同密码来解密这段文本。

AES - 高级加密标准


因此,AES 或高级加密标准是一种对称密钥加密算法,最初由两位比利时密码学家 Joan Daemen 和 Vincent Rijmen 开发。

如果您想在任何程序中使用加密并且不太确定它们有何不同,那么 AES 绝对是最安全的选择,因为它既高效又易于使用。

注意 - 我将在以后的教程中介绍其他加密技术,因此请确保您在 Twitter 上关注我:@Elliot_f

对称密钥加密


如果您还没有遇到过对称密钥加密这个术语,请不要害怕,这是一个相对简单的概念,它本质上允许两方使用共享密钥来加密和解密信息。

我们的加密客户端


好的,让我们进入我们选择的代码编辑器并开始编写一些代码!

我们将首先创建一个名为 encrypt.go 的新文件,该文件将包含来自命令行的密码短语,然后在将其写入文件之前使用它来加密一些文本。

让我们从简单地使用预设密钥加密一段文本并打印出结果开始。一旦我们掌握了这一点,我们就可以引入更多的复杂性:

package main

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

func main() {
    fmt.Println("Encryption Program v0.01")

    text := []byte("My Super Secret Code Stuff")
    key := []byte("passphrasewhichneedstobe32bytes!")

    // generate a new aes cipher using our 32 byte long key
    c, err := aes.NewCipher(key)
    // if there are any errors, handle them
    if err != nil {
        fmt.Println(err)
    }

    // gcm or Galois/Counter Mode, is a mode of operation
    // for symmetric key cryptographic block ciphers
    // - https://en.wikipedia.org/wiki/Galois/Counter_Mode
    gcm, err := cipher.NewGCM(c)
    // if any error generating new GCM
    // handle them
    if err != nil {
        fmt.Println(err)
    }

    // creates a new byte array the size of the nonce
    // which must be passed to Seal
    nonce := make([]byte, gcm.NonceSize())
    // populates our nonce with a cryptographically secure
    // random sequence
    if _, err = io.ReadFull(rand.Reader, nonce); err != nil {
        fmt.Println(err)
    }

    // here we encrypt our text using the Seal function
    // Seal encrypts and authenticates plaintext, authenticates the
    // additional data and appends the result to dst, returning the updated
    // slice. The nonce must be NonceSize() bytes long and unique for all
    // time, for a given key.
    fmt.Println(gcm.Seal(nonce, nonce, text, nil))
}

因此,如果我们尝试使用 go run encrypt.go 运行它,您应该会看到它会打印出 Hello World 和代表我们加密文本的字节数组。

现在让我们尝试通过添加对 ioutil.WriteFile 的调用来将其写入文件,以代替我们最后的 fmt.Println 语句:

// the WriteFile method returns an error if unsuccessful
err = ioutil.WriteFile("myfile.data", gcm.Seal(nonce, nonce, text, nil), 0777)
// handle this error
if err != nil {
  // print it out
  fmt.Println(err)
}


有关在 Go 中读取和写入文件的更多信息,我建议您查看我恰当命名的文章 - 在 Go 中读取和写入文件。

测试一下


一旦我们完成对 encrypt.go 文件的这些更改,我们可以尝试对其进行测试:

$ go run encrypt.go


如果成功运行,您应该会在项目目录中看到一个名为 myfile.data 的新文件。如果你打开它,你应该会看到你的加密结果!

我们的解密客户端


既然我们已经介绍了加密并将我们的加密消息写入文件,现在让我们看看从该文件中读取并尝试使用相同的共享密钥对其进行解密。

我们将从使用 ioutil.ReadFile('myfile.data') 开始,以便将加密文本作为字节数组读取。一旦我们有了这个字节数组,我们随后就可以按照与加密方面非常相似的步骤进行操作。

  1. 首先,我们需要使用 aes.NewCipher 函数创建一个新的密码,传入我们的共享密钥作为它的主要参数。
  2. 接下来,我们需要生成我们的 GCM
  3. 之后,我们需要使用 gcm.NonceSize() 获取我们的 Nonce 大小
  4. 最后,我们将使用 gcm.Open() 函数解密我们的加密密文,该函数返回我们的明文和/或错误(如果有)。
package main

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

func main() {
    fmt.Println("Decryption Program v0.01")

    key := []byte("passphrasewhichneedstobe32bytes!")
    ciphertext, err := ioutil.ReadFile("myfile.data")
    // if our program was unable to read the file
    // print out the reason why it can't
    if err != nil {
        fmt.Println(err)
    }

    c, err := aes.NewCipher(key)
    if err != nil {
        fmt.Println(err)
    }

    gcm, err := cipher.NewGCM(c)
    if err != nil {
        fmt.Println(err)
    }

    nonceSize := gcm.NonceSize()
    if len(ciphertext) < nonceSize {
        fmt.Println(err)
    }

    nonce, ciphertext := ciphertext[:nonceSize], ciphertext[nonceSize:]
    plaintext, err := gcm.Open(nil, nonce, ciphertext, nil)
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(string(plaintext))
}

测试一下


太棒了,所以现在我们已经完成了解密.go 程序的编写,我们可以尝试一下。

$ go run decrypt.go
Decryption Program v0.01
My Super Secret Code Stuff


从输出中可以看出,我们已经能够成功读取 myfile.data 文件的加密内容,然后使用我们的共享密钥对其进行解密。

挑战 - 加密文件系统


如果您对挑战感兴趣,测试您在本教程中学到的内容的一种很酷的方法是尝试扩展我们在上面创建的现有程序,以使用密码加密和解密提供给它的任何文件。

您可以将其转换为接受标志和文件路径作为输入并以加密形式将它们输出到您当前位置的 CLI。


结论


因此,在本教程中,我们成功地介绍了一些很酷的概念,例如对称加密算法,以及如何使用高级加密标准和密钥来加密和解密信息。

我写这篇文章很开心,希望你喜欢它!如果你这样做了,或者如果你有任何反馈,那么我很乐意在下面的评论部分听到它!

文章链接