首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用密码/Rc4

如何使用密码/Rc4
EN

Stack Overflow用户
提问于 2020-08-25 12:06:53
回答 2查看 1.4K关注 0票数 2

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

我与RC4在线工具进行了比较,比如,但我确信Go的rc4包存在一些问题。因为在我用Go加密纯文本和解密密文之后,解密的明文不是我加密的。我应该找别的图书馆吗?

我运行的代码是。

代码语言:javascript
复制
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)
}

输出是这样

代码语言:javascript
复制
Plaintext:  [97 115 100 115 97 100]
Ciphertext:  [98 41 227 117 93 79]
Plaintext':  [111 154 128 112 250 88]
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-08-25 12:16:19

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

使用相同的密钥来构造一个新的密码来解密:

代码语言:javascript
复制
// 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)

这将输出(在围棋游乐场上尝试它):

代码语言:javascript
复制
Plaintext:  [97 115 100 115 97 100]
Ciphertext:  [98 41 227 117 93 79]
Plaintext':  [97 115 100 115 97 100]

但正如包文档所说:

RC4密码中断,不应用于安全应用程序。

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

票数 7
EN

Stack Overflow用户

发布于 2022-11-06 22:08:50

代码语言:javascript
复制
package main

import (
    "crypto/rand"
    "crypto/rc4"
    "crypto/sha256"
    "encoding/hex"
    "flag"
    "fmt"
    "golang.org/x/crypto/pbkdf2"
    "io"
    "log"
    "os"
)

var derive = flag.Bool("d", false, "Derive password-based key.")
var iter = flag.Int("i", 1024, "Iterations. (for PBKDF2)")
var key = flag.String("k", "", "128-bit key to Encrypt/Decrypt.")
var pbkdf = flag.String("p", "", "PBKDF2.")
var random = flag.Bool("r", false, "Generate random 128-bit cryptographic key.")
var salt = flag.String("s", "", "Salt. (for PBKDF2)")

func main() {
    flag.Parse()

    if len(os.Args) < 2 {
        fmt.Println("Usage of", os.Args[0]+":")
        flag.PrintDefaults()
        os.Exit(1)
    }

    if *derive == true {
        prvRaw := pbkdf2.Key([]byte(*pbkdf), []byte(*salt), *iter, 16, sha256.New)
        fmt.Println(hex.EncodeToString(prvRaw))
        os.Exit(1)
    }

    if *random == true {
        var key []byte
        var err error
        key = make([]byte, 16)
        _, err = io.ReadFull(rand.Reader, key)
        if err != nil {
            log.Fatal(err)
        }
        fmt.Println(hex.EncodeToString(key))
        os.Exit(0)
    }

    var keyHex string
    var prvRaw []byte
    if *pbkdf != "" {
        prvRaw = pbkdf2.Key([]byte(*pbkdf), []byte(*salt), *iter, 16, sha256.New)
        keyHex = hex.EncodeToString(prvRaw)
    } else {
        keyHex = *key
    }
    var key []byte
    var err error
    if keyHex == "" {
        key = make([]byte, 16)
        _, err = io.ReadFull(rand.Reader, key)
        if err != nil {
            log.Fatal(err)
        }
        fmt.Fprintln(os.Stderr, "Key=", hex.EncodeToString(key))
    } else {
        key, err = hex.DecodeString(keyHex)
        if err != nil {
            log.Fatal(err)
        }
        if len(key) != 16 {
            log.Fatal(err)
        }
    }
    ciph, _ := rc4.NewCipher(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作为加密算法,只使用观察者。都坏了。祝好运!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63578512

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档