rsa.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. package rsa
  2. import (
  3. "crypto/rand"
  4. "crypto/rsa"
  5. "crypto/x509"
  6. "encoding/pem"
  7. "io/ioutil"
  8. )
  9. // RSA公钥私钥产生
  10. func GeneratePrivAndPubKey() (prvkey, pubkey []byte) {
  11. // 生成私钥文件
  12. privateKey, err := rsa.GenerateKey(rand.Reader, 1024)
  13. if err != nil {
  14. panic(err)
  15. }
  16. derStream := x509.MarshalPKCS1PrivateKey(privateKey)
  17. block := &pem.Block{
  18. Type: "RSA PRIVATE KEY",
  19. Bytes: derStream,
  20. }
  21. prvkey = pem.EncodeToMemory(block)
  22. //保存到文件
  23. err = savePEMToFile(prvkey, "config/private.pem")
  24. if err != nil {
  25. panic(err)
  26. }
  27. publicKey := &privateKey.PublicKey
  28. derPkix, err := x509.MarshalPKIXPublicKey(publicKey)
  29. if err != nil {
  30. panic(err)
  31. }
  32. block = &pem.Block{
  33. Type: "PUBLIC KEY",
  34. Bytes: derPkix,
  35. }
  36. pubkey = pem.EncodeToMemory(block)
  37. err = savePEMToFile(pubkey, "config/public.pem")
  38. if err != nil {
  39. panic(err)
  40. }
  41. return
  42. }
  43. // 保存文件
  44. func savePEMToFile(data []byte, filename string) error {
  45. err := ioutil.WriteFile(filename, data, 0644)
  46. if err != nil {
  47. return err
  48. }
  49. //fmt.Println("Saved", filename)
  50. return nil
  51. }
  52. // 加密
  53. func Encryption(data []byte) []byte {
  54. publickKeyDecoded, err2 := GetPubKey()
  55. if err2 != nil {
  56. panic(err2)
  57. }
  58. encryptedData, err := rsa.EncryptPKCS1v15(rand.Reader, publickKeyDecoded.(*rsa.PublicKey), data)
  59. if err != nil {
  60. panic(err)
  61. }
  62. return encryptedData
  63. }
  64. // 解密
  65. func Decryption(encryptedData []byte) []byte {
  66. privateKeyDecoded := GetPrivKey()
  67. decryptedData, _ := rsa.DecryptPKCS1v15(rand.Reader, privateKeyDecoded, encryptedData)
  68. return decryptedData
  69. }
  70. // 加载文件
  71. func loadPEMFromFile(filename string) ([]byte, error) {
  72. data, err := ioutil.ReadFile(filename)
  73. if err != nil {
  74. return nil, err
  75. }
  76. return data, nil
  77. }
  78. // 读取私钥
  79. func GetPrivKey() *rsa.PrivateKey {
  80. privateKeyBytes, err := loadPEMFromFile("config/private.pem")
  81. if err != nil {
  82. panic(err)
  83. }
  84. privateKeyBlock, _ := pem.Decode(privateKeyBytes)
  85. privateKeyDecoded, err := x509.ParsePKCS1PrivateKey(privateKeyBlock.Bytes)
  86. if err != nil {
  87. panic(err)
  88. }
  89. return privateKeyDecoded
  90. }
  91. // 读取公钥
  92. func GetPubKey() (interface{}, error) {
  93. publicKeyBytes, err := loadPEMFromFile("config/public.pem")
  94. if err != nil {
  95. panic(err)
  96. }
  97. publicKeyBlock, _ := pem.Decode(publicKeyBytes)
  98. publicKeyDecoded, err := x509.ParsePKIXPublicKey(publicKeyBlock.Bytes)
  99. if err != nil {
  100. panic(err)
  101. }
  102. return publicKeyDecoded, nil
  103. }