摘要:實現私鑰加密公鑰解密業界普遍的用法是公鑰用來加密,私鑰來解密,許多人卻不知道也可以用私鑰加密,公鑰來解密基礎知識對稱加密非對稱加密公私鑰的幾個常見格式圖片來源使用私鑰加密待編輯使用公鑰解密參考文檔的實現公鑰格式如下,若公鑰已經是格式,則無需
python 實現私鑰加密公鑰解密
業界普遍的用法是公鑰用來加密,私鑰來解密,許多人卻不知道也可以用私鑰加密,公鑰來解密
基礎知識 對稱加密 非對稱加密 公私鑰的幾個常見格式圖片來源: https://www.openssl.org/docs/...使用私鑰加密
待編輯
使用公鑰解密參考文檔:
https://www.cnblogs.com/masak...python2.7 的實現
https://www.linuxidc.com/Linu...
from rsa import PublicKey, common, transform, core # 公鑰格式如下,若公鑰已經是 RSAPublicKey 格式,則無需將 pub key 轉換為 string PUB_KEY_STRING = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCsKfRext58G0buLDabQQNBVWEB1/B62PapiZ2tSiITw/3X4cI00QB6m7dryMqs7pKntUD3MTGeMCj9zwXX0kmqkrA8og0H0eOHQnAeuw671lkSVYnD1YVcICPv+fbJ1JL+DP3RkXuy0+V2iQC2GDQmfgTcKVowU4c+ToQIp0pUBQIDAQAB" class DecryptByPublicKey(object): """ 使用 publib key來解密用primary key加密后生成的base64類型的密文 返回解密后的數據 """ def __init__(self, encrypt_text): self.encrypt_text = encrypt_text @staticmethod def str2key(s): # 對字符串解碼, 解碼成功返回 模數和指數 b_str = base64.b64decode(s) if len(b_str) < 162: return False hex_str = "" # 按位轉換成16進制 for x in b_str: h = hex(ord(x))[2:] h = h.rjust(2, "0") hex_str += h # 找到模數和指數的開頭結束位置 m_start = 29 * 2 e_start = 159 * 2 m_len = 128 * 2 e_len = 3 * 2 modulus = hex_str[m_start:m_start + m_len] exponent = hex_str[e_start:e_start + e_len] return modulus,exponent @staticmethod def f(cipher, PUBLIC_KEY): """ decrypt msg by public key """ public_key = PublicKey.load_pkcs1(PUBLIC_KEY) encrypted = transform.bytes2int(cipher) decrypted = core.decrypt_int(encrypted, public_key.e, public_key.n) text = transform.int2bytes(decrypted) if len(text) > 0 and text[0] == "x01": pos = text.find("x00") if pos > 0: return text[pos+1:] else: return None def pub_decrypt_with_pubkeystr(self): """ 將 base64 編碼的 pub_key 轉成 bio 對象, 再將bio對象轉換成公鑰對象 """ # 將 pub key 轉換為 string # Note: 若公鑰已經是 RSAPublicKey 格式,則無需執行這一步 ! try: key = self.str2key(PUB_KEY_STRING) # 將 base64 編碼的公鑰進行拆解,取出模數和指數 if not key: raise Exception, "decode public key falid" modulus = int(key[0], 16) exponent = int(key[1], 16) rsa_pubkey = PublicKey(modulus, exponent) # 根據模數和指數生成 pubkey 對象 self.pub_key = rsa_pubkey.save_pkcs1() # 將 pubkey 對象導出為 RSAPublicKey 格式的公鑰 except Exception, e: assert False, "Invalid public_key" # 開始解密 try: ret = self.f(self.encrypt_text.decode("base64"), self.pub_key) except Exception, e: self.error_info = str(e) assert False, "Decrypt by public key fails! Invalid encrypt_text" return ret if __name__ == "__main__": encrypt_text = "xxxxxx" # encrypt_text 是被私鑰加密后的密文 decrypt = DecryptByPublicKey(encrypt_text) result = decrypt.pub_decrypt_with_pubkeystr() print resultpython3 的實現
# 系統庫 import six import logging import coloredlogs # 第三方庫 import rsa import base64 p = logging.getLogger() console_formatter = logging.StreamHandler() console_formatter.setFormatter(coloredlogs.ColoredFormatter("%(asctime)s - %(module)-14s[line:%(lineno)3d] - %(levelname)-8s: %(message)s")) p.addHandler(console_formatter) p.setLevel(logging.DEBUG) PUB_KEY_STRING = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCsKfRext58G0buLDabQQNBVWEB1/B62PapiZ2tSiITw/3X4cI00QB6m7dryMqs7pKntUD3MTGeMCj9zwXX0kmqkrA8og0H0eOHQnAeuw671lkSVYnD1YVcICPv+fbJ1JL+DP3RkXuy0+V2iQC2GDQmfgTcKVowU4c+ToQIp0pUBQIDAQAB" class DecryptByPublicKey(object): """ 先產生模數因子 然后生成rsa公鑰 再使用rsa公鑰去解密傳入的加密str """ def __init__(self, encrypt_text): self._encrypt_text = encrypt_text self._pub_string_key = PUB_KEY_STRING # 使用公鑰字符串求出模數和因子 self._modulus = None # 模數 self._exponent = None # 因子 # 使用PublicKey(模數,因子)算出公鑰 self._pub_rsa_key = None def _gen_modulus_exponent(self, s) ->int: p.debug("Now base64 decode pub key,return modulus and exponent") # 對字符串解碼, 解碼成功返回 模數和指數 b_str = base64.b64decode(s) if len(b_str) < 162: return False hex_str = b_str.hex() # 找到模數和指數的開頭結束位置 m_start = 29 * 2 e_start = 159 * 2 m_len = 128 * 2 e_len = 3 * 2 self._modulus = int(hex_str[m_start:m_start + m_len], 16) self._exponent = int(hex_str[e_start:e_start + e_len], 16) def _gen_rsa_pubkey(self): # 將pub key string 轉換為 pub rsa key p.debug("Now turn key string to rsa key") try: rsa_pubkey = rsa.PublicKey(self._modulus, self._exponent) # 賦值到_pub_rsa_key self._pub_rsa_key = rsa_pubkey.save_pkcs1() # p.debug("self._pub_rsa_key:{}".format(self._pub_rsa_key)) except Exception as e: p.error(e) p.error("Invalid public_key") raise e def decode(self) ->str: """ decrypt msg by public key """ p.debug("Now decrypt msg by public rsa key") b64decoded_encrypt_text = base64.b64decode(self._encrypt_text) public_key = rsa.PublicKey.load_pkcs1(self._pub_rsa_key) encrypted = rsa.transform.bytes2int(b64decoded_encrypt_text) decrypted = rsa.core.decrypt_int(encrypted, public_key.e, public_key.n) # p.debug("decrypted: {}".format(decrypted)) decrypted_bytes = rsa.transform.int2bytes(decrypted) # 這里使用了six庫的iterbytes()方法去模擬python2對bytes的輪詢 if len(decrypted_bytes) > 0 and list(six.iterbytes(decrypted_bytes))[0] == 1: try: raw_info = decrypted_bytes[decrypted_bytes.find(b"x00")+1:] except Exception as e: p.error(e) raise e return raw_info.decode("utf-8") def decrypt(self) -> str: """ 先產生模數因子 然后生成rsa公鑰 再使用rsa公鑰去解密 """ self._gen_modulus_exponent(self._pub_string_key) self._gen_rsa_pubkey() ret = self.decode() return ret if __name__ == "__main__": encrypt_text = "xxxxxx" # encrypt_text 是被私鑰加密后的密文 result = DecryptByPublicKey(encrypt_text).decrypt() p.info(result)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/42934.html
摘要:我們只考慮能解密就行明文公鑰加密,私鑰解密密文明文公鑰私鑰使用生成格式的公鑰私鑰文件。直接使用該密鑰需要轉換為格式公鑰私鑰,密鑰字符串不需要。庫安裝會有環境問題,直接安裝成功,安裝失敗。 記錄一次項目使用RSA加解密 項目使用Java和Python在開發,RSA加密解密互通代碼: Python代碼 # -*- coding: utf-8 -*- RSA加解密 import base...
摘要:最近在寫接口的時候,遇到了需要使用加密和加密的情況,對方公司提供的都是的,我需要用來實現。于是,小明通過事先老板給他的公鑰來加密情報。使用對方公司的公鑰對所有的參數進行加密,加密之后進行編碼。 最近在寫接口的時候,遇到了需要使用RSA加密和PBE加密的情況,對方公司提供的DEMO都是JAVA的,我需要用python來實現。在網上搜了一下,python的RSA加密這塊寫的還是比較多的,但...
摘要:非對稱加密,加密與解密使用的密鑰不是同一密鑰,對中一個對外公開,稱為公鑰,另一個只有所有者知道,稱為私鑰。對稱加密算法不能實現簽名,因此簽名只能非對稱算法。正因為,這種加密是單向的,所以被稱為非對稱加密算法。 非對稱加密,加密與解密使用的密鑰不是同一密鑰,對中一個對外公開,稱為公鑰,另一個只有所有者知道,稱為私鑰。用公鑰加密的信息只有私鑰才能解開,反之,用私鑰加密的信息只有公鑰才能解開...
摘要:是目前最有影響力的公鑰加密算法,它能夠抵抗到目前為止已知的所有密碼攻擊,已被推薦為公鑰數據加密標準。算法基于一個十分簡單的數論事實將兩個大素數相乘十分容易,但那時想要對其乘積進行因式分解卻極其困難,因此可以將乘積公開作為加密密鑰。 在編程中,我們為了保證數據安全,免不了要經常進行數據加密,于是產生了各種各樣的加密算法.無論怎樣,都還是存在被破解的風險.今天就來說說RSA算法. 背景 R...
摘要:時間年月日星期三說明本文部分內容均來自慕課網。秘密密鑰,生成一個分組的秘密密鑰。 時間:2017年4月12日星期三說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.com教學示例源碼:https://github.com/zccodere/s...個人學習源碼:https://github.com/zccodere/s... 第一章:概述 1-1 概述 非對稱...
閱讀 2097·2023-04-26 02:41
閱讀 2152·2021-09-24 09:47
閱讀 1553·2019-08-30 15:53
閱讀 1211·2019-08-30 13:01
閱讀 1892·2019-08-29 11:27
閱讀 2867·2019-08-28 17:55
閱讀 1764·2019-08-26 14:00
閱讀 3392·2019-08-26 10:18