通过go语言进行加密,可利用php openssl扩展进行解密。
package encrypt import ( "bytes" "crypto/aes" "crypto/cipher" "encoding/base64" "fmt" ) type ecb struct { b cipher.Block blockSize int } func newECB(b cipher.Block) *ecb { return &ecb{ b: b, blockSize: b.BlockSize(), } } type ecbEncrypter ecb // NewECBEncrypter returns a BlockMode which encrypts in electronic code book // mode, using the given Block. func NewECBEncrypter(b cipher.Block) cipher.BlockMode { return (*ecbEncrypter)(newECB(b)) } func (x *ecbEncrypter) BlockSize() int { return x.blockSize } func (x *ecbEncrypter) CryptBlocks(dst, src []byte) { if len(src)%x.blockSize != 0 { panic("crypto/cipher: input not full blocks") } if len(dst) < len(src) { panic("crypto/cipher: output smaller than input") } for len(src) > 0 { x.b.Encrypt(dst, src[:x.blockSize]) src = src[x.blockSize:] dst = dst[x.blockSize:] } } type ecbDecrypter ecb // NewECBDecrypter returns a BlockMode which decrypts in electronic code book // mode, using the given Block. func NewECBDecrypter(b cipher.Block) cipher.BlockMode { return (*ecbDecrypter)(newECB(b)) } func (x *ecbDecrypter) BlockSize() int { return x.blockSize } func (x *ecbDecrypter) CryptBlocks(dst, src []byte) { if len(src)%x.blockSize != 0 { panic("crypto/cipher: input not full blocks") } if len(dst) < len(src) { panic("crypto/cipher: output smaller than input") } for len(src) > 0 { x.b.Decrypt(dst, src[:x.blockSize]) src = src[x.blockSize:] dst = dst[x.blockSize:] } } func encodeBase64(b []byte) string { return base64.StdEncoding.EncodeToString(b) } func decodeBase64(s string) []byte { data, err := base64.StdEncoding.DecodeString(s) if err != nil { panic(err) } return data } func PKCS5Padding(ciphertext []byte, blockSize int) []byte { padding := blockSize - len(ciphertext)%blockSize padtext := bytes.Repeat([]byte{byte(padding)}, padding) return append(ciphertext, padtext...) } func PKCS5UnPadding(origData []byte) []byte { length := len(origData) // 去掉最后一个字节 unpadding 次 unpadding := int(origData[length-1]) return origData[:(length - unpadding)] } func EncryptECB(src string, hexKey string) string { var hasError = false block, err := aes.NewCipher([]byte(hexKey)) if err != nil { fmt.Println("key error") hasError = true } if src == "" { fmt.Println("plain content empty") hasError = true } if hasError { return "" } ecbn := NewECBEncrypter(block) content := []byte(src) content = PKCS5Padding(content, block.BlockSize()) crypted := make([]byte, len(content)) ecbn.CryptBlocks(crypted, content) return base64.StdEncoding.EncodeToString(crypted) } func DecryptECB(src string, hexKey string) string { var hasError = false block, err := aes.NewCipher([]byte(hexKey)) if err != nil { fmt.Println("key error") hasError = true } if src == "" { fmt.Println("plain content empty") hasError = true } if hasError { return "" } ecbn := NewECBDecrypter(block) content := decodeBase64(src) //fmt.Println(content) //content = PKCS5Padding(content, block.BlockSize()) crypted := make([]byte, len(content)) ecbn.CryptBlocks(crypted, content) return string(PKCS5UnPadding(crypted)) }