文档章节

go语言, 初识RSA加密

漂泊的树叶
 漂泊的树叶
发布于 2017/07/24 16:00
字数 733
阅读 83
收藏 1
点赞 0
评论 0

简介:

    作为一名初学者,简单阅读了的RSA的加密原理,和几篇关于go语言rsa加密的博客,

写了一个很简陋的demo. 记录下来,以免忘记 

1.包含方法

    (1)公钥加密

    (2)私钥解密

    (3)私钥签名

    (4)公钥验签

    直接看代码

2.代码

2.1 加密代码

package util

import (
	"encoding/pem"
	"errors"
	"crypto/x509"
	"crypto/rsa"
	"crypto/rand"
	"crypto"
)

/**
   @param sourceBytes 原文
   @param publicKey  公钥字符串
   公钥加密
 */
func EncipherRsa(sourceBytes []byte, publicKey string) ([]byte, error)  {
	//获取公钥
	block, _ := pem.Decode([]byte(publicKey))
	if block == nil {
		return nil, errors.New("获取公钥失败")
	}
	pubInterface, err := x509.ParsePKIXPublicKey(block.Bytes)
	if err != nil {
		return nil, err
	}
	pub := pubInterface.(*rsa.PublicKey)
	//声明密文,动态数组
	var cipherByte []byte
	//分段加密
	for i := 0; i < len(sourceBytes); i += 245{
		var slice []byte
		if(i + 245) < len(sourceBytes){
			slice = sourceBytes[i : i + 245]
		}else {
			slice = sourceBytes[i : len(sourceBytes)]
		}
		//Rsa加密,encryptBytes:分段密文
		encryptBytes, err := rsa.EncryptPKCS1v15(rand.Reader, pub, slice)
		if err != nil {
			return nil, err
		}
		//追加分段密文encryptBytes=>cipherByte
		cipherByte = append(cipherByte, encryptBytes...)
	}
	return cipherByte,nil
}

/**
	@param cipherByte 密文
	@param privateKey 私钥字符串
  	私钥解密,返回原文
 */
func DecipherRsa(cipherByte []byte, privateKey string) ([]byte, error) {
	//获取私钥
	block, _ := pem.Decode([]byte(privateKey))
	if block == nil {
		return nil, errors.New("private key error!")
	}
	priv, err := x509.ParsePKCS1PrivateKey(block.Bytes)
	if err != nil {
		return nil, err
	}
	//声明一个动态数组,用来存放解密之后的数据
	var source []byte
	//分段解密
	for i :=0; i < len(cipherByte); i += 256{
		var slice []byte
		if(i + 256) < len(cipherByte){
			slice = cipherByte[i : i + 256]
		}else {
			slice = cipherByte[i : len(cipherByte)]
		}
		//rsa解密
		decrypt, err := rsa.DecryptPKCS1v15(rand.Reader, priv, slice)
		if err != nil{
			return nil, err
		}
		//追加解密数据decrypt=>source
		source = append(source, decrypt...)
	}
	return source, nil
}

/**
	@param cipherText  待签名字段
	RSA私钥签名sha1
 */
func RsaSign(cipherText []byte, privateKey string) ([]byte, error) {
	//获取私钥
	block, _ := pem.Decode([]byte(privateKey))
	if block == nil {
		return nil, errors.New("private key error!")
	}
	priv, err := x509.ParsePKCS1PrivateKey(block.Bytes)
	if err != nil {
		return nil, err
	}
	//指定HASH类型  SHA1
	h := crypto.Hash.New(crypto.SHA1)
	h.Write(cipherText)
	hashed := h.Sum(nil)
	//返回签名结果
	return rsa.SignPKCS1v15(rand.Reader, priv, crypto.SHA1, hashed)
}

/**
	@param origData 待签名字段
	@param sign     签名
	公钥验签
 */
func VerifySign(origData []byte, sign []byte, publicKey string) error {
	//获取公钥
	block, _ := pem.Decode([]byte(publicKey))
	if block == nil {
		return errors.New("public key error")
	}
	pubInterface, err := x509.ParsePKIXPublicKey(block.Bytes)
	if err != nil {
		return  err
	}
	pub := pubInterface.(*rsa.PublicKey)
	//指定HASH类型  SHA1
	h := crypto.Hash.New(crypto.SHA1)
	h.Write(origData)
	hashed := h.Sum(nil)
	//返回验签结果
	err = rsa.VerifyPKCS1v15(pub, crypto.SHA1, hashed, sign)
	return err
}

2.2测试代码

package main

import (
	"util"
	"log"
	"fmt"
)

var public_key = `
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAs2fv0rclnSLCCoG+tUV
IbphXbpXBeugeLTRkYE2WSSfdk5m0oyPmg15fnaoj/yhEy9vmAVGrqA4ROa3Q5V
C6vWZZXGbsiUzyloHZ63IGylRdsfXt3Wlys9vkxUko4SDdZBIUe2fDCz2x/YRcw
idjchumGnAVxMpZx+WLgPZa+h537Iv993XYn2g7Y7WLSc6/lj0IdPws521Y3PbF
XQFb7jqHVgQKcavvqwpkRxb3wbK1+EDXVO4tiBNpE1MNjnkaaQX/ZKSi0GRBlTw
IJ3u1NSBfya/3rhvfgZQClFyn1IKaUcyWoy8qSxts6yujT0qR8cHnfSf4CB64Vn
CO+LQQMwIDAQAB
-----END PUBLIC KEY-----
`
var privateKey = `
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAs2fv0rclnSLCCoG+tUVIbphXbpXBeugeLTRkYE2WSSfdk5m
0oyPmg15fnaoj/yhEy9vmAVGrqA4ROa3Q5VC6vWZZXGbsiUzyloHZ63IGylRdsf
Xt3Wlys9vkxUko4SDdZBIUe2fDCz2x/YRcwidjchumGnAVxMpZx+WLgPZa+h537
Iv993XYn2g7Y7WLSc6/lj0IdPws521Y3PbFXQFb7jqHVgQKcavvqwpkRxb3wbK1
+EDXVO4tiBNpE1MNjnkaaQX/ZKSi0GRBlTwIJ3u1NSBfya/3rhvfgZQClFyn1IK
aUcyWoy8qSxts6yujT0qR8cHnfSf4CB64VnCO+LQQMwIDAQABAoIBAAka10L8ZH
5LC0n5N7J/Z6OlO5qzIvSX3yAwLn/ssBnaWhZpkI9O/R3hpjycK+OBKaym5k9e0
7VdsWYZ+iYJKND/5r0XxB1buFwHDwYx7UJLcc3cS0wXU+jo2f1hLx/tyQ6RFFUG
+RES+nuBQivgT920pYNl+NTZ6CCK9799wTQ8Tc72MR9zycTPDCND8GJfzJuChin
zNFTlP6B36uvtOFRhhDiQBRUi0u+MiyaoGfMGlLBN+cerCZncjUMGT/NuQaDMxJ
NZS0kuwQAb2FRoEiMokbZOlMr242RXSGUgq1amSMy0pFkj/h4Kn8auzW1UWBdLi
i9iL8V3VGgL3d14+WECgYEA5iOwpOuXO/MmCVVWEDbcdY3TEjOi3UUnjCKjf4If
LUi0F9rCtAcNMVc6gqF0TK0kg53q7pA8ziE3s+IgHaNWra+wMRB5L38uRt1BEku
aU7e4MvLuXHSNsQkpajrTJ3wxttPPCMoNFniGWDdIHTvso/NbnuH46sYFWGfcrB
Kg5JsCgYEAx5DSuIQGisUiQeNDpRM9fVj9nT4Cxp7rFvKzr3gLQ5zqmmyczfAXl
G1n60C1jlxnbRbb+7ruiuWxIl4HJL0+qvziPwC+uI2NP53mTIHLojQT51hZnPP/
6i5R6IUsfIyHu7Mka2H1VqEcaDDXqXitGUc9rw7qxKA5jsb+kpf2oEkCgYEA40x
ssvZcsEE+WAmIrwsAQrqItXl6acBbhvTPNqh10mv0M3tEwjoUtZ7JkyuTigeYAM
Z/uo+K/qugMHIt9hfVDEZxZoQ2rMqYEjWEh2VUT0stCmUVNwuGxkueM+VVl7H6B
/C6kpu8wWzYg1hWSUleN6+r1gipqHdb4Cz0rp7XefECgYAvIPdyldNJsFZvwvD1
qf6KfJqgKMXVDDCuobBnjuzyEbuhrma1h6654cB54TU/InlWXOCkqTeuW6IiYJx
FQ9/p14DCqjVgNiWWUX7SsJBbhPryVn4LP+A++KNlSxX/b9yaKis+pMqgo7mmrW
ow3ovafWWG0voEZ2ZQXpQ+IF8g6QKBgEVtcFiUdTz9jN6tbAQ7s9utvS3VBtQNO
doWVURLa0moLbgTgQlz2f5lsRkNiOulCYcPTfv1P9GsWhtrd9q1KNjUN87xR9vl
z25qLHCla5XzpgfsYIbnsq1Eew2ulzoDMrAxeiTEmLMxH5L+CojGDAoSKFgkfQE
3NKhDdtJCtqtg
-----END RSA PRIVATE KEY-----
`

func main()  {

	var str = "testrsa123"

	//公钥加密
	encryptBytes, err := util.EncipherRsa([]byte(str), public_key)
	if err != nil{
		log.Fatal(err)
	}

	//私钥解密
	decryptBytes, err := util.DecipherRsa(encryptBytes, privateKey)
	if err != nil{
		log.Fatal(err)
	}
	fmt.Println("解密结果=" + string(decryptBytes))

	//私钥签名
	signBytes, err := util.RsaSign([]byte(str), privateKey)
	if err!= nil{
		log.Fatal(err)
	}

	//公钥验签
	err = util.VerifySign([]byte(str), signBytes, public_key)
	if err == nil{
		fmt.Println("签名校验成功")
	}
}

 

© 著作权归作者所有

共有 人打赏支持
漂泊的树叶
粉丝 0
博文 2
码字总数 950
作品 0
杭州
程序员
java服务端、php、C#客户端rsa

最近公司项目需要用到rsa,故对rsa签名算法的一些概念和不同语言的使用进行了研究(具体实现算法则不钻牛角尖了) 对rsa算法的个人理解 什么是RSA签名、验签、加密解密1、rsa算法为非对称加密...

jason-寒江雪 ⋅ 2015/12/14 ⋅ 0

C# 中使用 RSA加解密算法

一、什么是RSA   RSA公开密钥密码体制。所谓的公开密钥密码体制就是使用不同的加密密钥与解密密钥,是一种“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制。      在公开...

唐僧他大叔 ⋅ 2017/04/12 ⋅ 0

go语言中椭圆曲线加密算法的使用

椭圆曲线加密算法,使用golang的实现! 最近在看一些关于比特币的东西,里边有个椭圆曲线加密算法,查了下,感觉很不错! 与经典的RSA,DSA等公钥密码体制相比,椭圆密码体制有以下优点: 1.安全性...

IrvinYoung ⋅ 2016/10/09 ⋅ 0

RSA加解密及签名算法的技术原理及其Go语言实现

  对称加密中,加密和解密使用相同的密钥,因此必须向解密者配送密钥,即密钥配送问题。而非对称加密中,由于加密和解密分别使用公钥和私钥,而公钥是公开的,因此可以规避密钥配送问题。非...

莫名2013 ⋅ 01/04 ⋅ 0

初识MySQL

什么是数据库? 数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据。我们也可以将数据存储在...

孟东 ⋅ 01/07 ⋅ 0

科研人员称可攻破 SecurID 令牌 RSA辟谣

多年来,安全行业受益于由安全厂商、研究人员和媒体组成的道德准则。研究人员开展了一项有价值的 任务是,从理论和实践上找出 产品和技术的不足,预防潜在的攻击。安全厂商采纳这些研究成果,...

oschina ⋅ 2012/06/28 ⋅ 2

爬虫搜索基础篇(四)

上面所说所讲的都是一点的基础的知识,如今我就列一点比较常见的限制形式,怎么样打破这些个限制,而去抓取数值。 .Basic Auth 普通会有用户权力委托的限制,会在headers的Autheration字段里...

张安懿 ⋅ 2015/11/25 ⋅ 0

Python加密库--M2Crypto

M2Crypto 是一个 Python 语言对 OpenSSL 的封装,支持包括 RSA、DSA、DH、HMACs、消息摘要、对称加密如 AES,以及客户端和服务器端的 SSL 功能;HTTPS 等。...

匿名 ⋅ 2009/09/01 ⋅ 0

转Elasticsearch顶尖高手系列课程

Elasticsearch,是目前行业中非常热门的一个技术。Elasticsearch是一种分布式的海量数据搜索与分析的技术,可以用于电商网站、门户网站、企业IT系统等各种场景下的搜索引擎,也可以用于对海量...

小花卷juan ⋅ 2017/06/24 ⋅ 0

C#实现MD5加密

首先,先简单介绍一下MD5 MD5的全称是message-digest algorithm 5(信息-摘要算法,在90年代初由mit laboratory for computer science和rsa data security inc的ronald l. rivest开发出来, 经...

晨曦之光 ⋅ 2012/05/16 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

骰子游戏代码开源地址

因为阿里云现在服务器已经停用了,所以上面的配置已经失效。 服务端开源地址:https://gitee.com/goalya/chat4.git 客户端开源地址:https://gitee.com/goalya/client4.git 具体运行界面请参考...

算法之名 ⋅ 40分钟前 ⋅ 0

设计模式--装饰者模式

装饰者模式 定义 动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。 通用类图 意图 动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比...

gaob2001 ⋅ 今天 ⋅ 0

JavaScript零基础入门——(八)JavaScript的数组

JavaScript零基础入门——(八)JavaScript的数组 欢迎大家回到我们的JavaScript零基础入门,上一节课我们讲了有关JavaScript正则表达式的相关知识点,便于大家更好的对字符串进行处理。这一...

JandenMa ⋅ 今天 ⋅ 0

sbt网络问题解决方案

转自:http://dblab.xmu.edu.cn/blog/maven-network-problem/ cd ~/.sbt/launchers/0.13.9unzip -q ./sbt-launch.jar 修改 vi sbt/sbt.boot.properties 增加一个oschina库地址: [reposit......

狐狸老侠 ⋅ 今天 ⋅ 0

大数据,必须掌握的10项顶级安全技术

我们看到越来越多的数据泄漏事故、勒索软件和其他类型的网络攻击,这使得安全成为一个热门话题。 去年,企业IT面临的威胁仍然处于非常高的水平,每天都会看到媒体报道大量数据泄漏事故和攻击...

p柯西 ⋅ 今天 ⋅ 0

Linux下安装配置Hadoop2.7.6

前提 安装jdk 下载 wget http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-2.7.6/hadoop-2.7.6.tar.gz 解压 配置 vim /etc/profile # 配置java环境变量 export JAVA_HOME=/opt/jdk1......

晨猫 ⋅ 今天 ⋅ 0

crontab工具介绍

crontab crontab 是一个用于设置周期性被执行的任务工具。 周期性执行的任务列表称为Cron Table crontab(选项)(参数) -e:编辑该用户的计时器设置; -l:列出该用户的计时器设置; -r:删除该...

Linux学习笔记 ⋅ 今天 ⋅ 0

深入Java多线程——Java内存模型深入(2)

5. final域的内存语义 5.1 final域的重排序规则 1.对于final域,编译器和处理器要遵守两个重排序规则: (1)在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用...

江左煤郎 ⋅ 今天 ⋅ 0

面试-正向代理和反向代理

面试-正向代理和反向代理 Nginx 是一个高性能的反向代理服务器,但同时也支持正向代理方式的配置。

秋日芒草 ⋅ 今天 ⋅ 0

Spring 依赖注入(DI)

1、Setter方法注入: 通过设置方法注入依赖。这种方法既简单又常用。 类中定义set()方法: public class HelloWorldOutput{ HelloWorld helloWorld; public void setHelloWorld...

霍淇滨 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部