區塊鏈加密算法小探(二)

前言

上篇咱們大概認識了哈希,對稱和非對稱加密算法,混合加密機制,這一次繼續認識下OpenSSL加密標準,PKI加密體系,以及同態加密的概念。算法

(5)OpenSSL標準

OpenSSL 是一個安全套接字層密碼庫,囊括主要的密碼算法、經常使用的密鑰和證書封裝管理功能及SSL()協議,並提供豐富的應用程序供測試或其它目的使用。數據庫

OpenSSL並非一種加密算法,它只是爲加密算法提供了一個標準。咱們這裏用OpenSSL加密標準實現如下RSA加密。安全

""" @author: chaors @file: RSA.py @time: 2018/04/10 21:00 @desc: 非對稱加密算法:openSSL """

import rsa
import base64  #編碼庫
from OpenSSL.crypto import PKey  #處理公鑰
from OpenSSL.crypto import TYPE_RSA, FILETYPE_PEM, FILETYPE_ASN1  #處理文件
from OpenSSL.crypto import dump_privatekey, dump_publickey  #key寫入文件

pk = PKey()  #調用openssl加密標準
pk.generate_key(TYPE_RSA, 1024)  #1024位rsa類型
print(pk)

#祕鑰寫入文件
pubkey_file = dump_publickey(FILETYPE_PEM, pk)
privatekey_file = dump_privatekey(FILETYPE_ASN1, pk)

#祕鑰讀取
pubkey = rsa.PublicKey.load_pkcs1_openssl_pem(pubkey_file)
privatekey = rsa.PrivateKey.load_pkcs1(privatekey_file, "DER")
# privatekey1 = rsa.PublicKey.load_pkcs1_openssl_pem(privatekey_file)

print(pubkey.save_pkcs1())
print(privatekey.save_pkcs1())
# print(pubkey, privatekey, privatekey1)

data = rsa.encrypt("自古多情空餘恨,此恨綿綿無絕期".encode("utf-8"), pubkey)  #加密
data = base64.b64encode(data)
print(data)
data_d = rsa.decrypt(base64.b64decode(data), privatekey)  #解密
print(data_d.decode("utf-8"))
複製代碼

(6)PKI加密體系

PKI並不表明某個特定的密碼學技術和流程,PKI是創建在公私鑰基礎上實現安全可靠傳遞消 息和身份確認的一個通用框架。實現了PKI的平臺能夠安全可靠地管理網絡中用戶的密鑰和 證書,包括多個實現和變種,知名的有RSA公司的PKCS(Public Key CryptographyStandards)標準和X.509規範等。bash

通常狀況下,PKI至少包括以下組件:網絡

  • CA(Certification Authority):負責證書的頒發和做廢,接收來自RA的請求,是最核心的部分;框架

  • RA(Registration Authority):對用戶身份進行驗證,校驗數據合法性,負責登記,審覈過了就發給CA;dom

  • 證書數據庫:存放證書,通常採用LDAP目錄服務,標準格式採用X.500 系列。函數

CA 是最核心的組件,主要完成對證書的管理。工具

常見的流程爲,用戶經過RA 登記申請證書,CA 完成證書的製造,頒發給用戶。用戶須要撤 銷證書則向CA 發出申請。post

以前章節內容介紹過,密鑰有兩種類型:用於簽名和用於加解密,對應稱爲 簽名密鑰對 和 加 密密鑰對 。

用戶證書能夠有兩種方式。通常能夠由 CA 來生成證書和私鑰;也能夠本身生成公鑰和私鑰, 而後由 CA 來對公鑰進行簽發。後者狀況下,當用戶私鑰丟失後,CA 沒法完成恢復。

PKI體系的簡單使用
""" @author: chaors @file: PKIDemo.py @time: 2018/04/10 21:56 @desc: PKI體系 """

from  Crypto import  Random  #隨機數
from  Crypto.Hash import SHA  #哈希
from Crypto.Cipher import PKCS1_v1_5 as CPKCS1_v1_5  #PKI體系加解密標準
from  Crypto.Signature import PKCS1_v1_5 as SPKCS1_v1_5  #PKI體系簽名標準
from Crypto.PublicKey import RSA
import base64

rand_maker = Random.new().read  #隨機數生成器
rsa = RSA.generate(1024, rand_maker)  #RSA實例
#生成祕鑰
public_pem = rsa.publickey().exportKey()
private_pem = rsa.exportKey()

#保存祕鑰
with open("master-public.pem", "wb") as file:
    file.write(public_pem)
with open("master-private.pem", "wb") as file:
    file.write(private_pem)

msg = "桃花樹下桃花庵"
#加解密
with open("master-public.pem", "rb") as file:  #讀取公鑰加密
    key = file.read()  #讀取key
    rsakey = RSA.importKey(key)  #導入key
    cipher = CPKCS1_v1_5.new(rsakey)  #遵循KPI標準
    cipher_txt = base64.b64encode(cipher.encrypt(msg.encode()))
    print("PKI encrypt:", cipher_txt)

with open("master-private.pem", "rb") as file:  #讀取私鑰解 密
    key = file.read()  #讀取key
    rsakey = RSA.importKey(key)  #導入key
    cipher = CPKCS1_v1_5.new(rsakey)  #遵循KPI標準
    txt = cipher.decrypt(base64.b64decode(cipher_txt), rand_maker)
    print("PKI decrypt:", txt.decode())

#簽名
with open("master-private.pem", "rb") as file:  #讀取私鑰簽名
    key = file.read()  #讀取key
    rsakey = RSA.importKey(key)  #導入key
    signer = SPKCS1_v1_5.new(rsakey)  #PKI體系簽名工具
    digest = SHA.new()  #簽名算法
    digest.update(msg.encode())  #導入簽名數據
    sign = signer.sign(digest)  #簽名
    signature = base64.b64encode(sign)  #編碼
    print("PKI Sign:", signature)

with open("master-public.pem", "rb") as file:  #讀取公鑰驗籤
    key = file.read()  # 讀取key
    rsakey = RSA.importKey(key)  # 導入key
    signer = SPKCS1_v1_5.new(rsakey)  # PKI體系簽名工具
    digest = SHA.new()  # 簽名算法
    digest.update(msg.encode())  # 導入簽名數據
    print("PKI SignVerify:", signer.verify(digest, base64.b64decode(signature)))
複製代碼

(7)同態加密

同態加密(Homomorphic Encryption)是一種特殊的加密方法,容許對密文進行處理獲得仍 然是加密的結果,即對密文直接進行處理,跟對明文進行處理再加密,獲得的結果相同。從 代數的角度講,即同態性。

同態加密在雲時代的意義十分重大。目前,從安全角度講,用戶還不敢將敏感信息直接放到 第三方雲上進行處理。若是有了比較實用的同態加密技術,則你們就能夠放心的使用各類雲 服務了。遺憾的是,目前已知的同態加密技術須要消耗大量的計算時間,還遠達不到實用的水平。

若是咱們有一個加密函數 f , 把明文A變成密文A’, 把明文B變成密文B’,也就是說 f(A) = A’ , f(B) = B’ 。另外咱們還有一個解密函數 f1可以將 f 加密後的密文解密成加密前的明文。

對於通常的加密函數,若是咱們將A’和B’相加,獲得C’。咱們用f1對C’進行解密獲得的結果通常是毫無心義的亂碼。

可是,若是 f 是個能夠進行同態加密的加密函數, 咱們對C’使用 f1進行解密獲得結果C, 這時候的C = A + B。

""" @author: chaors @file: HomomorphicEncryption.py @time: 2018/04/10 22:33 @desc: 同態加密 """

import numpy as np

#製造key
def create_key(w, m, n):
    S = (np.random.rand(m, n)*w/(2**16))  #隨機數 max(S) < w

    return S
#加密
def encypt(x,
           S,  #祕鑰
           m,
           n,  #範圍
           w):  #向量
    e = (np.random.rand(m))  #隨機數
    c = np.linalg.inv(S).dot((w*x)+e)  #加密

    return c
#解密
def decrypt(c, S, w):

    return (S.dot(c)/w).astype("int")  #解密

if __name__ == '__main__':
    x = np.array([1, 99, 250, 999, 33, 66, 512, 4096])
    print("x:",x)

    m = len(x)
    n = m
    w = 16
    S = create_key(w, m, n)
    print("key:", S)
    c = encypt(x, S, m, n, w)
    print("同態加密:", c)
    print("同態解密:", decrypt(c, S, w))
    #s*c = wx+e
複製代碼

這個同態加密小白我也是第一次聽,看着多少仍是有點懵逼。還不是太懂,不過今天就只能寫到這了。

相關文章
相關標籤/搜索