如何使用crypto/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]

不能使用相同的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

package main
import (
"crypto/rc4"
"flag"
"fmt"
"io"
"log"
"os"
)
var (
key    = flag.String("k", "", "128-bit key to Encrypt/Decrypt.")
)
func main() {
flag.Parse()
if len(os.Args) < 2 || *key == "" {
fmt.Println("Usage of", os.Args[0]+":")
flag.PrintDefaults()
os.Exit(1)
}
var err error
ciph, _ := rc4.NewCipher([]byte(*key))
buf := make([]byte, 64*1<<10)
var n int
for {
n, err = os.Stdin.Read(buf)
if err != nil && err != io.EOF {
log.Fatal(err)
}
ciph.XORKeyStream(buf[:n], buf[:n])
if _, err := os.Stdout.Write(buf[:n]); err != nil {
log.Fatal(err)
}
if err == io.EOF {
break
}
}
os.Exit(0)
}

理论上兼容OpenSSL*

不要使用RC4作为加密算法,只需获取函数即可。坏了。祝你好运

最新更新