2017-03-29 12 views
1

CryptoJSは、Goは

ciphertext := "Zff9c+F3gZu/lsARvPhpMau50KUkMAie4j8MYfb12HMWhkLqZreTk8RPbtRB7RDG3QFw7Y0FXJsCq/EBEAz//XoeSZmqZXoyq2Cx8ZV+/Rw=" 
decodedText, _ := base64.StdEncoding.DecodeString(ciphertext) 
decodedIv, _ := base64.StdEncoding.DecodeString("u9CV7oR2w+IIk8R0hppxaw==") 
newCipher, _ := aes.NewCipher([]byte("~NB8CcOL#J!H?|Yr")) 
cfbdec := cipher.NewCBCDecrypter(newCipher, decodedIv) 
cfbdec.CryptBlocks(decodedText, decodedText) 
data, _ := base64.StdEncoding.DecodeString(string(decodedText)) 
println(string(data)) 

出力は{"data":{"value":300}, "SEQN":700 , "msg":"IT WORKS!!"

は、それが次CryptoJS

function encrypt(message, key) { 
    let keyHex = CryptoJS.enc.Hex.parse(parseToHex(key)) 
    let iv = CryptoJS.lib.WordArray.random(128/8); 
    let wordArray = CryptoJS.enc.Utf8.parse(message); 
    let base64 = CryptoJS.enc.Base64.stringify(wordArray); 
    let encrypted = CryptoJS.AES.encrypt(base64, keyHex, { iv: iv }); 
    return { 
    cipher: encrypted.ciphertext.toString(CryptoJS.enc.Base64), 
    iv: CryptoJS.enc.Base64.stringify(iv), 
    length: base64.length, 
    size: encrypted.ciphertext.sigBytes, 
    } 
} 

で暗号化だと

function decrypt(message, key, iv) { 
    let ivEX = CryptoJS.enc.Hex.parse(decodeToHex(iv)); 
    let keyEX = CryptoJS.enc.Hex.parse(parseToHex(key)); 
    let bytes = CryptoJS.AES.decrypt(message, keyEX , { iv: ivEX}); 
    let plaintext = bytes.toString(CryptoJS.enc.Base64); 
    return decodeToString(decodeToString(plaintext)); 
} 
で復号化することができ、次のGoコードでいるI解読暗号化

出力は{"data":{"value":300}, "SEQN":700 , "msg":"IT WORKS!!" }です - これは正しい出力です

なぜ出力が異なっていますか?

+1

ちょうど終わりの '}'がないか、何か見ていませんか? – RayfenWindspear

+0

スペースと}、2文字 –

+0

変数名 'decryptedText'と' decryptedIV'は正確ではなく、混乱します。それらはデコードされたBase64であり、実際には暗号化されたデータとIVです。復号化が暗号化されたデータと同じバッファになければ、デバッグするのも簡単です。 – zaph

答えて

2

ご迷惑をおかけください。 ALWAYS

illegal base64 data at input byte 75

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

より具体的には、バイト75の値は、base64で使用可能な文字の範囲外である、5あります。アスキーではENQ(照会)文字です。なぜこれがあなたの最終的なbase64の文字列で終わるのかに関しては、私より先です。

EDIT:問題が見つかりました。何らかの理由で、末尾のbase64パディング文字=は、値5を含む5つの連続するバイトとして解読されています。ここに固定されていることを示す遊び場リンクがあります。 https://play.golang.org/p/tf3OZ9XG1M

編集:mattさんのコメントによると、修正機能を更新して、すべてのPKCS7ブロックのパディングを削除し、最後のbase64デコードにRawStdEncodingを使用しました。これは今や妥当な修正となるはずです。

+2

'5'チャンクはPKCS7ブロックのパディングです.GD暗号ライブラリにはパディングコードが含まれていないので、自分自身を解読するときにパディングを暗号化して削除する必要があります。別の問題は、 '= '文字が欠落している場合(例の暗号文の場合)、' StdEncoding' base64デコーダでエラーが発生することです。これは、 '= '文字が常に含まれているか、' RawStdEncoding'を使ってより堅牢になるようにすることで解決できます:https://play.golang.org/p/-XLlPoMHDN – matt

+0

'RawStdEncoding'を試みましたが、ジャンクの文字について私はそれを修正する最良の方法は、すべての '5 'を削除し、' RawStdEncoding'を使うことです。感謝のおかげで@matt – RayfenWindspear

+0

はい、 'RawStdEncoding'は' = '文字が欠落している場合には機能しますが、余分な文字がある場合(後続のパディングバイトなど)はありません。 (ここで_two_の問題があります - 行方不明の '= '文字とブロックパディングは取り除かれません)、両方とも同じエラーが発生します(混乱しています。 – matt

関連する問題