为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用加密/rc4

如何使用加密/rc4

Go
手掌心 2022-06-27 11:07:21
我正在尝试使用 RC4 加密/解密 Go 中的一些数据。我发现 Go 在 crypto/rc4 包中提供了 rc4 算法。我尝试使用包加密/解密数据,但密文和解密的明文不是我所期望的。我与类似这样的 RC4 在线工具进行了比较,但我确信 Go 的 rc4 包有一些问题。因为在我用 Go rc4 加密明文并解密密文后,解密的明文'不是我加密的。我应该找到其他图书馆吗?我运行的代码是这样的。package mainimport (    "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]
查看完整描述

1 回答

?
繁华开满天机

TA贡献1816条经验 获得超4个赞

您不能使用相同的 RC4 密码来加密然后解密,因为它具有内部状态。


构造一个具有相同密钥的新密码来解密:


// ENCRYPT

c, 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)


// DECRYPT

c2, 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.


查看完整回答
反对 回复 2022-06-27
  • 1 回答
  • 0 关注
  • 141 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信