2017-01-10 15 views
0

現在、私の解読方法がなぜ機能していないのか理解しようとしています。 DES、CBC、PKCS7Paddingを使用して文字列を暗号化しました。私の現在のcodeは、復号中にpanic: crypto/cipher: input not full blocksを出力します。Golang:DES、CBC、およびPKCS7でどのように復号化しますか?

+0

1. DESを使用しないでください。安全ではなく、AESによって置き換えられました。使用するのが難しくありません。 2.無作為なIVを使用して、暗号化されたデータにIVを接頭辞として付加して復号化に使用します(IVは秘密にする必要はありません)。複数のメッセージに同じ暗号化キーを使用する場合は、別のIVを使用することが重要です。 3.暗号化のポイントが一般的にセキュリティを作成することを検討し、不適切に使用される暗号化は安全を提供しません。 – zaph

+1

12文字の暗号化された文字列を復号化し、一意のキーと一意のIVを指定することは明確ではありません。解読には、暗号化に使用されたものと同じキーとIVを使用する必要があります。問題はより明確になり、あなたが達成しようとしていることに関する正確な情報を提供することができます。 – zaph

+0

デコード時にbase64をデコードしていないので、データサイズが間違っています。 – JimB

答えて

2

バディーそれは完全にいい仕事です。

package main 

    import (
     "bytes" 
     "crypto/des" 
     "crypto/cipher" 
     "fmt" 
    ) 

    func DesEncryption(key, iv, plainText []byte) ([]byte, error) { 

     block, err := des.NewCipher(key) 

     if err != nil { 
      return nil, err 
     } 

     blockSize := block.BlockSize() 
     origData := PKCS5Padding(plainText, blockSize) 
     blockMode := cipher.NewCBCEncrypter(block, iv) 
     cryted := make([]byte, len(origData)) 
     blockMode.CryptBlocks(cryted, origData) 
     return cryted, nil 
    } 

    func DesDecryption(key, iv, cipherText []byte) ([]byte, error) { 

     block, err := des.NewCipher(key) 

     if err != nil { 
      return nil, err 
     } 

     blockMode := cipher.NewCBCDecrypter(block, iv) 
     origData := make([]byte, len(cipherText)) 
     blockMode.CryptBlocks(origData, cipherText) 
     origData = PKCS5UnPadding(origData) 
     return origData, nil 
    } 

    func PKCS5Padding(src []byte, blockSize int) []byte { 
     padding := blockSize - len(src)%blockSize 
     padtext := bytes.Repeat([]byte{byte(padding)}, padding) 
     return append(src, padtext...) 
    } 

    func PKCS5UnPadding(src []byte) []byte { 
     length := len(src) 
     unpadding := int(src[length-1]) 
     return src[:(length - unpadding)] 
    } 


    func main() { 
     originalText := "sysys" 
     fmt.Println(originalText) 
     mytext := []byte(originalText) 

     key := []byte{0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC } 
     iv := []byte{0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC } 


     cryptoText,_ := DesEncryption(key, iv, mytext) 
     fmt.Println(string(cryptoText)) 
     decryptedText,_ := DesDecryption(key, iv, cryptoText) 
     fmt.Println(string(decryptedText)) 

    } 
+0

うん!ありがとう!私はメインの1行を変更しました。私は 'fmt.Println(string(cryptoText))'を 'fmt.Println(base64.URLEncoding.EncodeToString(cryptoText))'に変更しました。 –

+0

このパディング/アンディッドコードを使用する方が良いです:https://github.com/go-web/tokenizer/blob/master/pkcs7.go –

関連する問題