非对称加密示意图:

在此可以看到,非对称加密是通过两个密钥(公钥-私钥)来实现对数据的加密和解密的。公钥用于加密,私钥用于解密。

RSA公钥和私钥生成:

package main

import (

"crypto/rsa"

"crypto/rand"

"fmt"

"crypto/x509"

"encoding/pem"

"os"

"flag"

)

func RSAKeyGen(bits int) error {

privatekey, err := rsa.GenerateKey(rand.Reader, bits)

if err != nil {

fmt.Println("私钥文件生成失败")

}

fmt.Println("私钥为:", privatekey)

derStream := x509.MarshalPKCS1PrivateKey(privatekey)

block := &pem.Block{

Type:"RSA Private key",

Bytes: derStream,

}

privatefile, err := os.Create("myprivatekey.pem")

defer privatefile.Close()

err = pem.Encode(privatefile, block)

if err != nil {

fmt.Println(err.Error())

return err

}

publickey := &privatekey.PublicKey;

fmt.Println("公钥为:", publickey)

derpkix, err := x509.MarshalPKIXPublicKey(publickey)

block = &pem.Block{

Type:"RSA Public key",

Bytes: derpkix,

}

if err != nil {

fmt.Println(err.Error())

return err

}

publickfile, err := os.Create("mypublic.pem")

defer publickfile.Close()

err = pem.Encode(publickfile, block)

if err != nil {

fmt.Println(err.Error())

return err

}

return nil

}

func main() {

var bits int

flag.IntVar(&bits,"b",1024,"密码默认长度1024")

err := RSAKeyGen(bits)

if err != nil{

fmt.Println("RSA密码文件生成失败")

}

fmt.Println("RSA密码生成成功")

}

利用公钥和私钥进行加密解密:

package main

import (

"encoding/pem"

"errors"

"crypto/x509"

"crypto/rsa"

"crypto/rand"

"fmt"

"encoding/base64"

"os"

)

var publickey = FileLoad("mypublic.pem")

var privatekey = FileLoad("myprivatekey.pem")

func RSAEncrypt(orgidata []byte) ([]byte, error) {

block, _ := pem.Decode(publickey)

if block == nil {

return nil, errors.New("public key is bad")

}

pubInterface, err := x509.ParsePKIXPublicKey(block.Bytes)

if err != nil {

return nil, err

}

pub := pubInterface.(*rsa.PublicKey)

return rsa.EncryptPKCS1v15(rand.Reader, pub, orgidata)//加密

}

func RSADecrypt(cipertext []byte) ([]byte, error) {

block, _ := pem.Decode(privatekey)

if block == nil {

return nil, errors.New("public key is bad")

}

priv, err := x509.ParsePKCS1PrivateKey(block.Bytes)

if err != nil {

return nil, err

}

return rsa.DecryptPKCS1v15(rand.Reader, priv, cipertext)

}

func FileLoad(filepath string) ([]byte) {

privatefile,err := os.Open(filepath)

defer privatefile.Close()

if err!=nil{

return nil

}

privateKey := make([]byte,2048)

num,err := privatefile.Read(privateKey)

return privateKey[:num]

}

func main() {

var data []byte

var err error

data, err = RSAEncrypt([]byte("QQ77025077"))

if err != nil {

fmt.Println("错误", err)

}

fmt.Println("加密:", base64.StdEncoding.EncodeToString(data))

origData, err := RSADecrypt(data)//解密

if err != nil {

fmt.Println("错误", err)

}

fmt.Println("解密:", string(origData))

//pk := FileLoad("myprivatekey.pem")

//fmt.Println(string(pk))

}

 

golang实现RSA加密解密的更多相关文章

  1. 兼容javascript和C#的RSA加密解密算法,对web提交的数据进行加密传输

    Web应用中往往涉及到敏感的数据,由于HTTP协议以明文的形式与服务器进行交互,因此可以通过截获请求的数据包进行分析来盗取有用的信息.虽然https可以对传输的数据进行加密,但是必须要申请证书(一般都 ...

  2. iOS使用Security.framework进行RSA 加密解密签名和验证签名

    iOS 上 Security.framework为我们提供了安全方面相关的api: Security框架提供的RSA在iOS上使用的一些小结 支持的RSA keySize 大小有:512,768,10 ...

  3. openssl evp RSA 加密解密

    openssl evp RSA 加密解密 可以直接使用RSA.h 提供的接口 如下测试使用EVP提供的RSA接口 1. EVP提供的RSA 加密解密 主要接口: int EVP_PKEY_encryp ...

  4. C# 与JAVA 的RSA 加密解密交互,互通,C#使用BouncyCastle来实现私钥加密,公钥解密的方法

    因为C#的RSA加密解密只有公钥加密,私钥解密,没有私钥加密,公钥解密.在网上查了很久也没有很好的实现.BouncyCastle的文档少之又少.很多人可能会说,C#也是可以的,通过Biginteger ...

  5. Cryptopp iOS 使用 RSA加密解密和签名验证签名

    Cryptopp 是一个c++写的功能完善的密码学工具,类似于openssl 官网:https://www.cryptopp.com 以下主要演示Cryptopp 在iOS上的RSA加密解密签名与验证 ...

  6. C# Java间进行RSA加密解密交互

    原文:C# Java间进行RSA加密解密交互 这里,讲一下RSA算法加解密在C#和Java之间交互的问题,这两天纠结了很久,也看了很多其他人写的文章,颇受裨益,但没能解决我的实际问题,终于,还是被我捣 ...

  7. C# Java间进行RSA加密解密交互(二)

    原文:C# Java间进行RSA加密解密交互(二) 接着前面一篇文章C# Java间进行RSA加密解密交互,继续探讨这个问题. 在前面,虽然已经实现了C# Java间进行RSA加密解密交互,但是还是与 ...

  8. C# Java间进行RSA加密解密交互(三)

    原文:C# Java间进行RSA加密解密交互(三) 接着前面一篇C# Java间进行RSA加密解密交互(二)说吧,在上篇中为了实现 /** * RSA加密 * @param text--待加密的明文 ...

  9. RSA加密解密及数字签名Java实现--转

    RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.当时他们三人都在麻省理工学院 ...

随机推荐

  1. backbone之collection

    最近要用到backbone.js,网上也找了些资料,但是就看到一个开头还可以,往下看基本就看不下去了,幸好有这本书[LeanpubRead] Backbone.Marionette.js A Gent ...

  2. Webupload+PHP上传大文件

    1.使用PHP的创始人 Rasmus Lerdorf 写的APC扩展模块来实现(http://pecl.php.net/package/apc) APC实现方法: 安装APC,参照官方文档安装,可以使 ...

  3. Python中类的继承代码实例

    Python中类的继承代码实例 这篇文章主要介绍了Python中类的继承代码实例,本文直接给出代码及运行效果,需要的朋友可以参考下 相对于C 的继承编写,Python更简洁,而且效率也是很高的,下面编 ...

  4. 线程结束,GetExitCodeThread后结束值一直STILL_ACTIVE,259的问题

    最近在用VC++编写一个视觉检测系统,其中开的线程比较多.知道线程什么时候结束是很重要的一个问题.其中用到了GetExitCodeThread()函数.函数原型如下: BOOL GetExitCode ...

  5. mysql数据库查找数据的方法。

    今日内容 1.外键的变种 唯一索引:关键字 unique(num) 作用:使指定的列,中的属性不能重复,并且加速查找案例:create table t5(id int,num int,unique(n ...

  6. C学习笔记-预备知识

    计算机结构组成 CPU(中央处理器)(控制器+运算器) 存储器(内存+外存) 输出设备 输入设备 计算机系统组成 硬件系统 主机 中央处理器 运算器 控制器 内存储器 只读存储器 随机存储器 外部设备 ...

  7. Angular ViewChild & ViewChildren

    基础 ViewChild ViewChild 装饰器用于获取模板视图中的元素或直接调用其组件中的方法.它支持 Type 类型或 string 类型的选择器,同时支持设置 read 查询条件,以获取不同 ...

  8. idea连接docker实现一键部署

    一.修改配置文件,打开2375端口 [root@microservice ~]# vim /usr/lib/systemd/system/docker.service 在ExecStart=/usr/ ...

  9. [转帖]方正数码发布基于龙芯3A3000系列整机

    方正数码发布基于龙芯3A3000系列整机 http://www.loongson.cn/news/company/730.html 方正数码也出过龙芯相关的服务器和PC笔记本等 发布时间:2019-0 ...

  10. [转帖]@RequestMapping 用法详解之地址映射(转)

    @RequestMapping 用法详解之地址映射(转) https://www.cnblogs.com/qq78292959/p/3760560.html 从csdn 发现的文章 然后csdn指向c ...