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 := 0
isEncrypt := false
cipherTextStr := ""
var messageTmp []byte
for k, _ := range plainText {
if k%encryptSize == 0 && k != 0 {
messageTmp = plainText[start:k]
start = k
isEncrypt = true
} else if k == len(plainText)-1 {
messageTmp = plainText[start : k+1]
isEncrypt = true
}
if isEncrypt {
isEncrypt = false
cipherText, 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 := 0
isEncrypt := false
cipherTextStr := ""
var messageTmp []byte
for k, _ := range cipherText {
if k%decryptSize == 0 && k != 0 {
messageTmp = cipherText[start:k]
start = k
isEncrypt = true
} else if k == len(cipherText)-1 {
messageTmp = cipherText[start : k+1]
isEncrypt = true
}
if isEncrypt {
isEncrypt = false
cipherText, 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 + apiSecret
m := md5.Sum([]byte(dataStr))
dataStrMd5 := hex.EncodeToString(m[:])
return strings.ToUpper(dataStrMd5)
}
//返回已排序的键(key)数组
func sortMap(data map[string]string) []string {
var keys []string
for k, _ := range data {
keys = append(keys, k)
}
sort.Strings(keys)
return keys
}