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

資訊專欄INFORMATION COLUMN

python 實(shí)現(xiàn)私鑰加密公鑰解密

lewinlee / 2288人閱讀

摘要:實(shí)現(xiàn)私鑰加密公鑰解密業(yè)界普遍的用法是公鑰用來加密,私鑰來解密,許多人卻不知道也可以用私鑰加密,公鑰來解密基礎(chǔ)知識對稱加密非對稱加密公私鑰的幾個(gè)常見格式圖片來源使用私鑰加密待編輯使用公鑰解密參考文檔的實(shí)現(xiàn)公鑰格式如下,若公鑰已經(jīng)是格式,則無需

python 實(shí)現(xiàn)私鑰加密公鑰解密

業(yè)界普遍的用法是公鑰用來加密,私鑰來解密,許多人卻不知道也可以用私鑰加密,公鑰來解密

基礎(chǔ)知識 對稱加密 非對稱加密 公私鑰的幾個(gè)常見格式
圖片來源: https://www.openssl.org/docs/...

使用私鑰加密

待編輯

使用公鑰解密

參考文檔:

https://www.cnblogs.com/masak...
https://www.linuxidc.com/Linu...
python2.7 的實(shí)現(xiàn)
from rsa import PublicKey, common, transform, core

# 公鑰格式如下,若公鑰已經(jīng)是 RSAPublicKey 格式,則無需將 pub key 轉(zhuǎn)換為 string
PUB_KEY_STRING = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCsKfRext58G0buLDabQQNBVWEB1/B62PapiZ2tSiITw/3X4cI00QB6m7dryMqs7pKntUD3MTGeMCj9zwXX0kmqkrA8og0H0eOHQnAeuw671lkSVYnD1YVcICPv+fbJ1JL+DP3RkXuy0+V2iQC2GDQmfgTcKVowU4c+ToQIp0pUBQIDAQAB"

class DecryptByPublicKey(object):
    """
    使用 publib key來解密用primary key加密后生成的base64類型的密文
    返回解密后的數(shù)據(jù)
    """
    def __init__(self, encrypt_text):
        self.encrypt_text = encrypt_text

    @staticmethod
    def str2key(s):
        # 對字符串解碼, 解碼成功返回 模數(shù)和指數(shù)
        b_str = base64.b64decode(s)
        if len(b_str) < 162:
            return False
        hex_str = ""
        # 按位轉(zhuǎn)換成16進(jìn)制
        for x in b_str:
            h = hex(ord(x))[2:]
            h = h.rjust(2, "0")
            hex_str += h
        # 找到模數(shù)和指數(shù)的開頭結(jié)束位置
        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 轉(zhuǎn)成 bio 對象,
        再將bio對象轉(zhuǎn)換成公鑰對象
        """
        # 將 pub key 轉(zhuǎn)換為 string
        # Note: 若公鑰已經(jīng)是 RSAPublicKey 格式,則無需執(zhí)行這一步 !
        try:
            key = self.str2key(PUB_KEY_STRING) # 將 base64 編碼的公鑰進(jìn)行拆解,取出模數(shù)和指數(shù)
            if not key:
                raise Exception, "decode public key falid"
            modulus = int(key[0], 16)
            exponent = int(key[1], 16)
            rsa_pubkey = PublicKey(modulus, exponent) # 根據(jù)模數(shù)和指數(shù)生成 pubkey 對象
            self.pub_key = rsa_pubkey.save_pkcs1()    # 將 pubkey 對象導(dǎo)出為 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 result
python3 的實(shí)現(xiàn)
# 系統(tǒng)庫
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):
    """
        先產(chǎn)生模數(shù)因子
        然后生成rsa公鑰
        再使用rsa公鑰去解密傳入的加密str
    """
    def __init__(self, encrypt_text):
        self._encrypt_text = encrypt_text
        self._pub_string_key = PUB_KEY_STRING
        # 使用公鑰字符串求出模數(shù)和因子
        self._modulus = None   # 模數(shù)
        self._exponent = None  # 因子
        # 使用PublicKey(模數(shù),因子)算出公鑰
        self._pub_rsa_key = None

    def _gen_modulus_exponent(self, s) ->int:
        p.debug("Now base64 decode pub key,return modulus and exponent")
        # 對字符串解碼, 解碼成功返回 模數(shù)和指數(shù)
        b_str = base64.b64decode(s)
        if len(b_str) < 162:
            return False
        hex_str = b_str.hex()
        # 找到模數(shù)和指數(shù)的開頭結(jié)束位置
        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 轉(zhuǎn)換為 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:
        """
        先產(chǎn)生模數(shù)因子
        然后生成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)

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

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

相關(guān)文章

  • Python&Java互通rsa加密解密

    摘要:我們只考慮能解密就行明文公鑰加密,私鑰解密密文明文公鑰私鑰使用生成格式的公鑰私鑰文件。直接使用該密鑰需要轉(zhuǎn)換為格式公鑰私鑰,密鑰字符串不需要。庫安裝會(huì)有環(huán)境問題,直接安裝成功,安裝失敗。 記錄一次項(xiàng)目使用RSA加解密 項(xiàng)目使用Java和Python在開發(fā),RSA加密解密互通代碼: Python代碼 # -*- coding: utf-8 -*- RSA加解密 import base...

    Arno 評論0 收藏0
  • Python的RSA加密和PBE加密

    摘要:最近在寫接口的時(shí)候,遇到了需要使用加密和加密的情況,對方公司提供的都是的,我需要用來實(shí)現(xiàn)。于是,小明通過事先老板給他的公鑰來加密情報(bào)。使用對方公司的公鑰對所有的參數(shù)進(jìn)行加密,加密之后進(jìn)行編碼。 最近在寫接口的時(shí)候,遇到了需要使用RSA加密和PBE加密的情況,對方公司提供的DEMO都是JAVA的,我需要用python來實(shí)現(xiàn)。在網(wǎng)上搜了一下,python的RSA加密這塊寫的還是比較多的,但...

    Tony_Zby 評論0 收藏0
  • 非對稱加密算法-RSA

    摘要:非對稱加密,加密與解密使用的密鑰不是同一密鑰,對中一個(gè)對外公開,稱為公鑰,另一個(gè)只有所有者知道,稱為私鑰。對稱加密算法不能實(shí)現(xiàn)簽名,因此簽名只能非對稱算法。正因?yàn)椋@種加密是單向的,所以被稱為非對稱加密算法。 非對稱加密,加密與解密使用的密鑰不是同一密鑰,對中一個(gè)對外公開,稱為公鑰,另一個(gè)只有所有者知道,稱為私鑰。用公鑰加密的信息只有私鑰才能解開,反之,用私鑰加密的信息只有公鑰才能解開...

    gggggggbong 評論0 收藏0
  • 聊聊公鑰私鑰

    摘要:是目前最有影響力的公鑰加密算法,它能夠抵抗到目前為止已知的所有密碼攻擊,已被推薦為公鑰數(shù)據(jù)加密標(biāo)準(zhǔn)。算法基于一個(gè)十分簡單的數(shù)論事實(shí)將兩個(gè)大素?cái)?shù)相乘十分容易,但那時(shí)想要對其乘積進(jìn)行因式分解卻極其困難,因此可以將乘積公開作為加密密鑰。 在編程中,我們?yōu)榱吮WC數(shù)據(jù)安全,免不了要經(jīng)常進(jìn)行數(shù)據(jù)加密,于是產(chǎn)生了各種各樣的加密算法.無論怎樣,都還是存在被破解的風(fēng)險(xiǎn).今天就來說說RSA算法. 背景 R...

    Stardustsky 評論0 收藏0
  • 慕課網(wǎng)_《Java實(shí)現(xiàn)非對稱加密》學(xué)習(xí)總結(jié)

    摘要:時(shí)間年月日星期三說明本文部分內(nèi)容均來自慕課網(wǎng)。秘密密鑰,生成一個(gè)分組的秘密密鑰。 時(shí)間:2017年4月12日星期三說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)示例源碼:https://github.com/zccodere/s...個(gè)人學(xué)習(xí)源碼:https://github.com/zccodere/s... 第一章:概述 1-1 概述 非對稱...

    dailybird 評論0 收藏0

發(fā)表評論

0條評論

lewinlee

|高級講師

TA的文章

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