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)一起提出的.当时他们三人都在麻省理工学院 ...
随机推荐
- java代码实现简体繁体转换
汉字分为简体和繁体字,这是众所周知的,虽然繁体字中国大陆这边用的并不会太多,但时不时的还是会使用到.那么,如何做到简体字和繁体字的转换呢?其实很简单,这里附上一个java版本的简繁体转换,用网上找的接 ...
- phpfpm开启pm.status_path配置,查看fpm状态参数
php-fpm配置 pm.status_path = /phpfpm_status nginx配置 server { root /data/www; listen 80; serve ...
- 【VS开发】【计算机视觉】OpenCV读写xml文件《C++版本》
OpenCV FileStorage类读写XML/YML文件 在OpenCV程序中,需要保存中间结果的时候常常会使用.xml / .yml文件,opencv2.0之前都是使用C风格的代码,当时读写XM ...
- beam search 和 greedy search
贪心搜索(greedy search): 贪心搜索最为简单,直接选择每个输出的最大概率,直到出现终结符或最大句子长度. 集束搜索(beam search): 集束搜索可以认为是维特比算法的贪心形式,在 ...
- MySQL_约束条件
目录 八个约束条件 1.非空约束NOT NULL 2.主键约束PRIMARY KEY 3.多字段联合主键(复合主键) 4.唯一约束UNIQUE 5.默认约束DEFAULT 6.外键约束FOREIGN ...
- 2019JAVA课程总结
课程总结 1.子类不能直接访问父类的私有属性,可通过get(),set()来间接访问. 2.super(),this()不可同时使用,因为其都必须放在首行,所以不可同时使用. 3.若删去super() ...
- C++中用ODBC和ADO方式连接SQL数据库
https://wenku.baidu.com/view/f01e4e762f3f5727a5e9856a561252d380eb2033.html
- 区间DP(入门)括号匹配
https://www.nitacm.com/problem_show.php?pid=8314 思路:类似于https://blog.csdn.net/MIKASA3/article/details ...
- 学习 Laravel - Web 开发实战入门笔记(1)
本笔记根据 LearnKu 教程边学边记而成.该教程以搭建出一个类似微博的Web 应用为最终成果,在过程中学习 Laravel 的相关知识. 准备开发环境 原教程使用官方推荐的 Homestead 开 ...
- __declspec(dllexport)的作用
加了之后发现,用ollydbg导入dll,可以自动判断某个函数是导出函数