如何使用加密/rc4

Pol*_*l4b 0 encryption go rc4-cipher

我正在尝试使用 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)
}
Run Code Online (Sandbox Code Playgroud)

输出是这样的

Plaintext:  [97 115 100 115 97 100]
Ciphertext:  [98 41 227 117 93 79]
Plaintext':  [111 154 128 112 250 88]
Run Code Online (Sandbox Code Playgroud)

icz*_*cza 5

您不能使用相同的 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)
Run Code Online (Sandbox Code Playgroud)

这将输出(在Go Playground上尝试):

Plaintext:  [97 115 100 115 97 100]
Ciphertext:  [98 41 227 117 93 79]
Plaintext':  [97 115 100 115 97 100]
Run Code Online (Sandbox Code Playgroud)

但正如包文档所述:

RC4 密码已损坏,不应用于安全应用程序。

因此,请使用另一种更安全的算法,例如crypto/aes.