擷取自我的部落格:
因為專案需要,最近做乙個rsa加密解密的介面,使用go進行開發,介面使用jsonrpc,go 對rsa加密解密有很好的支援,不過由於受限於底層微控制器,所以上層應用需要做一些稍微的調整。
rsa是一種非對稱加密演算法,什麼是非對稱加密演算法呢,那就是公鑰、私鑰可互相進行加密解密:公鑰加密—私鑰解密,私鑰加密—公鑰解密。
了解rsa演算法的實現原理,可參考:非對稱加密過程詳解(基於rsa非對稱加密演算法實現)
什麼是pkcs#1,pkcs(公鑰密碼標準),而#1就是rsa的標準。
pem檔案,也就是公私鑰的編碼格式。
rsa演算法的原理:rsa演算法詳解,從這篇部落格主要是提取出rsa演算法的公式。
1
c=(p^e)%nn是公鑰私鑰共同使用的,其為模數。另外還有公鑰的指數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。
1234567
891011
12
func zeropadding(ciphertext byte, blocksize int) byte , padding)附上我寫的填充key的**:}func zerounpadding(origdata byte) byte )
}
1234567
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...