golang實(shí)現(xiàn)RSA加密解密

非對(duì)稱加密示意圖:

非對(duì)稱加密算法流程圖

在此可以看到配椭,非對(duì)稱加密是通過兩個(gè)密鑰(公鑰-私鑰)來實(shí)現(xiàn)對(duì)數(shù)據(jù)的加密和解密的扼倘。公鑰用于加密晤锥,私鑰用于解密护桦。

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,"密碼默認(rèn)長(zhǎng)度1024")

err := RSAKeyGen(bits)

if err != nil{

fmt.Println("RSA密碼文件生成失敗")

}

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

}

利用公鑰和私鑰進(jìn)行加密解密:

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("錯(cuò)誤", err)

}

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

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

? if err != nil {

fmt.Println("錯(cuò)誤", err)

}

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

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

//fmt.Println(string(pk))

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市族奢,隨后出現(xiàn)的幾起案子姥闭,更是在濱河造成了極大的恐慌,老刑警劉巖越走,帶你破解...
    沈念sama閱讀 221,548評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件棚品,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡廊敌,警方通過查閱死者的電腦和手機(jī)铜跑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來骡澈,“玉大人锅纺,你說我怎么就攤上這事±吲梗” “怎么了囤锉?”我有些...
    開封第一講書人閱讀 167,990評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)疼电。 經(jīng)常有香客問我嚼锄,道長(zhǎng),這世上最難降的妖魔是什么蔽豺? 我笑而不...
    開封第一講書人閱讀 59,618評(píng)論 1 296
  • 正文 為了忘掉前任区丑,我火速辦了婚禮,結(jié)果婚禮上修陡,老公的妹妹穿的比我還像新娘沧侥。我一直安慰自己,他們只是感情好魄鸦,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評(píng)論 6 397
  • 文/花漫 我一把揭開白布宴杀。 她就那樣靜靜地躺著,像睡著了一般拾因。 火紅的嫁衣襯著肌膚如雪旺罢。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,246評(píng)論 1 308
  • 那天绢记,我揣著相機(jī)與錄音扁达,去河邊找鬼。 笑死蠢熄,一個(gè)胖子當(dāng)著我的面吹牛跪解,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播签孔,決...
    沈念sama閱讀 40,819評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼叉讥,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼窘行!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起图仓,我...
    開封第一講書人閱讀 39,725評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤罐盔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后透绩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體翘骂,經(jīng)...
    沈念sama閱讀 46,268評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評(píng)論 3 340
  • 正文 我和宋清朗相戀三年帚豪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了碳竟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,488評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡狸臣,死狀恐怖莹桅,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情烛亦,我是刑警寧澤诈泼,帶...
    沈念sama閱讀 36,181評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站煤禽,受9級(jí)特大地震影響铐达,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜檬果,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評(píng)論 3 333
  • 文/蒙蒙 一瓮孙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧选脊,春花似錦杭抠、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至钝的,卻和暖如春翁垂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背硝桩。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工沮峡, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人亿柑。 一個(gè)月前我還...
    沈念sama閱讀 48,897評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像棍弄,于是被迫代替她去往敵國(guó)和親望薄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子疟游,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 嘟噥嘟噥:最近接到一個(gè)任務(wù):在客戶端動(dòng)態(tài)生成RSA密鑰對(duì),然后向服務(wù)器發(fā)送這個(gè)密鑰對(duì)中的公鑰字符串痕支,由服務(wù)器進(jìn)行公...
    TimmyR閱讀 8,040評(píng)論 19 21
  • /**ios常見的幾種加密方法: 普通的加密方法是講密碼進(jìn)行加密后保存到用戶偏好設(shè)置( [NSUserDefaul...
    彬至睢陽閱讀 2,939評(píng)論 0 7
  • 當(dāng)一個(gè)人有一只手表時(shí)颁虐,可以知道現(xiàn)在是幾點(diǎn)鐘,而當(dāng)他同時(shí)擁有兩只表時(shí)卧须,卻無法確定時(shí)間另绩。因?yàn)閮芍皇直聿⒉荒芨嬖V一個(gè)人更...
    95搭八閱讀 989評(píng)論 0 2