1. 程式人生 > >erlang 使用rsa加密及解密

erlang 使用rsa加密及解密

rsa是非對稱加密演算法,有公開祕鑰(publickey)和私有金鑰(privatekey),如果用公開金鑰對資料進行加密,只有用對應的私有金鑰才能解密;如果用私有金鑰對資料進行加密,那麼只有用對應的公開金鑰才能解密。在使用者賬號登入這塊就防止密碼洩露,除非祕鑰洩露。

在erlang使用rsa主要需要public_key模組,所有需要引入相關標頭檔案。

-include_lib("public_key/include/public_key.hrl").

生成公鑰祕鑰

讓客戶端每次登陸時都請求服務端生成新的公鑰祕鑰,也把生成結果放在socketpid的程序字典裡,斷開socket相當於重置。

set_private_key() ->
    %%獲取私鑰
    #'RSAPrivateKey'{modulus=Modulus, publicExponent=PublicExponent} = PrivateKey = public_key:generate_key({rsa, 1024, 65537}),
    %%獲取公鑰
    PublicKey = #'RSAPublicKey'{modulus=Modulus, publicExponent=PublicExponent},
    put(rsa_private_key, PrivateKey),
    put(rsa_public_key, PublicKey),
    {PrivateKey, PublicKey}.

注意1024是金鑰長度,目前主流可選值:1024、2048、3072、4096...低於1024bit的金鑰已經不建議使用(安全問題)。65537是公鑰指數,是隨意選的質素,但目前行業上公鑰指數普遍選的都是65537

RSA加密

en_rsa(BinData) ->
    %%公鑰加密
    PublicKey = get(rsa_public_key),
    Cipher = public_key:encrypt_public(BinData, PublicKey),
    Cipher.

RSA解密

de_rsa(BinData) ->
    PrivateKey = get(rsa_private_key),
    %%私鑰解密
    Result = public_key:decrypt_private(BinData, PrivateKey),
    Result.

公鑰轉視覺化字元

由於生成的公鑰是erlang Record的結構,客戶端無法識別,所以需要轉化

%%公鑰轉字串
key_to_list(PublicKey) ->
    binary_to_list(public_key:pem_encode([public_key:pem_entry_encode('SubjectPublicKeyInfo',PublicKey)])).