RSA
//生成RSA私钥和公钥,保存到文件中func GenerateRSAKey(bits int) {//GenerateKey函数使用随机数据生成器random生成一对具有指定字位数的RSA密钥//Reader是一个全局、共享的密码用强随机数生成器privateKey, err := rsa.GenerateKey(rand.Reader, bits)if err != nil {panic(err)}//保存私钥//通过x509标准将得到的ras私钥序列化为ASN.1 的 DER编码字符串X509PrivateKey := x509.MarshalPKCS1PrivateKey(privateKey)//使用pem格式对x509输出的内容进行编码//创建文件保存私钥privateFile, err := os.Create("private.pem")if err != nil {panic(err)}defer privateFile.Close()//构建一个pem.Block结构体对象privateBlock := pem.Block{Type: "RSA Private Key", Bytes: X509PrivateKey}//将数据保存到文件pem.Encode(privateFile, &privateBlock)//保存公钥//获取公钥的数据publicKey := privateKey.PublicKey//X509对公钥编码X509PublicKey, err := x509.MarshalPKIXPublicKey(&publicKey)if err != nil {panic(err)}//pem格式编码//创建用于保存公钥的文件publicFile, err := os.Create("public.pem")if err != nil {panic(err)}defer publicFile.Close()//创建一个pem.Block结构体对象publicBlock := pem.Block{Type: "RSA Public Key", Bytes: X509PublicKey}//保存到文件pem.Encode(publicFile, &publicBlock)}func RsaEncrypt(plainText []byte, path string, encryptSize int) string {//打开文件file, err := os.Open(path)if err != nil {panic(err)}defer file.Close()//读取文件的内容info, _ := file.Stat()buf := make([]byte, info.Size())file.Read(buf)//pem解码block, _ := pem.Decode(buf)//x509解码publicKeyInterface, err := x509.ParsePKIXPublicKey(block.Bytes)if err != nil {panic(err)}//类型断言publicKey := publicKeyInterface.(*rsa.PublicKey)//对明文进行加密,分段加密长度为245个字符(2048/8-11)start := 0isEncrypt := falsecipherTextStr := ""var messageTmp []bytefor k, _ := range plainText {if k%encryptSize == 0 && k != 0 {messageTmp = plainText[start:k]start = kisEncrypt = true} else if k == len(plainText)-1 {messageTmp = plainText[start : k+1]isEncrypt = true}if isEncrypt {isEncrypt = falsecipherText, err := rsa.EncryptPKCS1v15(rand.Reader, publicKey, messageTmp)if err != nil {panic(err)}cipherTextStr += string(cipherText)}}//返回密文return cipherTextStr}//RSA解密func RsaDecrypt(cipherText []byte, path string, decryptSize int) string {//打开文件file, err := os.Open(path)if err != nil {panic(err)}defer file.Close()//获取文件内容info, _ := file.Stat()buf := make([]byte, info.Size())file.Read(buf)//pem解码block, _ := pem.Decode(buf)//X509解码privateKey, err := x509.ParsePKCS1PrivateKey(block.Bytes)if err != nil {panic(err)}//对密文进行解密start := 0isEncrypt := falsecipherTextStr := ""var messageTmp []bytefor k, _ := range cipherText {if k%decryptSize == 0 && k != 0 {messageTmp = cipherText[start:k]start = kisEncrypt = true} else if k == len(cipherText)-1 {messageTmp = cipherText[start : k+1]isEncrypt = true}if isEncrypt {isEncrypt = falsecipherText, err := rsa.DecryptPKCS1v15(rand.Reader, privateKey, messageTmp)if err != nil {panic(err)}cipherTextStr += string(cipherText)}}//返回明文return cipherTextStr}
常用签名算法
正序,左右加apiSecret,然后md5转大写
func Sign(data map[string]string, apiSecret string) string {dataStr := ""//拼接for _, v := range sortMap(data) {dataStr += v + data[v]}dataStr = apiSecret + dataStr + apiSecretm := md5.Sum([]byte(dataStr))dataStrMd5 := hex.EncodeToString(m[:])return strings.ToUpper(dataStrMd5)}//返回已排序的键(key)数组func sortMap(data map[string]string) []string {var keys []stringfor k, _ := range data {keys = append(keys, k)}sort.Strings(keys)return keys}
