golang实现RSA加密解密
非对称加密示意图:

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

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加密解密的更多相关文章
- 兼容javascript和C#的RSA加密解密算法,对web提交的数据进行加密传输
Web应用中往往涉及到敏感的数据,由于HTTP协议以明文的形式与服务器进行交互,因此可以通过截获请求的数据包进行分析来盗取有用的信息.虽然https可以对传输的数据进行加密,但是必须要申请证书(一般都 ...
- iOS使用Security.framework进行RSA 加密解密签名和验证签名
iOS 上 Security.framework为我们提供了安全方面相关的api: Security框架提供的RSA在iOS上使用的一些小结 支持的RSA keySize 大小有:512,768,10 ...
- openssl evp RSA 加密解密
openssl evp RSA 加密解密 可以直接使用RSA.h 提供的接口 如下测试使用EVP提供的RSA接口 1. EVP提供的RSA 加密解密 主要接口: int EVP_PKEY_encryp ...
- C# 与JAVA 的RSA 加密解密交互,互通,C#使用BouncyCastle来实现私钥加密,公钥解密的方法
因为C#的RSA加密解密只有公钥加密,私钥解密,没有私钥加密,公钥解密.在网上查了很久也没有很好的实现.BouncyCastle的文档少之又少.很多人可能会说,C#也是可以的,通过Biginteger ...
- Cryptopp iOS 使用 RSA加密解密和签名验证签名
Cryptopp 是一个c++写的功能完善的密码学工具,类似于openssl 官网:https://www.cryptopp.com 以下主要演示Cryptopp 在iOS上的RSA加密解密签名与验证 ...
- C# Java间进行RSA加密解密交互
原文:C# Java间进行RSA加密解密交互 这里,讲一下RSA算法加解密在C#和Java之间交互的问题,这两天纠结了很久,也看了很多其他人写的文章,颇受裨益,但没能解决我的实际问题,终于,还是被我捣 ...
- C# Java间进行RSA加密解密交互(二)
原文:C# Java间进行RSA加密解密交互(二) 接着前面一篇文章C# Java间进行RSA加密解密交互,继续探讨这个问题. 在前面,虽然已经实现了C# Java间进行RSA加密解密交互,但是还是与 ...
- C# Java间进行RSA加密解密交互(三)
原文:C# Java间进行RSA加密解密交互(三) 接着前面一篇C# Java间进行RSA加密解密交互(二)说吧,在上篇中为了实现 /** * RSA加密 * @param text--待加密的明文 ...
- RSA加密解密及数字签名Java实现--转
RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.当时他们三人都在麻省理工学院 ...
随机推荐
- ftp服务器不能上传文件故障
1.在客户端lftp命令无法put文件 原因:登陆用户无法读写 ftp服务器的文件夹,在服务器上增加权限 chmod 777 即可 还有一种方法:在 vsftp的配置文件里,设置可匿名读写
- jack反序列化自定义字段绑定,报错:can only instantiate non-static inner class by using default, no-argument constructor
package com.xxx; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Data; import lo ...
- 如何写resultful接口
一.协议 API与客户端用户的通信协议,总是使用HTTPS协议,以确保交互数据的传输安全. 二.域名 应该尽量将API部署在专用域名之下: https://api.example.com 如果确定AP ...
- 一些php常用函数积累
本文链接 <?php // id: ecffe70d3af54df9bad97b61918ace7d global $ct_path, $ct_log_path; $log_path = &qu ...
- 安装zabbix4.0 LTS
一.环境准备 1.https://www.zabbix.com/download?zabbix=4.4&os_distribution=centos&os_version=7& ...
- C语言递归之翻转二叉树
题目描述 翻转一棵二叉树. 示例 输入: / \ / \ / \ 输出: / \ / \ / \ 题目要求 /** * Definition for a binary tree node. * str ...
- Prometheus + Grafana 监控 Redis
Prometheus安装 .linux-amd64.tar.gz .linux-amd64. cd /prometheus # Start Prometheus. # By default, Prom ...
- QA 中的对抗攻击和防御
攻击 supporting facts 的修改:字符调换,替换词(用空格embedding或近同义词,变形词等) 还有针对question的攻击. 梯度下降,在embediing上做攻击,如何deco ...
- Linux 下使用 rar 进行压缩和解压缩
1. 下载安装文件 https://www.rarlab.com/download.htm 注意下载 64位的 2. 2019.8 时的下载命令为: wget https://www.rarlab. ...
- Linux Pycharm 添加图标到root账户桌面
1. 去官网下载pycharm程序 2. 解压缩下载到的tar包 3. 在/usr/share/applications目录下新建一个pycharm.desktop, 写入内容如下, 注意红色字体需要 ...