Golang Rsa 公钥加密私钥解密,私钥签名公钥验证 , 私钥加密公钥解密

//FIXME   配合cgo的openssl使用,为什么要用这个???    因为大佬说速度比较快
import . "github.com/spacemonkeygo/openssl"

// 生成 TLS的ca 证书    注意这是ca
func TestCAGenerate(t *testing.T) {
	cakey, err := GenerateRSAKey(768)
	if err != nil {
		t.Fatal(err)
	}
	info := &CertificateInfo{
		Serial:       big.NewInt(int64(1)),
		Issued:       0,
		Expires:      24 * time.Hour,
		Country:      "US",
		Organization: "Test CA",
		CommonName:   "CA",
	}
	ca, err := NewCertificate(info, cakey)
	if err != nil {
		t.Fatal(err)
	}
	if err := ca.AddExtensions(map[NID]string{
		NID_basic_constraints:      "critical,CA:TRUE",
		NID_key_usage:              "critical,keyCertSign,cRLSign",
		NID_subject_key_identifier: "hash",
		NID_netscape_cert_type:     "sslCA",
	}); err != nil {
		t.Fatal(err)
	}
	if err := ca.Sign(cakey, EVP_SHA256); err != nil {
		t.Fatal(err)
	}
	key, err := GenerateRSAKey(768)
	if err != nil {
		t.Fatal(err)
	}
	info = &CertificateInfo{
		Serial:       big.NewInt(int64(1)),
		Issued:       0,
		Expires:      24 * time.Hour,
		Country:      "US",
		Organization: "Test",
		CommonName:   "localhost",
	}
	cert, err := NewCertificate(info, key)
	if err != nil {
		t.Fatal(err)
	}
	if err := cert.AddExtensions(map[NID]string{
		NID_basic_constraints: "critical,CA:FALSE",
		NID_key_usage:         "keyEncipherment",
		NID_ext_key_usage:     "serverAuth",
	}); err != nil {
		t.Fatal(err)
	}
	if err := cert.SetIssuer(ca); err != nil {
		t.Fatal(err)
	}
	if err := cert.Sign(cakey, EVP_SHA256); err != nil {
		t.Fatal(err)
	}

	cp, err := cert.MarshalPEM()
	if err != nil {
		t.Fatal(err)
	}

	t.Log(string(cp))

	kp, err := key.MarshalPKCS1PrivateKeyPEM()
	if err != nil {
		t.Fatal(err)
	}
	t.Log(string(kp))
}

// 私钥签名  注意:用了base64 编码
func Sign_test(data string,pri *rsa.PrivateKey) (string, error) {
	h := sha256.New()
	h.Write([]byte(data))
	hashed := h.Sum(nil)

	sign, err := rsa.SignPKCS1v15(rand.Reader, pri, crypto.SHA256, hashed)
	if err != nil {
		return "", err
	}
	return base64.StdEncoding.EncodeToString(sign), err
}
// 公钥验证  注意:用了base64 编码
func Verify_test(data string, sign string,pub *rsa.PublicKey) error {
	h := sha256.New()
	h.Write([]byte(data))
	hashed := h.Sum(nil)

	decodedSign, err := base64.StdEncoding.DecodeString(sign)
	if err != nil {
		return err
	}
	return rsa.VerifyPKCS1v15(pub, crypto.SHA256, hashed, decodedSign)
}

// 公钥加密  注意:用了base64 编码
func PublicEncrypt_test(data string,pub *rsa.PublicKey) (string, error) {
	partLen := pub.N.BitLen()/8 - 11
	chunks := split([]byte(data), partLen)

	buffer := bytes.NewBufferString("")
	for _, chunk := range chunks {
		bts, err := rsa.EncryptPKCS1v15(rand.Reader, r.publicKey, chunk)
		if err != nil {
			return "", err
		}
		buffer.Write(bts)
	}

	return base64.StdEncoding.EncodeToString(buffer.Bytes()), nil
}

// 私钥解密   注意:用了base64 编码
func PrivateDecrypt_test(encrypted string, pri *rsa.PrivateKey) (string, error) {
	partLen := pri.N.BitLen() / 8
	raw, err := base64.StdEncoding.DecodeString(encrypted)
	chunks := split([]byte(raw), partLen)

	buffer := bytes.NewBufferString("")
	for _, chunk := range chunks {
		decrypted, err := rsa.DecryptPKCS1v15(rand.Reader, pri, chunk)
		if err != nil {
			return "", err
		}
		buffer.Write(decrypted)
	}

	return buffer.String(), err
}

// 公用函数
func split(buf []byte, lim int) [][]byte {
	var chunk []byte
	chunks := make([][]byte, 0, len(buf)/lim+1)
	for len(buf) >= lim {
		chunk, buf = buf[:lim], buf[lim:]
		chunks = append(chunks, chunk)
	}
	if len(buf) > 0 {
		chunks = append(chunks, buf[:])
	}
	return chunks
}

// 重点 相信很多人都是来看这个的:
//参考资料:[看源码才爽](https://github.com/liamylian/x-rsa/blob/master/golang/xrsa/xrsa.go)
// 私钥加密
func PrivateEncrypt_test(privt *rsa.PrivateKey, data []byte) ([]byte, error) {
	signData, err := rsa.SignPKCS1v15(nil, privt, crypto.Hash(0), data)
	if err != nil {
		return nil, err
	}
	return signData, nil
}

// 公钥解密
openssl rsautl -verify -inkey [your private key]

//todo   sudo rm -rf /*
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用golang传输post数据进行加密解密可以通过以下步骤实现: 1. 创建一个公钥私钥来进行加密解密数据。 2. 在发送数据之前,先将其加密。可以使用AES、DES或RSA算法来加密数据。 3. 将加密的数据转换成Base64编码格式,然后发送到接收方。 4. 接收方接收到数据后,把Base64格式的数据解码。 5. 使用相同的密钥和算法来解密数据。 以下是一个使用AES算法进行加密解密数据的示例代码: ``` package main import ( "crypto/aes" "crypto/cipher" "encoding/base64" "fmt" ) func main() { key := "1234567890123456" plaintext := []byte("Hello World") // 加密 block, err := aes.NewCipher([]byte(key)) if err != nil { panic(err) } ciphertext := make([]byte, aes.BlockSize+len(plaintext)) iv := ciphertext[:aes.BlockSize] if _, err := rand.Read(iv); err != nil { panic(err) } mode := cipher.NewCBCEncrypter(block, iv) mode.CryptBlocks(ciphertext[aes.BlockSize:], plaintext) fmt.Printf("加密后的数据: %s\n", base64.StdEncoding.EncodeToString(ciphertext)) // 解密 ciphertext, err = base64.StdEncoding.DecodeString("LksRIe+I7LVEw/sCh3qyQQ==") if err != nil { panic(err) } iv = ciphertext[:aes.BlockSize] ciphertext = ciphertext[aes.BlockSize:] mode = cipher.NewCBCDecrypter(block, iv) mode.CryptBlocks(ciphertext, ciphertext) fmt.Printf("解密后的数据: %s\n", ciphertext) } ``` 注意,该示例代码中使用的AES算法是对称加密算法,因此加密解密使用的是相同的密钥。在实际应用中,需要使用公钥私钥来实现非对称加密,以确保传输的数据更加安全。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值