2017-01-10 21 views
0

В настоящее время пытается выяснить, почему мой метод дешифрования не работает. Я использовал DES, CBC и PKCS7Padding для шифрования моей строки. Мой текущий code выходов panic: crypto/cipher: input not full blocks при расшифровке.Golang: Как дешифровать с помощью DES, CBC и PKCS7?

+0

1. Не используйте DES, он не защищен и заменен AES, но не более сложным в использовании. 2. Используйте случайный IV, просто префикс theIV для зашифрованных данных для использования при расшифровке (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

yep! Благодаря! Я просто изменил одну строку в основном. Я изменил 'fmt.Println (string (cryptoText))' to 'fmt.Println (base64.URLEncoding.EncodeToString (cryptoText))'. –

+0

Лучше использовать этот код дополнений/дополнений: https://github.com/go-web/tokenizer/blob/master/pkcs7.go –

 Смежные вопросы

  • Нет связанных вопросов^_^