2017-01-10 5 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

예! 감사! 나는 메인에서 한 줄을 바꿨다. 'fmt.Println (string (cryptoText))'를'fmt.Println (base64.URLEncoding.EncodeToString (cryptoText))'으로 변경했습니다. –

+0

이 패딩/패딩 코드를 사용하는 것이 더 좋습니다 : https://github.com/go-web/tokenizer/blob/master/pkcs7.go –