service.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. package service
  2. import (
  3. "bytes"
  4. "crypto/md5"
  5. "crypto/rand"
  6. "crypto_test/pkg/handle"
  7. "encoding/hex"
  8. "fmt"
  9. "log"
  10. "golang.org/x/crypto/sha3"
  11. "github.com/tjfoc/gmsm/sm2"
  12. "github.com/tjfoc/gmsm/sm3"
  13. "github.com/tjfoc/gmsm/x509"
  14. )
  15. func RSA() {
  16. content := "hello world"
  17. base64Sig, err := handle.RSASign([]byte(content), "./rsa_private_key.pem")
  18. if err != nil {
  19. fmt.Println("私钥签名失败:", err)
  20. return
  21. }
  22. fmt.Println("私钥签名结果:", base64Sig)
  23. err = handle.RSAVerify([]byte(content), base64Sig, "./rsa_public_key.pem")
  24. if err != nil {
  25. fmt.Println("验证签名失败:", err)
  26. } else {
  27. fmt.Println("签名验证成功")
  28. }
  29. }
  30. func SM2() {
  31. content := []byte("hello world")
  32. priv, err := sm2.GenerateKey(rand.Reader) // 生成密钥对
  33. if err != nil {
  34. log.Fatal(err)
  35. }
  36. pub := &priv.PublicKey
  37. ciphertxt, err := pub.EncryptAsn1(content, rand.Reader) //sm2加密
  38. if err != nil {
  39. log.Fatal(err)
  40. }
  41. fmt.Println("加密结果: ", ciphertxt)
  42. plaintxt, err := priv.DecryptAsn1(ciphertxt) //sm2解密
  43. if err != nil {
  44. log.Fatal(err)
  45. }
  46. if !bytes.Equal(content, plaintxt) {
  47. log.Fatal("原文不匹配")
  48. }
  49. sign, err := priv.Sign(rand.Reader, content, nil) //sm2签名
  50. if err != nil {
  51. log.Fatal(err)
  52. }
  53. isok := pub.Verify(content, sign) //sm2验签
  54. fmt.Printf("Verified: %v\n", isok)
  55. }
  56. // func GetKey2(){
  57. // priv, err := sm2.GenerateKey(rand.Reader) // 生成密钥对
  58. // if err != nil {
  59. // log.Fatal(err)
  60. // }
  61. // }
  62. func SM3() {
  63. content := []byte("hello world")
  64. h := sm3.New()
  65. h.Write([]byte(content))
  66. sum := h.Sum(nil)
  67. fmt.Printf("sm3 value is: %x\n", sum)
  68. }
  69. func MD5() {
  70. content := []byte("hello world")
  71. h := md5.New()
  72. h.Write(content)
  73. sum2 := hex.EncodeToString(h.Sum(nil))
  74. fmt.Printf("md5 value is: %x\n", sum2)
  75. }
  76. func GetKey() {
  77. // 生成 SM2 密钥对
  78. priv, err := sm2.GenerateKey(nil) // 使用 sm2 包生成密钥对
  79. if err != nil {
  80. return // 如果生成密钥对失败,直接返回
  81. }
  82. // 将私钥转换为 PEM 格式
  83. privPem, err := x509.WritePrivateKeyToPem(priv, nil) // 使用 x509 包将私钥转换为 PEM 格式
  84. if err != nil {
  85. log.Fatal(err) // 如果转换失败,记录错误并终止程序
  86. }
  87. // 将公钥转换为 PEM 格式
  88. publicPem, err := x509.WritePublicKeyToPem(&priv.PublicKey) // 使用 x509 包将公钥转换为 PEM 格式
  89. if err != nil {
  90. log.Fatal(err) // 如果转换失败,记录错误并终止程序
  91. }
  92. // 从 PEM 格式中恢复公钥
  93. publicKeyFromPem, err := x509.ReadPublicKeyFromPem([]byte(publicPem)) // 使用 x509 包从 PEM 格式恢复公钥
  94. if err != nil {
  95. log.Fatal(err) // 如果恢复失败,记录错误并终止程序
  96. }
  97. // 打印压缩后的公钥的十六进制表示
  98. fmt.Println("pubkey", hex.EncodeToString(sm2.Compress(publicKeyFromPem))) // 使用 sm2 包对公钥进行压缩,并打印其十六进制表示
  99. // 从 PEM 格式中恢复私钥
  100. privateKeyFromPem, err := x509.ReadPrivateKeyFromPem([]byte(privPem), nil) // 使用 x509 包从 PEM 格式恢复私钥
  101. if err != nil {
  102. log.Fatal(err) // 如果恢复失败,记录错误并终止程序
  103. }
  104. // 打印私钥的 D 参数的十六进制表示
  105. fmt.Println("privkey", hex.EncodeToString(privateKeyFromPem.D.Bytes())) // 打印私钥的 D 参数(私钥的核心部分)的十六进制表示
  106. }
  107. func SHA3(ctx string) {
  108. h := sha3.New256() // 可以选择SHA3-224、SHA3-256、SHA3-384或SHA3-512
  109. // 写入数据 可以多次调用Write()方法,逐步写入数据
  110. h.Write([]byte(ctx))
  111. // 计算哈希值
  112. hash := h.Sum(nil)
  113. // 打印哈希值(以十六进制格式)
  114. fmt.Printf("SHA-3-256: %x\n", hash)
  115. // 也可以直接使用Sum256函数
  116. data := []byte(ctx)
  117. hash2 := sha3.Sum256(data)
  118. fmt.Printf("SHA-3-256: %x\n", hash2)
  119. }