如何使用加密/rc4

我正在尝试使用 RC4 加密/解密 Go 中的一些数据。我发现 Go 在 crypto/rc4 包中提供了 rc4 算法。我尝试使用包加密/解密数据,但密文和解密的明文不是我所期望的。


我与类似这样的 RC4 在线工具进行了比较,但我确信 Go 的 rc4 包有一些问题。因为在我用 Go rc4 加密明文并解密密文后,解密的明文'不是我加密的。我应该找到其他图书馆吗?


我运行的代码是这样的。


package main


import (

    "crypto/rc4"

    "fmt"

    "log"

)


func main() {

    c, err := rc4.NewCipher([]byte("dsadsad"))

    if err != nil {

        log.Fatalln(err)

    }

    src := []byte("asdsad")

    dst := make([]byte, len(src))

    fmt.Println("Plaintext: ", src)

    c.XORKeyStream(dst, src)

    c.XORKeyStream(src, dst)

    fmt.Println("Ciphertext: ", dst)

    fmt.Println("Plaintext': ", src)

}

输出是这样的


Plaintext:  [97 115 100 115 97 100]

Ciphertext:  [98 41 227 117 93 79]

Plaintext':  [111 154 128 112 250 88]


手掌心
浏览 142回答 1
1回答

繁华开满天机

您不能使用相同的 RC4 密码来加密然后解密,因为它具有内部状态。构造一个具有相同密钥的新密码来解密:// ENCRYPTc, err := rc4.NewCipher([]byte("dsadsad"))if err != nil {    log.Fatalln(err)}src := []byte("asdsad")fmt.Println("Plaintext: ", src)dst := make([]byte, len(src))c.XORKeyStream(dst, src)fmt.Println("Ciphertext: ", dst)// DECRYPTc2, err := rc4.NewCipher([]byte("dsadsad"))if err != nil {    log.Fatalln(err)}src2 := make([]byte, len(dst))c2.XORKeyStream(src2, dst)fmt.Println("Plaintext': ", src2)这将输出(在Go Playground上尝试):Plaintext:  [97 115 100 115 97 100]Ciphertext:  [98 41 227 117 93 79]Plaintext':  [97 115 100 115 97 100]但正如包文档所述:RC4 已被密码破解,不应用于安全应用程序。因此,请使用另一种更安全的算法,例如crypto/aes.
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go