分類:
摘要算法使用密碼學hash函數,用於驗證數據完整性(沒有修改、插入、刪除、或重放)。找到兩個不同數據具有相同hash值的難度高。
輸入數據的長度首先被填充為某固定長度分組的整數倍,填充的內容包括原始數據的位長度信息。安全性要求如下兩種情況在計算上不可行(即沒有攻擊方法比窮舉攻擊更有效):
Hash算法壹般是指Hash表的摘要算法,將不同的鍵值分散到不同的數組位置,允許少量的沖突碰撞。安全Hash算法(SHA)是使用最廣泛的Hash函數
摘要函數——MD2/MD4/MD5數字簽名
又稱密碼校驗和,利用密鑰 K 和可變長度的數據 M 生成固定長度的短數據塊 MAC ,並將數據塊附加在數據M之後:
$$
MAC = C(K, M)
$$
若對於數據的保密性要求不高(例如廣播),可直接將消息 M 和 MAC 壹起發給接受者,接收者收到後使用相同的密鑰 K 和MAC函數 C 對消息 M 計算得出 MAC2 ,再對比兩者是否相等。(這裏設定通信雙方***享相同的密鑰 K )
若對於數據的保密性要求嚴格,可選擇將消息 M 和 MAC 加密再發送:
$$
ENC = E(K_2, M||C(K_1,M))
$$
接收者收到數據後首先解密。
HMAC將Hash函數視為黑盒,將現有Hash函數作為壹個模塊,預先封裝,在需要時直接使用。
OFB與CFB都采用將分組加密轉換成流加密的方式
如圖,用自己的話來描述就是缺多少bit,就在每個bit裏填多少。該方式是8分組結構,只適合DES/3DES。
密鑰運算包含兩種操作(私鑰操作、公鑰操作),簽名驗簽正是基於這兩種操作:
$$
C=P^d mod n
$$
$$
P=C^d mod n
$$
使用簽名的前提是使用公鑰加密的密文只有私鑰才能解開,使用私鑰加密的密文只有公鑰才能解開,確保了身份認證抗抵賴性。
過程:
至於填充模式,定義在PKCS#1: 00||BT||PS||00||D
使用RSA公鑰運算,過程如下:
用途:用於非對稱傳輸信息,比如Bob有壹個信息想傳給Alice,需使用Alice的公鑰加密信息,傳給Alice,Alice得到加密信息後使用自己的私鑰即可解開讀取信息。他人即使截獲加密信息也無法解開,利用了大數分解難題。
使用RSA私鑰運算,過程如下:
以上可以看出,私鑰解密和簽名的運算過程壹致!
定義RSA公私鑰數據表達形式,及加密,解密,簽名,驗簽,填充過程,定義了數字簽名如何計算,包括簽名數據和簽名本身的格式。
RSA公鑰的ASN.1結構,可以表述為:名為RSAPublicKey的這個結構呢,就可以用來表述壹個RSA公鑰了。它有兩個INTEGER型變量:modulus和publicExponent。
以下是對PKCS#1 OID的類型表示的定義
hashAlgorithm 支持的散列函數:
基於口令的加密規範Password-Based Cryptography Specification
目的:保護私鑰文件的安全性
通過將原始口令+salt派生出新口令進行加密
PKSC5Padding(用於制定算法DES)對稱加密填充方式,填充塊固定為8個字節,填充值為待填充的長度,與PKCS7Padding類似。
加密消息的語法標準Cryptographic Message Syntax Version 1.5
結構:
pkcs7 各種類型數據結構的 DER 編解碼通過宏在 crypto/pkcs7/pk7_asn1.c 中實現
數字信封流程:(A:發送方;B:接收方;SK:私鑰;PK:公鑰)
常用的用途有:
PKCS#7結構分析之簽名
PKCS#7結構分析之數字信封
構造數字信封要能夠達到以下功能:
因此該結構應該包含:
私鑰封裝格式Private_Key Information Syntax Specification Version 1.2
定義了私鑰信息語法和加密私鑰語法。
私鑰類型任意,對稱算法可設置
證書請求格式(主題,公鑰,私鑰簽名)
RA註冊流程:註冊信息->審核通過->生成密鑰->生成PKCS10請求->將信息和P10請求的公鑰合並成CMP請求->發送到CA
介質接口格式:
對應於Windows的CSP,國密接口的SKF
帶私鑰的個人證書格式,包含私鑰、證書、證書鏈、CRL...
X.509證書與509黑名單規範
X.509數字證書主體如下:
壹個真實的X509數字證書包含:
以上結構表示壹個完整的數字證書,主要項如下:
DER 編解碼接口由宏在 crypto/asn1/x_x509.c 中實現,包括各自的new、free、i2d 和 d2i 函數:
Abstract Syntax Notation One,抽象語法標識,是與平臺、語言無關的數據結構定義語法
BER、CER、DER、XER,可以編碼成XML格式,不僅僅是常用的二進制流。
二進制流的TLV方式表達數據結構,如下:
證書撤銷列表(Certificate Revocation List,簡稱 CRL),是壹種包含撤銷的證書列表的簽名數據結構。基本的 CRL 信息有:被撤銷證書序列號、撤銷時間、撤銷原因、簽名者以及 CRL 簽名等信息。
被撤銷證書的信息:X509_REVOKED
crl信息主體:
完整crl數據結構:
輕量目錄訪問協議(Lightweight Directory Access Protocol),運行於TCP/IP之上。
目錄的信息按照樹型結構組織,數據結構:
在線證書狀態協議(Online Certificate Status Protocol)
數據格式:
OCSP響應端檢測:
雙證書即雙密鑰(簽名密鑰對,加密密鑰對)
(附:我曾今將整理的文件使用壹款加密軟件加密,選擇加密密碼的時候由於自己記不住長密碼,又不想將長密碼以任何形式記錄下來,於是決定使用自認為固定的文件作為密鑰,然後當再次使用文件解密的時候,被告知不是該文件。才想起,這個當時在我看來是固定的文件,由於版本需要被我修改了!整理的三個月的文件就這樣脫胎換骨成了0110...)
主要操作包括產生私鑰(key),構造證書請求(req),簽發用戶證書,自簽發根證書。
對稱算法和摘要算法全局初始化: OpenSSL_add_all_algorithms();
釋放句柄: EVP_MD_CTX_cleanup(&ctx);
公司加密郵件為標準SMIME格式,導出後得到.eml文件
使用 PKCS7 *SMIME_read_PKCS7(BIO *bio, BIO **bcont) 將bio讀取到的SMIME格式保存在PKCS7格式內,然後通過PKCS7_dncrypt接口解密
錯誤處理應該盡可能多的包含各種信息,包括:
ERR_get_error獲取第壹個錯誤號
ERR_error_string根據錯誤碼獲取具體的錯誤信息,包括出錯的庫、出錯的函數以及出錯原因
ERR_print_errors_fp將錯誤打印到FILE中