2016-01-15 4 views
-3

Я использую класс для шифрования/дешифрования строк в PHP.Mcrypt from PHP to Go

Как я могу зашифровать/расшифровать строки в Go?

PHP-класс:

class Crypto { 
    private $encryptKey = 'xxxxxxxxxxxxxxxx'; 
    private $iv = 'xxxxxxxxxxxxxxxx'; 
    private $blocksize = 16; 
    public function decrypt($data) 
    { 
     return $this->unpad(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, 
      $this->encryptKey, 
      hex2bin($data), 
      MCRYPT_MODE_CBC, $this->iv), $this->blocksize); 
    } 
    public function encrypt($data) 
    { 
     //don't use default php padding which is '\0' 
     $pad = $this->blocksize - (strlen($data) % $this->blocksize); 
     $data = $data . str_repeat(chr($pad), $pad); 
     return bin2hex(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, 
      $this->encryptKey, 
      $data, MCRYPT_MODE_CBC, $this->iv)); 
    } 
    private function unpad($str, $blocksize) 
    { 
     $len = strlen($str); 
     $pad = ord($str[$len - 1]); 
     if ($pad && $pad <= $blocksize) { 
      if (substr($str, -$pad) === str_repeat(chr($pad), $pad)) { 
       return substr($str, 0, $len - $pad); 
      } 
     } 
     return $str; 
    } 
} 

Что, чтобы иметь возможность шифрования/дешифрования ту же строку в обоих PHP и Go.

ответ

0

Вот пример:

package main 

import (
    "crypto/aes" 
    "crypto/cipher" 
    "crypto/rand" 
    "encoding/base64" 
    "errors" 
    "fmt" 
    "io" 
    "log" 
) 

func main() { 
    key := []byte("xxxxxxxxxxxxxxxx") // 32 bytes 
    plaintext := []byte("TEST") 
    fmt.Printf("%s\n", plaintext) 
    ciphertext, err := encrypt(key, plaintext) 
    if err != nil { 
     log.Fatal(err) 
    } 
    fmt.Printf("%0x\n", ciphertext) 
    result, err := decrypt(key, ciphertext) 
    if err != nil { 
     log.Fatal(err) 
    } 
    fmt.Printf("%s\n", result) 
} 

func encrypt(key, text []byte) ([]byte, error) { 
    block, err := aes.NewCipher(key) 
    if err != nil { 
     return nil, err 
    } 
    b := base64.StdEncoding.EncodeToString(text) 
    ciphertext := make([]byte, aes.BlockSize+len(b)) 
    iv := ciphertext[:aes.BlockSize] 
    if _, err := io.ReadFull(rand.Reader, iv); err != nil { 
     return nil, err 
    } 
    cfb := cipher.NewCFBEncrypter(block, iv) 
    cfb.XORKeyStream(ciphertext[aes.BlockSize:], []byte(b)) 
    return ciphertext, nil 
} 

func decrypt(key, text []byte) ([]byte, error) { 
    block, err := aes.NewCipher(key) 
    if err != nil { 
     return nil, err 
    } 
    if len(text) < aes.BlockSize { 
     return nil, errors.New("ciphertext too short") 
    } 
    iv := text[:aes.BlockSize] 
    text = text[aes.BlockSize:] 
    cfb := cipher.NewCFBDecrypter(block, iv) 
    cfb.XORKeyStream(text, text) 
    data, err := base64.StdEncoding.DecodeString(string(text)) 
    if err != nil { 
     return nil, err 
    } 
    return data, nil 
} 

В основном заимствованы и адаптировано из: https://golang.org/src/crypto/cipher/example_test.go

// Input => TEST 
// Output => 13360adba03733e11dd2702de441ff8bbb90676ad762fc83 

UPDATE

Чтобы использовать строку в качестве параметра для decode функции, вам нужно для преобразования строки в byte с использованием hex.Decodestring

data, _ := hex.DecodeString("1d6f12d3aa2353b23c6012dbc85816632129363d58a76063") 
result, err := decrypt(key, data) 
if err != nil { 
    log.Fatal(err) 
} 
fmt.Printf("%s\n", result) 

Не забудьте включить "encoding/hex" в список упаковок.

+0

Как я могу передать расшифровку func строку? Im получение 'незаконных данных base64 на входном байте 0' – mjhd

+0

По-прежнему получение' незаконных данных base64 на входном байте 0' не совсем уверен, что я делаю неправильно – mjhd

+0

Пожалуйста, измените раздел афферентного кода с обновленным. Вы больше не должны получать эту ошибку. –