密钥生成流程

  • 生成私钥操作流程概述

    1. 使用rsa中的GenerateKey方法生成私钥

      func GenerateKey(random io.Reader, bits int) (priv *PrivateKey, err error)

      • rand.Reader -> import "crypto/rand"
      • 1024 的整数倍 - 建议
    2. 通过x509标准将得到的ras私钥序列化为ASN.1 的 DER编码字符串

      func MarshalPKCS1PrivateKey(key *rsa.PrivateKey) []byte

    3. 将私钥字符串设置到pem格式块中

      初始化一个pem.Block块

      type Block struct {Type    string            // 得自前言的类型(如"RSA PRIVATE KEY")Headers map[string]string // 可选的头项Bytes   []byte            // 内容解码后的数据,一般是DER编码的ASN.1结构
      }
      
    4. 通过pem将设置好的数据进行编码, 并写入磁盘文件中

      func Encode(out io.Writer, b *Block) error

      • out - 准备一个文件指针
  • 生成公钥操作流程

    1. 从得到的私钥对象中将公钥信息取出

      type PrivateKey struct {PublicKey            // 公钥D         *big.Int   // 私有的指数Primes    []*big.Int // N的素因子,至少有两个// 包含预先计算好的值,可在某些情况下加速私钥的操作Precomputed PrecomputedValues
      }
      
    2. 通过x509标准将得到 的rsa公钥序列化为字符串

      func MarshalPKIXPublicKey(pub interface{}) ([]byte, error)
      
    3. 将公钥字符串设置到pem格式块中

      type Block struct {
      Type string // 得自前言的类型(如"RSA PRIVATE KEY")
      Headers map[string]string // 可选的头项
      Bytes []byte // 内容解码后的数据,一般是DER编码的ASN.1结构
      }

    4. 通过pem将设置好的数据进行编码, 并写入磁盘文件

      func Encode(out io.Writer, b *Block) error

RSA加解密

RSA加密

  1. 将公钥文件中的公钥读出, 得到使用pem编码的字符串

    -- 读文件

  2. 将得到的字符串解码

    -- pem.Decode

  3. 使用x509将编码之后的公钥解析出来

    -- func ParsePKCS1PrivateKey(der []byte) (key *rsa.PrivateKey, err error)

  4. 使用得到的公钥通过rsa进行数据加密

RSA解密

  1. 将私钥文件中的私钥读出, 得到使用pem编码的字符串
  2. 将得到的字符串解码
  3. 使用x509将编码之后的私钥解析出来
  4. 使用得到的私钥通过rsa进行数据解密

使用

import ("crypto/rand""crypto/rsa""crypto/sha256""crypto/x509""encoding/hex""encoding/pem""fmt""os"
)// 生成rsa的密钥对, 并且保存到磁盘文件中
func GenerateRsaKey(keySize int) {// 1. 使用rsa中的GenerateKey方法生成私钥privateKey, err := rsa.GenerateKey(rand.Reader, keySize)if err != nil {panic(err)}// 2. 通过x509标准将得到的ras私钥序列化为ASN.1 的 DER编码字符串derText := x509.MarshalPKCS1PrivateKey(privateKey)// 3. 要组织一个pem.Block(base64编码)// 里面还有个Headers属性可以写可以不写block := pem.Block{Type : "rsa private key", // 这个地方写个字符串就行Bytes : derText,}// 4. pem编码file, err := os.Create("private.pem")if err != nil {panic(err)}pem.Encode(file, &block)file.Close()// ============ 公钥 ==========// 1. 从私钥中取出公钥publicKey := privateKey.PublicKey// 2. 使用x509标准序列化derstream, err := x509.MarshalPKIXPublicKey(&publicKey)if err != nil {panic(err)}// 3. 将得到的数据放到pem.Block中block = pem.Block{Type : "rsa public key",   // 这个地方写个字符串就行Bytes : derstream,}// 4. pem编码file, err  = os.Create("public.pem")if err != nil {panic(err)}pem.Encode(file, &block)file.Close()
}// RSA 加密, 公钥加密
func RSAEncrypt(plainText []byte, fileName string) []byte{// 1. 打开文件, 并且读出文件内容file, err := os.Open(fileName)if err != nil {panic(err)}fileInfo, err := file.Stat()if err != nil {panic(err)}buf := make([]byte, fileInfo.Size())file.Read(buf)file.Close()// 2. pem解码block, _ := pem.Decode(buf)pubInterface, err := x509.ParsePKIXPublicKey(block.Bytes)//断言类型转换pubKey := pubInterface.(*rsa.PublicKey)// 3. 使用公钥加密cipherText, err := rsa.EncryptPKCS1v15(rand.Reader, pubKey, plainText)if err != nil {panic(err)}return cipherText
}
// RSA 解密
func RSADecrypt(cipherText []byte, fileName string) []byte{// 1. 打开文件, 并且读出文件内容file, err := os.Open(fileName)if err != nil {panic(err)}fileInfo, err := file.Stat()if err != nil {panic(err)}buf := make([]byte, fileInfo.Size())file.Read(buf)file.Close()// 2. pem解码block, _ := pem.Decode(buf)privKey, err := x509.ParsePKCS1PrivateKey(block.Bytes)if err != nil {panic(err)}// 3. 使用私钥解密plainText, err := rsa.DecryptPKCS1v15(rand.Reader, privKey, cipherText)if err != nil {panic(err)}return plainText
}//测试文件
func main() {GenerateRsaKey(4096)src := []byte("abc abc...")cipherText := RSAEncrypt(src, "public.pem")plainText := RSADecrypt(cipherText, "private.pem")fmt.Println(string(plainText))myHash()myHash()
}// 使用sha256
func myHash() {// sha256.Sum256([]byte("hello, go"))// 1. 创建哈希接口对象myHash := sha256.New()// 2. 添加数据src := []byte("123 123...")myHash.Write(src)myHash.Write(src)myHash.Write(src)// 3. 计算结果res := myHash.Sum(nil)// 4. 格式化为16进制形式myStr := hex.EncodeToString(res)fmt.Printf("%s\n", myStr)
}

golang非对称加密相关推荐

  1. 加解密基础——(对称加密、非对称加密和混合加密)

    本文对之前学习过的加解密相关知识做一简单总结,以备后用. 1. 基本概念 加密算法 通常是复杂的数学公式,这些公式确定如何将明文转化为密文的过程和规则. 密钥 是一串被加入到算法中的随机比特. 待续 ...

  2. php 生成非对称密钥,php实现非对称加密

    使用非对称加密主要是借助openssl的公钥和私钥,用公钥加密私钥解密,或者私钥加密公钥解密. 1.安装openssl和PHP的openssl扩展 2.生成私钥:openssl genrsa用于生成r ...

  3. 对称加密和非对称加密

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 对称加密 对称密钥是双方使用相同的密钥 . 对称加密的要求 (1)需要强大的加密算法.算法至少应该满足:即使分析人员知道 ...

  4. 对称加密与非对称加密

    2019独角兽企业重金招聘Python工程师标准>>> 对称加密(Symmetric Cryptography) 对称加密是最快速.最简单的一种加密方式,加密(encryption) ...

  5. java的rsa作用_java 中RSA的方式实现非对称加密的实例

    java 中rsa的方式实现非对称加密的实例 rsa通俗理解: 你只要去想:既然是加密,那肯定是不希望别人知道我的消息,所以只有我才能解密,所以可得出公钥负责加密,私钥负责解密:同理,既然是签名,那肯 ...

  6. 非对称加密和证书总结

    转载请注明文章来源:https://tlanyan.me/asymmetric... 前几日做支付对接时,被对方文档中的加密方式搞晕乎了一会.意识到证书加密方面的理解不够深入,事后查阅参考资料补习一波 ...

  7. [转载] 对称加密与非对称加密

    标签 PostgreSQL , 对称加密 , 非对称加密 , Symmetric , ASymmetric , public , private , pgcrypto , 区块链 背景 转载: htt ...

  8. 对称加密和非对称加密介绍和区别

    什么是对称加密技术? 对称加密采用了对称密码编码技术,它的特点是文件加密和解密使用相同的密钥,即加密密钥也可以用作解密密钥,这种方法在密码学中叫做对称加密算法,对称加密算法使用起来简单快捷,密钥较短, ...

  9. 非对称加密,我终于理解了!

    2019独角兽企业重金招聘Python工程师标准>>> http://blog.csdn.net/xiaoy20618/article/details/47083837 北京的Bob ...

最新文章

  1. Charles拦截与篡改
  2. 【Android 内存优化】Android Profiler 工具常用功能 ( 监测内存 | 内存快照 )
  3. 云服务器和VPS服务器有什么区别?
  4. python连接redis失败、积极拒绝_python-django-redis拒绝连接问题解决_20191121
  5. android 字符串 时间格式化,Android 获取年月日时分秒 格式化指定时间字符串
  6. java 非法线程_JVM中的线程行为
  7. UIButton 文字图片排列
  8. Linux上的tomcat版本升级
  9. 【PTA】 统计素数并求和
  10. webpack打包告警We noticed you‘re using the `useBuiltIns` option without declaring a core-js version.
  11. 【SoC FPGA学习】十、SoC FPGA 开发板的 FPGA 配置数据下载和固化
  12. win2003桌面图标蓝底去除
  13. Sine-Tent-Cosine混沌映射(提供参考文献及Matlab代码)
  14. shiro自定义filter,anon不生效
  15. 萌新学Java之渐入佳境三-----线程试炼
  16. 互联网摸鱼日报(2023-01-11)
  17. 刘德华陈年温馨情侣照(多图)
  18. position属性详解
  19. xz压缩解压工具的安装
  20. 6.oop-类和对象

热门文章

  1. 【Android 内存优化】自定义组件长图组件 ( 获取图像宽高 | 计算解码区域 | 设置图像解码属性 复用 像素格式 | 图像绘制 )
  2. 关闭子页面刷新父页面,不需要弹出确认窗口
  3. 设计模式系列1:单例模式(Singleton Pattern)
  4. mysql decode encode 乱码问题
  5. iOS 汉字转拼音 PinYin4Objc
  6. 在brew开发中遇到的一些问题
  7. 基于jQuery的AJAX和JSON实现纯html数据模板
  8. HDOJ 1253 HDU 1253 胜利大逃亡 ACM 1253 IN HDU
  9. 写了一个开源的ASP.Net的系统信息探针(适用于MS.Net 1.x/2.0和Mono 1.0/2.0)
  10. 汇编实验注意点(待补充和更新)