国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

Golang 實(shí)現(xiàn)RSA 加密解密(附帶php)

kun_jian / 3616人閱讀

摘要:安全總是很重要的,各個(gè)語(yǔ)言對(duì)于通用的加密算法都會(huì)有實(shí)現(xiàn)。對(duì)于和加密算法本身,請(qǐng)查閱相關(guān)資料在中,很多功能經(jīng)常是一個(gè)函數(shù)解決而中的卻不是。該文討論加密解密。一概要這是一個(gè)非對(duì)稱(chēng)加密算法,一般通過(guò)公鑰加密,私鑰解密。

安全總是很重要的,各個(gè)語(yǔ)言對(duì)于通用的加密算法都會(huì)有實(shí)現(xiàn)。前段時(shí)間,用Go實(shí)現(xiàn)了RSA和DES的加密解密,在這分享一下。(對(duì)于RSA和DES加密算法本身,請(qǐng)查閱相關(guān)資料)

在PHP中,很多功能經(jīng)常是一個(gè)函數(shù)解決;而Go中的卻不是。本文會(huì)通過(guò)PHP加密,Go解密;Go加密,PHP解密來(lái)學(xué)習(xí)Go的RSA和DES相關(guān)的API。

該文討論Go RSA加密解密。所有操作在linux下完成。

一、概要

這是一個(gè)非對(duì)稱(chēng)加密算法,一般通過(guò)公鑰加密,私鑰解密。

在加解密過(guò)程中,使用openssl生產(chǎn)密鑰。執(zhí)行如下操作:

1)創(chuàng)建私鑰:

openssl genrsa -out private.pem 1024 //密鑰長(zhǎng)度,1024覺(jué)得不夠安全的話可以用2048,但是代價(jià)也相應(yīng)增大

2)創(chuàng)建公鑰:

openssl rsa -in private.pem -pubout -out public.pem

這樣便生產(chǎn)了密鑰。

一般地,各個(gè)語(yǔ)言也會(huì)提供API,用于生成密鑰。在Go中,可以查看encoding/pem包和crypto/x509包。具體怎么產(chǎn)生,可查看《GO加密解密RSA番外篇:生成RSA密鑰》。

加密解密這塊,涉及到很多標(biāo)準(zhǔn),個(gè)人建議需要的時(shí)候臨時(shí)學(xué)習(xí)一下。

二、Go RSA加密解密

1、rsa加解密,必然會(huì)去查crypto/ras這個(gè)包

Package rsa implements RSA encryption as specified in PKCS#1.

這是該包的說(shuō)明:實(shí)現(xiàn)RSA加密技術(shù),基于PKCS#1規(guī)范。

對(duì)于什么是PKCS#1,可以查閱相關(guān)資料。PKCS(公鑰密碼標(biāo)準(zhǔn)),而#1就是RSA的標(biāo)準(zhǔn)。可以查看:PKCS系列簡(jiǎn)介

從該包中函數(shù)的名稱(chēng),可以看到有兩對(duì)加解密的函數(shù)。

EncryptOAEP和DecryptOAEP
EncryptPKCS1v15和DecryptPKCS1v15

這稱(chēng)作加密方案,詳細(xì)可以查看,PKCS #1 v2.1 RSA 算法標(biāo)準(zhǔn)

可見(jiàn),當(dāng)與其他語(yǔ)言交互時(shí),需要確定好使用哪種方案。

PublicKey和PrivateKey兩個(gè)類(lèi)型分別代表公鑰和私鑰,關(guān)于這兩個(gè)類(lèi)型中成員該怎么設(shè)置,這涉及到RSA加密算法,本文中,這兩個(gè)類(lèi)型的實(shí)例通過(guò)解析文章開(kāi)頭生成的密鑰得到。

2、解析密鑰得到PublicKey和PrivateKey的實(shí)例
這個(gè)過(guò)程,我也是花了好些時(shí)間(主要對(duì)各種加密的各種東東不熟):怎么將openssl生成的密鑰文件解析到公鑰和私鑰實(shí)例呢?

在encoding/pem包中,看到了—–BEGIN Type—–這樣的字樣,這正好和openssl生成的密鑰形式差不多,那就試試。

在該包中,一個(gè)block代表的是PEM編碼的結(jié)構(gòu),關(guān)于PEM,請(qǐng)查閱相關(guān)資料。我們要解析密鑰,當(dāng)然用Decode方法:

func Decode(data []byte) (p *Block, rest []byte)

這樣便得到了一個(gè)Block的實(shí)例(指針)。

解析來(lái)看crypto/x509。為什么是x509呢?這又涉及到一堆概念。先不管這些,我也是看encoding和crypto這兩個(gè)包的子包摸索出來(lái)的。
在x509包中,有一個(gè)函數(shù):

func ParsePKIXPublicKey(derBytes []byte) (pub interface{}, err error)

從該函數(shù)的說(shuō)明:ParsePKIXPublicKey parses a DER encoded public key. These values are typically found in PEM blocks with “BEGIN PUBLIC KEY”??梢?jiàn)這就是解析PublicKey的。另外,這里說(shuō)到了PEM,可以上面的encoding/pem對(duì)了。(PKIX是啥東東,查看這里 )

而解析私鑰的,有好幾個(gè)方法,從上面的介紹,我們知道,RSA是PKCS#1,剛好有一個(gè)方法:

func ParsePKCS1PrivateKey(der []byte) (key *rsa.PrivateKey, err error)

返回的就是rsa.PrivateKey。

3、解密解密實(shí)現(xiàn)
通過(guò)上面的介紹,Go中RSA的解密解密實(shí)現(xiàn)就不難了。代碼如下:

// 加密

func RsaEncrypt(origData []byte) ([]byte, error) {
    block, _ := pem.Decode(publicKey)
    if block == nil {
        return nil, errors.New("public key error")
    }
    pubInterface, err := x509.ParsePKIXPublicKey(block.Bytes)
    if err != nil {
        return nil, err
    }
    pub := pubInterface.(*rsa.PublicKey)
    return rsa.EncryptPKCS1v15(rand.Reader, pub, origData)
}

// 解密

func RsaDecrypt(ciphertext []byte) ([]byte, error) {
    block, _ := pem.Decode(privateKey)
    if block == nil {
        return nil, errors.New("private key error!")
    }
    priv, err := x509.ParsePKCS1PrivateKey(block.Bytes)
    if err != nil {
        return nil, err
    }
    return rsa.DecryptPKCS1v15(rand.Reader, priv, ciphertext)
}

其中,publicKey和privateKey是openssl生成的密鑰,我生成的如下:

// 公鑰和私鑰可以從文件中讀取

var privateKey = []byte(`
-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQDZsfv1qscqYdy4vY+P4e3cAtmvppXQcRvrF1cB4drkv0haU24Y
7m5qYtT52Kr539RdbKKdLAM6s20lWy7+5C0DgacdwYWd/7PeCELyEipZJL07Vro7
Ate8Bfjya+wltGK9+XNUIHiumUKULW4KDx21+1NLAUeJ6PeW+DAkmJWF6QIDAQAB
AoGBAJlNxenTQj6OfCl9FMR2jlMJjtMrtQT9InQEE7m3m7bLHeC+MCJOhmNVBjaM
ZpthDORdxIZ6oCuOf6Z2+Dl35lntGFh5J7S34UP2BWzF1IyyQfySCNexGNHKT1G1
XKQtHmtc2gWWthEg+S6ciIyw2IGrrP2Rke81vYHExPrexf0hAkEA9Izb0MiYsMCB
/jemLJB0Lb3Y/B8xjGjQFFBQT7bmwBVjvZWZVpnMnXi9sWGdgUpxsCuAIROXjZ40
IRZ2C9EouwJBAOPjPvV8Sgw4vaseOqlJvSq/C/pIFx6RVznDGlc8bRg7SgTPpjHG
4G+M3mVgpCX1a/EU1mB+fhiJ2LAZ/pTtY6sCQGaW9NwIWu3DRIVGCSMm0mYh/3X9
DAcwLSJoctiODQ1Fq9rreDE5QfpJnaJdJfsIJNtX1F+L3YceeBXtW0Ynz2MCQBI8
9KP274Is5FkWkUFNKnuKUK4WKOuEXEO+LpR+vIhs7k6WQ8nGDd4/mujoJBr5mkrw
DPwqA3N5TMNDQVGv8gMCQQCaKGJgWYgvo3/milFfImbp+m7/Y3vCptarldXrYQWO
AQjxwc71ZGBFDITYvdgJM1MTqc8xQek1FXn1vfpy2c6O
-----END RSA PRIVATE KEY-----
`)
 
var publicKey = []byte(`
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDZsfv1qscqYdy4vY+P4e3cAtmv
ppXQcRvrF1cB4drkv0haU24Y7m5qYtT52Kr539RdbKKdLAM6s20lWy7+5C0Dgacd
wYWd/7PeCELyEipZJL07Vro7Ate8Bfjya+wltGK9+XNUIHiumUKULW4KDx21+1NL
AUeJ6PeW+DAkmJWF6QIDAQAB
-----END PUBLIC KEY-----
`)

4、使用例子

package main
 
import (
    "fmt"
)

func main() {
    data, err := RsaEncrypt([]byte("git@github.com/mrkt"))
    if err != nil {
        panic(err)
    }
    origData, err := RsaDecrypt(data)
    if err != nil {
        panic(err)
    }
    fmt.Println(string(origData))
}

該例子是加密完git@github.com/mrkt后立馬解密

三、跨語(yǔ)言加解密

語(yǔ)言內(nèi)部正常,還得看看和其他語(yǔ)言是否一致,即:其他語(yǔ)言加密,Go語(yǔ)言得正確解密;Go語(yǔ)言加密,其他語(yǔ)言正確解密

1、PHP RSA加解密
這里,我選擇PHP,使用的是openssl擴(kuò)展。PHP中加解密很簡(jiǎn)單,如下兩個(gè)方法(這里只考慮用公鑰加密,私鑰解密):

bool openssl_public_encrypt ( string $data , string &$crypted , mixed
$key [, int $padding = OPENSSL_PKCS1_PADDING ] ) bool
openssl_private_decrypt ( string $data , string &$decrypted , mixed
$key [, int $padding = OPENSSL_PKCS1_PADDING ] )

最后一個(gè)參數(shù)是加密方案(補(bǔ)齊方式)。由于Go中使用的是PKCS1而不是OAEP,所以,使用默認(rèn)值即可。

PHP代碼如下:

$privateKey = "-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQDZsfv1qscqYdy4vY+P4e3cAtmvppXQcRvrF1cB4drkv0haU24Y
7m5qYtT52Kr539RdbKKdLAM6s20lWy7+5C0DgacdwYWd/7PeCELyEipZJL07Vro7
Ate8Bfjya+wltGK9+XNUIHiumUKULW4KDx21+1NLAUeJ6PeW+DAkmJWF6QIDAQAB
AoGBAJlNxenTQj6OfCl9FMR2jlMJjtMrtQT9InQEE7m3m7bLHeC+MCJOhmNVBjaM
ZpthDORdxIZ6oCuOf6Z2+Dl35lntGFh5J7S34UP2BWzF1IyyQfySCNexGNHKT1G1
XKQtHmtc2gWWthEg+S6ciIyw2IGrrP2Rke81vYHExPrexf0hAkEA9Izb0MiYsMCB
/jemLJB0Lb3Y/B8xjGjQFFBQT7bmwBVjvZWZVpnMnXi9sWGdgUpxsCuAIROXjZ40
IRZ2C9EouwJBAOPjPvV8Sgw4vaseOqlJvSq/C/pIFx6RVznDGlc8bRg7SgTPpjHG
4G+M3mVgpCX1a/EU1mB+fhiJ2LAZ/pTtY6sCQGaW9NwIWu3DRIVGCSMm0mYh/3X9
DAcwLSJoctiODQ1Fq9rreDE5QfpJnaJdJfsIJNtX1F+L3YceeBXtW0Ynz2MCQBI8
9KP274Is5FkWkUFNKnuKUK4WKOuEXEO+LpR+vIhs7k6WQ8nGDd4/mujoJBr5mkrw
DPwqA3N5TMNDQVGv8gMCQQCaKGJgWYgvo3/milFfImbp+m7/Y3vCptarldXrYQWO
AQjxwc71ZGBFDITYvdgJM1MTqc8xQek1FXn1vfpy2c6O
-----END RSA PRIVATE KEY-----"; $publicKey = "-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDZsfv1qscqYdy4vY+P4e3cAtmv
ppXQcRvrF1cB4drkv0haU24Y7m5qYtT52Kr539RdbKKdLAM6s20lWy7+5C0Dgacd
wYWd/7PeCELyEipZJL07Vro7Ate8Bfjya+wltGK9+XNUIHiumUKULW4KDx21+1NL
AUeJ6PeW+DAkmJWF6QIDAQAB
-----END PUBLIC KEY-----";

function rsaEncrypt($data)
{
    global $publicKey;
    openssl_public_encrypt($data, $crypted, $publicKey);
    return $crypted;

}
function rsaDecrypt($data)
{
    global $privateKey;
    openssl_private_decrypt($data, $decrypted, $privateKey);
    return $decrypted;
}

function main()
{

    $crypted = rsaEncrypt("git@github.com/mrk");
    $decrypted = rsaDecrypt($crypted);
    echo "encrypt and decrypt:" . $decrypted;

}

main();
這里也是用PHP加解密git@github.com/mrkt

2、Go和PHP一起工作
這里要注意的一點(diǎn)是,由于加密后是字節(jié)流,直接輸出查看會(huì)亂碼,因此,為了便于語(yǔ)言直接加解密,這里將加密之后的數(shù)據(jù)進(jìn)行base64編碼。

3、使用
示例中,php和Go版本都支持-d參數(shù)傳入加密好的字符串,將其解密;不傳時(shí),會(huì)輸出加密好并base64編碼的串,可用于其他語(yǔ)言解密。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/21836.html

相關(guān)文章

  • 永強(qiáng)教你加解密:對(duì)稱(chēng)篇(一)

    摘要:大家好,我是永強(qiáng),就是老李之前經(jīng)常給你們說(shuō)的區(qū)塊鏈大神大學(xué)肄業(yè)卻依然大公司主程一波兒流只生活在老李口中尚未真實(shí)露面的騙錢(qián)高手老王的左膀右臂趙永強(qiáng)。 大家好,我是永強(qiáng),就是老李之前經(jīng)常給你們說(shuō)的區(qū)塊鏈大神、大學(xué)肄業(yè)卻依然大公司iOS主程一波兒流、只生活在老李口中尚未真實(shí)露面的騙錢(qián)高手、老王的左膀右臂 ——— 趙永強(qiáng)。我和尼古拉斯趙四之間并沒(méi)有什么強(qiáng)關(guān)聯(lián),我只是單方面認(rèn)識(shí)他而已。 之前老李...

    opengps 評(píng)論0 收藏0
  • 利用RSA對(duì)前后端加密的探索

    摘要:項(xiàng)目地址前后端交互時(shí)為了保證信息安全可使用方式加密信息,在數(shù)據(jù)量大的時(shí)候可采用結(jié)合方式。由于加密和解密使用同樣規(guī)則簡(jiǎn)稱(chēng)密鑰,這被稱(chēng)為對(duì)稱(chēng)加密算法。從那時(shí)直到現(xiàn)在,算法一直是最廣為使用的非對(duì)稱(chēng)加密算法。 RSA-JS-PHP 項(xiàng)目地址rsa-js-php 前后端交互時(shí)為了保證信息安全可使用RSA方式加密信息,在數(shù)據(jù)量大的時(shí)候可采用DES+RSA結(jié)合方式。DEMO演示地址 一點(diǎn)歷史 1...

    banana_pi 評(píng)論0 收藏0
  • PHP服務(wù)端和APP客戶端實(shí)現(xiàn)RSA+AES雙向加密解密

    摘要:目的服務(wù)端和移動(dòng)端雙向加密解密共有七個(gè)文件其中包括三個(gè)類(lèi)文件對(duì)稱(chēng)加密解密類(lèi)服務(wù)端公鑰私鑰非對(duì)稱(chēng)加密解密類(lèi)客戶端公鑰私鑰非對(duì)稱(chēng)加密解密類(lèi)四個(gè)過(guò)程文件其中文件中有注釋和數(shù)據(jù)第一步客戶端和服務(wù)端交換密鑰明文第二步客戶端發(fā)起帶參數(shù)請(qǐng)求加密后第三 目的:服務(wù)端和移動(dòng)端雙向加密解密 共有七個(gè)文件 其中包括三個(gè)類(lèi)文件 lib_aes.php aes對(duì)稱(chēng)加密解密類(lèi) server_rsa_crypt....

    ivydom 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<