RSA加密解密

2021-08-22 02:37:23 字數 2746 閱讀 4250

擷取自我的部落格:

因為專案需要,最近做乙個rsa加密解密的介面,使用go進行開發,介面使用jsonrpc,go 對rsa加密解密有很好的支援,不過由於受限於底層微控制器,所以上層應用需要做一些稍微的調整。

rsa是一種非對稱加密演算法,什麼是非對稱加密演算法呢,那就是公鑰、私鑰可互相進行加密解密:公鑰加密—私鑰解密,私鑰加密—公鑰解密。

了解rsa演算法的實現原理,可參考:非對稱加密過程詳解(基於rsa非對稱加密演算法實現)

什麼是pkcs#1,pkcs(公鑰密碼標準),而#1就是rsa的標準。

pem檔案,也就是公私鑰的編碼格式。

rsa演算法的原理:rsa演算法詳解,從這篇部落格主要是提取出rsa演算法的公式。

1
c=(p^e)%n
n是公鑰私鑰共同使用的,其為模數。另外還有公鑰的指數e,私鑰的指數e。

公鑰的指數一般是65537,私鑰的指數則是乙個極大的數,想想乙個極大的數作為指數,計算時間是會耗費很長時間的。故公鑰加密解密都很快,私鑰則會慢很多

rsa標準是通過公鑰加密,私鑰解密 ,沒有私鑰加密,公鑰解密。為什麼會這樣呢?

go設計庫一般會嚴格按照標準來進行設計(在很多地方都見過相似做法),那是rsa標準中沒有後一種情況的使用場景嗎?其實是有的,只不過這個過程不要加密解密,而是rsa簽名與驗籤。所以按照標準,rsa標準庫也就不會有私鑰加密,公鑰解密的方法了。

這個問題想想應該是很多人的問題了,那麼在google上進行搜尋了下,還是發現了解決方法。

庫中實現了公鑰加解密的方法。

還有其他解決方法嗎?是有的,在google上進行搜尋就可以找到,記得還有人使用cgo呼叫c庫來解決。

go加密解密之rsa

此處,由於我的問題比較特殊,所以到此並沒完全解決我的問題,還記得上面說的rsa指數與模數的東西嗎,因為上層是與stm32進行通訊,32rsa的庫是需要自己手動將指數與模數填入結構體中的,那麼上層就應該將生成的私鑰進行分解開來,得到stm32所需要的指數和模數,那麼怎麼得到這些資料呢。

我使用的方法是借用openssl,理論上來說像python就可以做到,但是我並不想將事情複雜化,直接借用現有的工具是最省事的。

參考:如何用 openssl 生成rsa雙密匙;簽名證書;加密檔案郵件

1
openssl rsa -in private.pem -text -noout
-noout : 表示不顯示金鑰

執行結果:

modulus、publicexponent、privateexponent,這三個數就是我們所需要的資料(publicexponent一般演算法會設為65537)。

那麼此處就很簡單的進行字串擷取就可以做到拿出這三個資料了。

既然提到了rsa,不對稱加密演算法了,那麼也去了解了解aes對稱加密演算法吧。

golang實現aes ecb模式的加密和解密

擷取自部落格中的原文:

標記出來的話,其實是有問題的,aes演算法,區塊長度是固定的,為128bit。

在golang的原始碼設計中也可以證明這點,其blocksize設定為const,其值為16(byte),顯然,標準庫是並不允許使用者去修改這個值的,那麼aes-128/192/256,其實是針對的金鑰長度來說的。

另外,使用go aes庫需要注意的是,go aes輸入的金鑰不滿足16、24、32的要求,會直接返回錯誤,其並沒有設計補全機制,需要自己實現。

資料塊長度不足128bit,其同樣也需要補全;很遺憾的是go依然沒有幫助自動補全。補全方式有多種,一般常見的是zeropadding,pkcs5padding,pkcs7padding。

參考golang aes/ecb/pkcs5 加密解密 url-safe-base64

部落格使用的是pkcs5padding,這裡補上zeropadding。

123

4567

891011

12

func zeropadding(ciphertext byte, blocksize int) byte , padding) 

}func zerounpadding(origdata byte) byte )

}

附上我寫的填充key的**:

123

4567

891011

1213

1415

1617

18

func keypadding(key string) (keybyte byte) 

return keybyte

}

1
bytes.join(pbytes, byte(""))
第二個引數表示陣列間用什麼去間隔

binary.bigendian.putuint64

例如strings.index(str, 「modules」),返回的是開始出現」modules」的位置,即」m」。

1
strings.replace(strings.trim(fmt.sprint(bytearr),""), " ", ",", -1)

1
strconv.parseuint(data, 16, 8)
data:字元,16:進製,8:轉換資料的大小,8則是8bit。

RSA加密解密

rsa加密使用公鑰加密,使用私鑰解密,rsa可以自己隨機生成一組公鑰和私鑰 rsa隨機生成一組公鑰和秘鑰 隨機生成公鑰和秘鑰 沒建立乙個rsacryptoserviceprovider物件,能生成一組隨機的秘鑰,物件相同不管執行多少次方法都是生成的同一組秘鑰 公鑰 私鑰 public static ...

RSA加密解密

rsautil.j a package com.soc.cloud.util import com.soc.cloud.exception.commonerror import com.soc.cloud.param.baseerrresult import com.soc.cloud.util.r...

RSA 加密解密記錄

rsa 加密長度有限,一般只使用在重要的資料上,過長需要拼接。private static void create oaepvar msg 加密測試資訊 rsacryptoserviceprovider rsa new 使用rsa加密。rsa.importcspblob convert.fromba...