Go: XORKeyStream (): ошибка времени выполнения: неверный адрес памяти или разыменование нулевого указателя - PullRequest
2 голосов
/ 15 августа 2011

Когда я пытаюсь запустить следующий код (я пытаюсь зашифровать представление байтового массива строки, используя AES в режиме CFB), я получаю неверный адрес памяти или ошибку разыменования нулевого указателя , в строке 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: паническая служба: ошибка во время выполнения: недействительно адрес памяти или разыменование нулевого указателя 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. * сопп · служить /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 ИНФОРМАЦИЯ 2011-08-15 15: 15: 58,310 dev_appserver.py:4248] "GET / genkey / aes256 HTTP / 1.1 "500 -

Я отправил остальной код для вставки bin, но это просто функция include / init, ничего интересного.

1 Ответ

3 голосов
/ 15 августа 2011

sEnc равно nil в результате ошибки. Для cipher.NewCFBEncrypter «iv должно быть такой же длины, что и блок блока». Размер блока AES составляет 128 бит или 16 байтов? Например,

iv := make([]byte, c.BlockSize())
...