2017-06-12 73 views
-3

我像這樣在Node.js中加密了一個字符串。如何解密在nodejs中加密的golang中的AES256位密碼?

var cipher = crypto.createCipheriv(
"aes256", 
"<A Buffer of length 32>", 
"79b67e539e7fcaefa7abf167de5c06ed" 
); 

我注意到nodejs中的一個緩衝區就像是十六進制,但每連續2個字符都是成對的。所以,如果我將它轉換爲十六進制,它的長度是一半。

實施例:

緩衝液:

<Buffer c3 80 36 f6 51 57 cb 6d b0 e8 fd 85 5a a2 8a da 07 4b e7 19 17 d1 c8 ee dc 2a e4 d8 5e 3c 9d a6> 

己烷:現在

c38036f65157cb6db0e8fd855aa28ada074be71917d1c8eedc2ae4d85e3c9da6 

,我在AES256使用中的密鑰不能是長度爲64以下的,緩衝器的長度是32和十六進制的長度是64.

我想解密這個密碼在golang中,我將不得不使用這個密鑰和iv t o解密它。

golang中的aes取決於密鑰的大小,當它看到一個長度爲64的密鑰時,會引發一個錯誤,說明Invalid key length

如何在golang中解密它?還有就是我目前的方案中去:https://play.golang.org/p/SoXOz3XIPK

package main 

import (
    "crypto/aes" 
    "crypto/cipher" 
    "fmt" 
    "log" 
) 

func main() { 

    encKey := "c38036f65157cb6db0e8fd855aa28ada074be71917d1c8eedc2ae4d85e3c9da6" 
    iv := "79b67e539e7fcaefa7abf167de5c06ed" 
    cipherText := "c02eccfc514a0b7fae830586dd56e0fcebb81fc49f41fa6dedf099c3645793bef7ec7075eca30063f9c0ef395d5ee2d44e4f3490114280abb7cf86d6eb525e2ec9bd2b781388986480f8b3df95f7b10e" 

    block, err := aes.NewCipher([]byte(encKey)) 
    if err != nil { 
     log.Fatalf("%s", err) 
    } 

    decrypter := cipher.NewCFBDecrypter(block, []byte(iv)) 

    decrypted := make([]byte, 1000) 
    decrypter.XORKeyStream(decrypted, []byte(cipherText)) 

    fmt.Printf("%s\n", string(decrypted)) 

} 
+0

這是如何 「緩衝」 節點和去之間共享? – GPX

+0

@GPX不是。 cookie在nodejs中是這樣加密的,我需要在golang中解密它,這樣我才能讀取存儲在它中的數據。 –

+0

Cookie的值本質上是一個字符串。它的長度是多少? – GPX

回答

3

我解決了這個問題,幫助從@osgx

這些都是我需要改變,以正確解密的東西。

  1. 解碼我使用的所有十六進制字符串。

  2. 我檢查了nodejs文檔,密碼方法/算法使用與openssl類似的命名方案。所以,我跑這個命令openssl list-cipher-algorithms | grep "AES256",我得到了這樣的輸出,AES256 => AES-256-CBC這意味着,如果我在nodejs中使用aes256,它將真的在做aes-256-cbc。然後我檢查了我的golang代碼,並且使用aes-256-cfb這是錯誤的。所以,我改變了這個,並使用了一個cbc解密器。

更改這兩個東西給出了正確的結果。

非常感謝你的幫助@osgx。

我更新的代碼是:

package main 

import (
    "crypto/aes" 
    "crypto/cipher" 
    "encoding/hex" 
    "fmt" 

) 

func main() { 

    encKey := "c38036f65157cb6db0e8fd855aa28ada074be71917d1c8eedc2ae4d85e3c9da6" 
    iv := "79b67e539e7fcaefa7abf167de5c06ed" 
    cipherText := "c02eccfc514a0b7fae830586dd56e0fcebb81fc49f41fa6dedf099c3645793bef7ec7075eca30063f9c0ef395d5ee2d44e4f3490114280abb7cf86d6eb525e2ec9bd2b781388986480f8b3df95f7b10e" 

    encKeyDecoded, err := hex.DecodeString(encKey) 
    if err != nil { 
     panic(err) 
    } 
    cipherTextDecoded, err := hex.DecodeString(cipherText) 
    if err != nil { 
     panic(err) 
    } 
    ivDecoded, err := hex.DecodeString(iv) 
    if err != nil { 
     panic(err) 
    } 
    block, err := aes.NewCipher([]byte(encKeyDecoded)) 
    if err != nil { 
     panic(err) 
    } 

    mode := cipher.NewCBCDecrypter(block, []byte(ivDecoded)) 

    mode.CryptBlocks([]byte(cipherTextDecoded), []byte(cipherTextDecoded)) 

    fmt.Println(string(cipherTextDecoded)) 
} 

https://play.golang.org/p/Zv24WoKtBY

+0

什麼是您的節點js等效代碼?我面臨着類似的問題。您可以請分享您的節點js代碼以及加密文本 – hatellla

+0

@hatellla Cookie使用[client-sessions](https://npm.im/client-sessions)npm模塊加密。所有的論點都與他們的「基本用法」例子類似。 –