rsacrypt.go 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. package rpc
  2. import (
  3. "crypto/rand"
  4. "crypto/rsa"
  5. "crypto/x509"
  6. "encoding/asn1"
  7. "encoding/base64"
  8. "encoding/pem"
  9. "os"
  10. )
  11. const (
  12. privateKey = `-----BEGIN RSA PRIVATE KEY-----
  13. MIICWwIBAAKBgQCTnWuCTLNtDiqCt6fEfnLRUGT4zrPPgL1l8alZBcgdIC8ErtqxOZLFjVTYqxE8dqnkyBhW9pjv2WodAf9o0D5Em0Ysx2I8yurWBGmvpxLIaMaqqIPuKBYJSzJkv2wht5eXrUpCJBxn/0kFSBBLvvq/9NWWDniVA71NQaGPUal/DQIBAwKBgBiaPJW3czzXscBz8UtqaHg4ENQic01AH5D9nDmA9q+FXStyecg0QyDs43lx2DS+caYhWWPTxCf5ka+AVTwitQsuDkQ/f9bLvxaqCqhZck2ph0Bb/N+CYKU5jgy88BNZjLvjdLBTjBeVQjk57ofLS6r9mn+QXF4z+fpnIEJrbX7LAkEA1/DMrghmNYuVWK5BKQWJzBkKS4k/ef7Gh8QFNyQ8pV+xExNK2T0BjmZH+uA6Sigkn3otqj7fnB3AtbNB5SDifQJBAK7/xpxazc7kuK97fGVfbKOCHjUNcZ/TY2oaExqncPjrf0V61VWW2PFVZfGY4rEMmWO8awIPgC/DriEsvuf3o9ECQQCP9d3JWu7OXQ47HtYbWQaIELGHsNT7/y8FLVjPbX3DlSC3YjHmKKu0RC/8lXwxcBhqUXPG1JUSvoB5IivuFexTAkB0qoRoPIk0mHsfp6hDlPMXrBQjXku/4kJGvAy8b6Cl8lTY/I45DztLjkP2Zex2CGZCfZysClV1LR7AyH9FT8KLAkEAvxsN59kyXjRrbyRcMzSPrBcVFgLfmFyPQZKc8+BgRENtxPM8+WRLIMgMzVh3Sh175kKNKUDeacpzu1uiaHt6VA==
  14. -----END RSA PRIVATE KEY-----
  15. `
  16. publicKey = `-----BEGIN PUBLIC KEY-----
  17. MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCTnWuCTLNtDiqCt6fEfnLRUGT4zrPPgL1l8alZBcgdIC8ErtqxOZLFjVTYqxE8dqnkyBhW9pjv2WodAf9o0D5Em0Ysx2I8yurWBGmvpxLIaMaqqIPuKBYJSzJkv2wht5eXrUpCJBxn/0kFSBBLvvq/9NWWDniVA71NQaGPUal/DQIBAw==
  18. -----END PUBLIC KEY-----
  19. `
  20. //私钥是用PKCS8来生成的
  21. privateClientKey = `-----BEGIN PRIVATE KEY-----
  22. MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAI0sUcw92U5v59lbWrOBNj6kNNG1bFjLJ3eKrMjBpR7vZY6yDkH/qQciXLKqYZdF2slUrgHNKLEnoQOaQEFfVw0uyc2juzb4gDGl+P0TCIhLJzlzyWP83d7p/ehCpcp34i21FmjDTEE/2O6k5FfytxbKFm33iaxd0CtNGl0TvAHXAgEDAoGAF4di91+kN71RTuSPHereX8YIzZ48uXcxPpcczCBGL9KQ7R2tCv/xgTBkyHG67oukduNyVaIxctvwK0RgCuU5LJxM4phwr+YOUgfiv0qjEqzrj10YqQ4C5qc1JQPs/q1BhSJp8nY5AgrUtBvZWsyM1i+A9nDlZqpRAn2y6+LaXGMCQQDrkcn4n/clnCmnt84IWhtO6quWspPy2qYf4pirvAd2w019WQdD1IFbptYjIzMj7x4HXYEtUob5apB6CFzuJuNvAkEAmWq0GHcgbo4bzvCzStv87rcxroLZtfHQ3txxf1vK8ZXBaUGyuiGzozXf2qkEA3rzpbMmJNa9Zn+L4OB41Hb0GQJBAJ0L2/sVT25oG8UlNAWRZ4nxx7nMYqHnGWqXEHJ9Wk8s3lOQr4KNq5JvOWzCIhf0vq+Tq3OMWfucYFFa6J7El58CQGZHIrr6FZ8JZ99LIjHn/fR6IR8B5nlL4JSS9lTn3KEOgPDWdybBImzOlTxwrVenTRkiGW3kfkRVB+tAUI2korsCQQCbEQHa0XbFjA230nejo8y1umltCvtD1eeomzblXLSLPqwenqd380B1vkZEUaSDafmo248THmWOfDom6T/hmvvW
  23. -----END PRIVATE KEY-----`
  24. publicClientKey = `-----BEGIN PUBLIC KEY-----
  25. MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCNLFHMPdlOb+fZW1qzgTY+pDTRtWxYyyd3iqzIwaUe72WOsg5B/6kHIlyyqmGXRdrJVK4BzSixJ6EDmkBBX1cNLsnNo7s2+IAxpfj9EwiISyc5c8lj/N3e6f3oQqXKd+IttRZow0xBP9jupORX8rcWyhZt94msXdArTRpdE7wB1wIBAw==
  26. -----END PUBLIC KEY-----`
  27. privateServerKey = ``
  28. publicServerKey = ``
  29. )
  30. const (
  31. privateKeyPrefix = "WT RSA PRIVATE KEY "
  32. publicKeyPrefix = " WT RSA PUBLIC KEY "
  33. )
  34. var PublicKey []byte
  35. var PrivateKey []byte
  36. var PrivateClientKey []byte
  37. var PublicClientKey []byte
  38. var PrivateServerKey []byte
  39. var PublicServerKey []byte
  40. func init() {
  41. PublicKey = []byte(publicKey)
  42. PrivateKey = []byte(privateKey)
  43. PrivateClientKey = []byte(privateClientKey)
  44. PublicClientKey = []byte(publicClientKey)
  45. PrivateServerKey = []byte(privateServerKey)
  46. PublicServerKey = []byte(publicServerKey)
  47. }
  48. func GetRSAKey(prefix string) error {
  49. privateKey, err := rsa.GenerateKey(rand.Reader, 1024)
  50. if err != nil {
  51. return err
  52. }
  53. //客户端需要PKCS8格式的私钥
  54. x509PrivateKey, err := Marsha1PKCS8PrivateKey(privateKey)
  55. if err != nil {
  56. return err
  57. }
  58. //x509PrivateKey := x509.MarshalPKCS1PrivateKey(privateKey)
  59. privateFile, err := os.Create("./private" + prefix + ".pem")
  60. if err != nil {
  61. return err
  62. }
  63. defer privateFile.Close()
  64. privateBlock := pem.Block{
  65. Type: privateKeyPrefix,
  66. Bytes: x509PrivateKey,
  67. }
  68. if err = pem.Encode(privateFile, &privateBlock); err != nil {
  69. return err
  70. }
  71. publicKey := privateKey.PublicKey
  72. x509PublicKey, err := x509.MarshalPKIXPublicKey(&publicKey)
  73. if err != nil {
  74. panic(err)
  75. }
  76. publicFile, err := os.Create("./public" + prefix + ".pem")
  77. if err != nil {
  78. return err
  79. }
  80. defer publicFile.Close()
  81. publicBlock := pem.Block{
  82. Type: publicKeyPrefix,
  83. Bytes: x509PublicKey,
  84. }
  85. if err = pem.Encode(publicFile, &publicBlock); err != nil {
  86. return err
  87. }
  88. return nil
  89. }
  90. func RSAEncrypt(textStr, key []byte) (cryptText []byte, err error) {
  91. block, _ := pem.Decode(key)
  92. publicKeyInterface, err := x509.ParsePKIXPublicKey(block.Bytes)
  93. if err != nil {
  94. return nil, err
  95. }
  96. tmpPublicKey := publicKeyInterface.(*rsa.PublicKey)
  97. tmpRetText, err := rsa.EncryptPKCS1v15(rand.Reader, tmpPublicKey, textStr)
  98. if err != nil {
  99. return nil, err
  100. }
  101. retText := base64.StdEncoding.EncodeToString(tmpRetText)
  102. return []byte(retText), nil
  103. }
  104. func RSADecrypt(cryptText, key []byte) ([]byte, error) {
  105. block, _ := pem.Decode(key)
  106. tmpPrivateKey, err := x509.ParsePKCS8PrivateKey(block.Bytes)
  107. if err != nil {
  108. return nil, err
  109. }
  110. //block, _ := pem.Decode(key)
  111. //tmpPrivateKey, err := x509.ParsePKCS1PrivateKey(block.Bytes)
  112. //if err != nil {
  113. // return nil, err
  114. //}
  115. tmpCryptText, err := base64.StdEncoding.DecodeString(string(cryptText))
  116. if err != nil {
  117. return nil, err
  118. }
  119. retText, err := rsa.DecryptPKCS1v15(rand.Reader, tmpPrivateKey.(*rsa.PrivateKey), tmpCryptText)
  120. if err != nil {
  121. return nil, err
  122. }
  123. return retText, nil
  124. }
  125. type pkcs8Key struct {
  126. Version int
  127. PrivateKeyAlgorithm []asn1.ObjectIdentifier
  128. PrivateKey []byte
  129. }
  130. func Marsha1PKCS8PrivateKey(key *rsa.PrivateKey) ([]byte, error) {
  131. var pkey pkcs8Key
  132. pkey.Version = 0
  133. pkey.PrivateKeyAlgorithm = make([]asn1.ObjectIdentifier, 1)
  134. pkey.PrivateKeyAlgorithm[0] = asn1.ObjectIdentifier{1, 2, 840, 113549, 1, 1, 1}
  135. pkey.PrivateKey = x509.MarshalPKCS1PrivateKey(key)
  136. return asn1.Marshal(pkey)
  137. }