您好,匿名用户
随意问技术百科期待您的加入

golang rc4 结果不正确...

0 投票

golang rc4 结果不正确.

package main

import (
	"crypto/rc4"
	"fmt"
)

func main() {
	rc, err := rc4.NewCipher([]byte("5813aecc-0d05-497e-aafa-3111610cf44c"))

	if err != nil {
		panic(err)
	}
    
	src := []byte("hello world")
	fmt.Println(src)

	rc.XORKeyStream(src, src)
	fmt.Println(src)

	rc.XORKeyStream(src, src)
	fmt.Println(src)
}

输出:

[104 101 108 108 111 32 119 111 114 108 100]
[216 36 143 56 20 50 169 207 31 252 154]
[0 32 70 107 105 65 236 28 246 248 21]
用户头像 提问 2013年 11月11日 @ Hera 上等兵 (249 威望)
分享到:

1个回答

0 投票
 
最佳答案

看了下NewCipher

// NewCipher creates and returns a new Cipher.  The key argument should be the
// RC4 key, at least 1 byte and at most 256 bytes.
func NewCipher(key []byte) (*Cipher, error) {
	k := len(key)
	if k < 1 || k > 256 {
		return nil, KeySizeError(k)
	}
	var c Cipher
	for i := 0; i < 256; i++ {
		c.s[i] = uint8(i)
	}
	var j uint8 = 0
	for i := 0; i < 256; i++ {
		j += c.s[i] + key[i%k]
		c.s[i], c.s[j] = c.s[j], c.s[i]
	}
	return &c, nil
}

XORKeyStream

// XORKeyStream sets dst to the result of XORing src with the key stream.
// Dst and src may be the same slice but otherwise should not overlap.
func (c *Cipher) XORKeyStream(dst, src []byte) {
    for i := range src {
    	c.i += 1
    	c.j += c.s[c.i]
    	c.s[c.i], c.s[c.j] = c.s[c.j], c.s[c.i]
    	dst[i] = src[i] ^ c.s[c.s[c.i]+c.s[c.j]]
    }
}

这里并不是简单的异或运算,所以执行两次以后不会有xor运算的性质

用户头像 回复 2013年 11月11日 @ Caitlyn 上等兵 (452 威望)
选中 2013年 9月7日 @Hera
提一个问题:

相关问题

0 投票
1 回复 68 阅读
用户头像 提问 2013年 9月11日 @ Hermes 列兵 (61 威望)
0 投票
1 回复 25 阅读
用户头像 提问 2013年 12月29日 @ Kyrie 上等兵 (240 威望)
+3 投票
1 回复 249 阅读
用户头像 提问 2012年 12月27日 @ 苏尐沫 上等兵 (212 威望)
0 投票
1 回复 61 阅读
用户头像 提问 2012年 12月1日 @ Riven 上等兵 (334 威望)
0 投票
1 回复 83 阅读

欢迎来到随意问技术百科, 这是一个面向专业开发者的IT问答网站,提供途径助开发者查找IT技术方案,解决程序bug和网站运维难题等。
温馨提示:本网站禁止用户发布与IT技术无关的、粗浅的、毫无意义的或者违法国家法规的等不合理内容,谢谢支持。

欢迎访问随意问技术百科,为了给您提供更好的服务,请及时反馈您的意见。
...