英文:
Go: XORKeyStream(): runtime error: invalid memory address or nil pointer dereference
问题
当我尝试运行以下代码时(我试图使用CFB模式的AES加密字符串的字节数组表示),我在sEnc.XORKeyStream(msgB, msgB)这一行上得到一个无效的内存地址或空指针解引用错误。文档说XORKeyStream的源和目标可以是同一个字节数组(也尝试过使用单独的目标,但没有成功),但我无法弄清楚是什么导致了这个错误。我正在使用最新版本的Go App Engine SDK在OS X Lion上。
由于在这一点上我仍然在尝试简单地加密一些东西,所以我只是生成一个随机密钥,暂时不打算存储它。
func generateKey(w http.ResponseWriter, r *http.Request) {
key := make([]byte, 32)
n, err := rand.Read(key)
err = err
if(err != nil) {
fmt.Fprint(w, err)
return
}
if(n != 32) {
fmt.Fprint(w, "Not enough bytes read.")
return
}
c, err := aes.NewCipher(key)
if(err != nil) {
fmt.Fprint(w, err)
}
iv := make([]byte, 32)
n, err = rand.Read(iv)
err = err
if(err != nil) {
fmt.Fprint(w, err)
return
}
if(n != 32) {
fmt.Fprint(w, "Not enough bytes read.")
return
}
sEnc := cipher.NewCFBEncrypter(c, iv)
msg := "text to be encrypted"
msgR := strings.NewReader(msg)
msgB := make([]byte, msgR.Len())
n, err = msgR.Read(msgB)
if(err != nil) {
fmt.Fprint(w, err)
return
}
if(n == 0) {
fmt.Fprint(w, "No bytes read.")
return
}
fmt.Fprint(w, msgB)
fmt.Fprint(w, "<br>")
sEnc.XORKeyStream(msgB, msgB)
fmt.Fprint(w, msgB)
}
错误信息:
> 2011/08/15 15:15:58 http: panic serving : runtime error: invalid
> memory address or nil pointer dereference runtime.panic
> /private/tmp/appengine/google_appengine/goroot/src/pkg/runtime/proc.c:1041
> runtime.panicstring
> /private/tmp/appengine/google_appengine/goroot/src/pkg/runtime/runtime.c:116
> runtime.sigpanic
> /private/tmp/appengine/google_appengine/goroot/src/pkg/runtime/darwin/thread.c:470
> server.generateKey server/server.go:66 http.HandlerFunc·ServeHTTP
> /private/tmp/appengine/google_appengine/goroot/src/pkg/http/server.go:589
> http.*ServeMux·ServeHTTP
> /private/tmp/appengine/google_appengine/goroot/src/pkg/http/server.go:790
> appengine_internal.handleFilteredHTTP
> /private/tmp/appengine/google_appengine/goroot/src/pkg/appengine_sdk/go_appengine_sdk/appengine_internal/api_dev.go:58
> http.HandlerFunc·ServeHTTP
> /private/tmp/appengine/google_appengine/goroot/src/pkg/http/server.go:589
> http.*conn·serve
> /private/tmp/appengine/google_appengine/goroot/src/pkg/http/server.go:555
> runtime.goexit
> /private/tmp/appengine/google_appengine/goroot/src/pkg/runtime/proc.c:178
> INFO 2011-08-15 15:15:58,310 dev_appserver.py:4248] "GET
> /genkey/aes256 HTTP/1.1" 500 -
我已经将其余的代码发布到paste bin,但只是包含/初始化函数,没有什么特别有趣的内容。
英文:
When I try to run the following code (I'm trying to encrypt the byte array representation of a string, using AES in CFB mode) I get an invalid memory address or nil pointer dereference error, on the line sEnc.XORKeyStream(msgB, msgB). The documentation says the source and destination for XORKeyStream can be the same byte array (also tried using a separate destination, but no dice), but I can't figure out what's causing the error. I'm using the latest version of the Go App Engine SDK on OS X Lion.
Since at this point I'm still trying to get the code to simply encrypt something, I'm just generating a random key and not bothering to store it yet.
func generateKey(w http.ResponseWriter, r *http.Request) {
key := make([]byte, 32)
n, err := rand.Read(key)
err = err
if(err != nil) {
fmt.Fprint(w, err)
return
}
if(n != 32) {
fmt.Fprint(w, "Not enough bytes read.")
return
}
c, err := aes.NewCipher(key)
if(err != nil) {
fmt.Fprint(w, err)
}
iv := make([]byte, 32)
n, err = rand.Read(iv)
err = err
if(err != nil) {
fmt.Fprint(w, err)
return
}
if(n != 32) {
fmt.Fprint(w, "Not enough bytes read.")
return
}
sEnc := cipher.NewCFBEncrypter(c, iv)
msg := "text to be encrypted"
msgR := strings.NewReader(msg)
msgB := make([]byte, msgR.Len())
n, err = msgR.Read(msgB)
if(err != nil) {
fmt.Fprint(w, err)
return
}
if(n == 0) {
fmt.Fprint(w, "No bytes read.")
return
}
fmt.Fprint(w, msgB)
fmt.Fprint(w, "<br>")
sEnc.XORKeyStream(msgB, msgB)
fmt.Fprint(w, msgB)
}
The error messages:
> 2011/08/15 15:15:58 http: panic serving : runtime error: invalid
> memory address or nil pointer dereference runtime.panic
> /private/tmp/appengine/google_appengine/goroot/src/pkg/runtime/proc.c:1041
> runtime.panicstring
> /private/tmp/appengine/google_appengine/goroot/src/pkg/runtime/runtime.c:116
> runtime.sigpanic
> /private/tmp/appengine/google_appengine/goroot/src/pkg/runtime/darwin/thread.c:470
> server.generateKey server/server.go:66 http.HandlerFunc·ServeHTTP
> /private/tmp/appengine/google_appengine/goroot/src/pkg/http/server.go:589
> http.*ServeMux·ServeHTTP
> /private/tmp/appengine/google_appengine/goroot/src/pkg/http/server.go:790
> appengine_internal.handleFilteredHTTP
> /private/tmp/appengine/google_appengine/goroot/src/pkg/appengine_sdk/go_appengine_sdk/appengine_internal/api_dev.go:58
> http.HandlerFunc·ServeHTTP
> /private/tmp/appengine/google_appengine/goroot/src/pkg/http/server.go:589
> http.*conn·serve
> /private/tmp/appengine/google_appengine/goroot/src/pkg/http/server.go:555
> runtime.goexit
> /private/tmp/appengine/google_appengine/goroot/src/pkg/runtime/proc.c:178
> INFO 2011-08-15 15:15:58,310 dev_appserver.py:4248] "GET
> /genkey/aes256 HTTP/1.1" 500 -
I've posted the rest of the code to paste bin, but it's just the includes/init function, nothing all that interesting.
答案1
得分: 3
sEnc
是由于错误而为nil
。对于cipher.NewCFBEncrypter
,"iv的长度必须与块的长度相同"。AES块大小是128位或16字节吗?例如,
iv := make([]byte, c.BlockSize())
英文:
sEnc
is nil
as a result of an error. For cipher.NewCFBEncrypter
, "the iv must be the same length as the Block's block." The AES block size is 128 bits or 16 bytes? For example,
iv := make([]byte, c.BlockSize())
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论