Golang-Aes-Pkcs5-Ascii

var (  
    TEST_API_KEY    = "16进制"
    TEST_COOKIE_STR = "A878946545646541263465142365113253112563124318937189237"
)

func main() {  
    key := hex2bin(TEST_API_KEY)
    //fmt.Println(key)
    origData, err := AesDecrypt(hex2bin(TEST_COOKIE_STR), key)
    if err != nil {
        panic(err.Error())
    }
    fmt.Println(string(origData))
    fmt.Println(origData)
}

func AesDecrypt(crypted, key []byte) ([]byte, error) {  
    block, err := aes.NewCipher(key)
    if err != nil {
        return nil, err
    }
    blockSize := block.BlockSize()
    blockMode := cipher.NewCBCDecrypter(block, key[:blockSize])
    origData := make([]byte, len(crypted))
    // origData := crypted
    blockMode.CryptBlocks(origData, crypted)
    origData = PKCS5UnPadding(origData)
    // origData = ZeroUnPadding(origData)
    return origData, nil
}

func PKCS5UnPadding(origData []byte) []byte {  
    length := len(origData)
    // 去掉最后一个字节 unpadding 次
    unpadding := int(origData[length-1])
    return origData[:(length - unpadding)]
}
//这个ASCII码坑,大于127的
func intToByte(x int64) byte {  
    y := int32(x)
    b_buf := bytes.NewBuffer([]byte{})
    binary.Write(b_buf, binary.BigEndian, y)
    z := b_buf.Bytes()[3] //int32转成byte后是一个4个元素的数组,根据需求这里只取最后一个元素
    return z              //所以传过来的int值不能大于一个十六进制所能表达的最大数,也就是0xFF/255,否则不准确啊
}

//16进制转ASCII码
func hex2bin(hexdata string) []byte {  
    lenght := len(hexdata)
    bindata := []byte{}
    for i := 0; i < lenght; i += 2 {
        tenBase, _ := strconv.ParseInt(hexdata[i:i+2], 16, 10)
        //fmt.Println(tenBase)
        //fmt.Println(string(tenBase))
        bindata = append(bindata, intToByte(tenBase))
    }

    //fmt.Println(bindata)
    return bindata
}

郝先生

继续阅读此作者的更多文章