上篇咱們大概認識了哈希,對稱和非對稱加密算法,混合加密機制,這一次繼續認識下OpenSSL加密標準,PKI加密體系,以及同態加密的概念。算法
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"))
複製代碼
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 沒法完成恢復。
""" @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)))
複製代碼
同態加密(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
複製代碼
這個同態加密小白我也是第一次聽,看着多少仍是有點懵逼。還不是太懂,不過今天就只能寫到這了。