1. 程式人生 > >Openssl之PEM系列

Openssl之PEM系列

1.PEM編碼檔案結構介紹 
PEM全稱是Privacy Enhanced Mail,該標準定義了加密一個準備要傳送郵件的標準,主要用來將各種物件儲存成PEM格式,並將PEM格式的各種物件讀取到相應的結構中。它的基本流程是這樣的: 1. 資訊轉換為ASCII碼或其它編碼方式; 2. 使用對稱演算法加密轉換了的郵件資訊; 
3. 使用BASE64對加密後的郵件資訊進行編碼; 
4. 使用一些頭定義對資訊進行封裝,這些頭資訊格式如下(不一定都需要,可選的): 
Proc-Type,4:ENCRYPTED   
 DEK-Info: cipher-name, ivec其中,第一個頭資訊標註了該檔案是否進行了加密,該頭資訊可能的值包括ENCRYPTED(資訊已經加密和簽名)、MIC-ONLY(資訊經過數字簽名但沒有加密)、MIC-CLEAR(資訊經過數字簽名但是沒有加密、也沒有進行編碼,可使用非PEM格式閱讀)以及CLEAR(資訊沒有簽名和加密並且沒有進行編碼,該項好象是openssl自身的擴充套件,但是並沒有真正實現);;第二個頭資訊標註了加密的演算法以及使用的ivec參量,ivec其實在這兒提供的應該是一個隨機產生的資料序列,與塊加密演算法中要使用到的初始化變數(IV)不一樣。 
5. 在這些資訊的前面加上如下形式頭標註資訊: 
-----BEGIN PRIVACY-ENHANCED MESSAGE----- 在這些資訊的後面加上如下形式尾標註資訊: -----END PRIVACY-ENHANCED MESSAGE----- 
上面是openssl的PEM檔案的基本結構,需要注意的是,Openssl並沒有實現PEM的全部標準,它只是對openssl中需要使用的一些選項做了實現,詳細的PEM格式,請參考RFC1421-1424。 
下面是一個PEM編碼的經過加密的DSA私鑰的例子: -----BEGIN DSA PRIVATE KEY----- Proc-Type: 4,ENCRYPTED 
DEK-Info: DES-EDE3-CBC,F80EEEBEEA7386C4  
GZ9zgFcHOlnhPoiSbVi/yXc9mGoj44A6IveD4UlpSEUt6Xbse3Fr0KHIUyQ3oGnSmClKoAp/eOTb5Frhto85SzdsxYtac+X1v5XwdzAMy2KowHVk1N8A5jmE2OlkNPNtof132MNlo2cyIRYaa35PPYBGNCmUm7YcYS8O90YtkrQZZTf4+2C4kllhMcdkQwkrFWSWC8YOQ7w0LHb4cX1FejHHom9Nd/0PN3vn3UyySvfOqoR7nbXkrpHXmPIr0hxXRcF0aXcV/CzZ1/nfXWQf4o3+oD0T22SDoVcZY60IzI0oIc3pNCbDV3uKNmgekrFdqOUJ+QW8oWp7oefRx62iBfIeC8DZunohMXaWAQCU0sLQOR4yEdeUCnzCSywe0bG1diD0KYaEe+Yub1BQH4aLsBgDjardgpJRTQLq0DUvw0/QGO1irKTJzegEDNVBKrVnV4AHOKT1CUKqvGNRP1UnccUDTF6miOAtaj/qpzra7sSk7dkGBvIEeFoAg84kfh9hhVvF1YyzC9bwZepruoqoUwke/WdNIR5ymOVZ/4Liw0JdIOcq+atbdRX08niqIRkfdsZrUj4leo3zdefYUQ7w4N2Ns37yDFq7 
-----END DSA PRIVATE KEY----- 

有時候PEM編碼的東西並沒有經過加密,只是簡單進行了BASE64編碼,下面是一個沒有加密的證書請求的例子

-----BEGIN CERTIFICATE REQUEST----- 
MIICVTCCAhMCAQAwUzELMAkGA1UEBhMCQVUxEzARBgNVBAgTClNvbWUtU3RhdGUxITAfBgNVBAoTGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEMMAoGA1UEAxMDUENBMIIBtTCCASkGBSsOAwIMMIIBHgKBgQCnP26Fv0FqKX3wn0cZMJCaCR3aajMexT2GlrMV4FMuj+BZgnOQPnUxmUd6UvuF5NmmezibaIqEm4fGHrV+hktTW1nPcWUZiG7OZq5riDb77Cjcwtelu+UsOSZL2ppwGJU3lRBWI/YV7boEXt45T/23Qx+1pGVvzYAR5HCVW1DNSQIVAPcHMe36bAYD1YWKHKycZedQZmVvAoGATd9MA6aRivUZb1BGJZnlaG8w42nh5bNdmLsohkj83pkEP1+IDJxzJA0gXbkqmj8YlifkYofBe3RiU/xhJ6h6kQmdtvFNnFQPWAbuSXQHzlV+I84W9srcWmEBfslxtU323DQph2j2XiCTs9v15AlsQReVkusBtXOlan7YMu0OArgDgYUAAoGBAKbtuR5AdW+ICjCFe2ixjUiJJzM2IKwe6NZEMXg39+HQ1UTPTmfLZLps+rZfolHDXuRKMXbGFdSF0nXYzotPCzi7GauwEJTZyr27ZZjA1C6apGSQ9GzuwNvZ4rCXystVEagAS8OQ4H3D4dWS17Zg31ICb5o4E5r0z09o/Uz46u0VoAAwCQYFKw4DAhsFAAMxADAuAhUArRubTxsbIXy3AhtjQ943AbNBnSICFQCu+g1iW3jwF+gOcbroD4S/ZcvB3w== 
-----END CERTIFICATE REQUEST----- 


可以看到,該檔案沒有了前面兩個頭資訊。大家如果經常使用openssl的應用程式,就對這些檔案格式很熟悉了。 
2.PEM型別和實現結構介紹 
openssl中定義的PEM相關結構體如下(openssl\pem.h),這些結構體是所有PEM系列函式的基礎。 下面定義的是PEM一個高層應用結構,該結構通過PEM_SealInit進行初始化,最後使用PEM_SealFinal進行釋放,該結構定義了PEM中要使用的編碼演算法、資訊摘要演算法以及加密演算法。 
typedef struct PEM_Encode_Seal_st { 
EVP_ENCODE_CTX encode; EVP_MD_CTX md; 
EVP_CIPHER_CTX cipher; } PEM_ENCODE_SEAL_CTX; 
下面定義了PEM_CTX中的一個子結構,用來儲存使用者的資訊 typedef struct pem_recip_st { 
char *name; 
X509_NAME *dn; int cipher; int key_enc; } PEM_USER; 
下面是PEM主結構體PEM_CTX結構的定義,我們將在註釋裡面對必要的引數進行說明。 typedef struct pem_ctx_st { 
int type;//結構型別 struct { 
int version;//版本號 int mode;//編碼方式 
} proc_type;//Proc_Type欄位資訊,包括版本號和編碼方式 char *domain; 

未完待整理。。。http://wenku.baidu.com/link?url=bQ6a-dI3jRhmj2WYDkvNkgiSKc4K1Wj5pn63V5V1aPOVdBiXWLfqOkoTaJJNshWWoGjdIRx1GTNGBpZ5f64_gVIwQ7b2TfUwYNCcl14HfPK

相關推薦

OpensslPEM系列

1.PEM編碼檔案結構介紹  PEM全稱是Privacy Enhanced Mail,該標準定義了加密一個準備要傳送郵件的標準,主要用來將各種物件儲存成PEM格式,並將PEM格式的各種物件讀取到相應的結構中。它的基本流程是這樣的: 1. 資訊轉換為ASCII碼或其它編碼方式

opensslBIO系列22---Cipher類型的BIO

能夠 lte net 操作 適應 signed tar sign 論壇 Cipher類型BIO ---依據openssl doc\crypto\bio_f_cipher.pod翻譯和自己的理解寫成 (作者:DragonKing, Mail: [email

opensslBIO系列12---文件描寫敘述符(fd)類型BIO

scrip 所在 pri 返回 div static 實現 論壇 res 文件描寫敘述符(fd)類型BIO ---依據openssl doc\crypto\bio_s_fd.pod翻譯和自己的理解寫成 (作者:DragonKing [email 

opensslBIO系列6---BIO的IO操作函數

長度 沒有 ons lin mail crypto 可能 說明文 作者 BIO的IO操作函數 ---依據openssl doc/crypto/bio/bio_read.pod翻譯和自己的理解寫成 (作者:DragonKing Mail:[ema

opensslEVP系列10---EVP_Sign系列函數介紹

一個 ror 數據 spa 不一定 工作 pop col clas openssl之EVP系列之10---EVP_Sign系列函數介紹 ---依據openssl doc/crypto/EVP_SignInit.pod翻譯 (作者:DragonKing,

OpenSSLX509系列

net ota 同時 簽發證書 ner 標識 valid 學習 get OpenSSL之X509系列之1---引言和X509概述 【引言】 X509是系列的函數在我們開發與PKI相關的應用的時候我們都會用到,但是OpenSSL中對X509的描述並不是很多,鑒於些,我將

OpenSSLEVP(二)——EVP系列函式介紹

EVP系列函式 摘要函式 典型的摘要函式主要有: 1) EVP_md5 返回 md5 的 EVP_MD。 2) EVP_sha1 返回 sha1 的 EVP_MD。 3) EVP_sha256 返回 sha256 的 EVP_MD。 4)

5Python全棧系列IO多路復用

技術 多線程 課程 網絡連接 write Python全棧之路系列之IO多路復用What is IO Multiplexing?IO多路復用是指內核一旦發現進程指定的一個或者多個IO條件準備讀取,它就通知該進程。舉例說明你是一名老師(線程),上課了(啟動線程),這節課是自習課,學生都在自習

5Python全棧系列算法

import 英語 臺灣 空間 元素 ython全棧之路系列之算法一個算法的優劣可以用空間復雜度與時間復雜度來衡量。冒泡排序冒泡排序(英語:Bubble Sort,臺灣另外一種譯名為:泡沫排序)是一種簡單的排序算法。它重復地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交

1Python全棧系列Django初體驗

編寫程序 online 網絡開發 程序員 堪薩斯 Python全棧之路系列之Django初體驗Django不得不說在Python中是一個非常強大的全棧框架,而且入門也比較簡單,只要你學完了基本的Django知識,接著再做一兩個項目,不大不小就成,然後你再去學其它的框架你會發現,在那些小而美

2Python全棧系列Tornado的Cookie與Sess

requestPython全棧之路系列之Tornado的Cookie與Sess主要的代碼結構為:#!/usr/bin/env python # _*_coding:utf-8 _*_ import tornado.ioloop import tornado.web class MainHandler(to

5Python全棧系列Django模型續

模型續Python全棧之路系列之Django模型續連表操作一對一在app的models.py文件內添加以下內容用戶創建一對多關系的表:from django.db import models # Create your models here. class UserType(models.Model):

2Python全棧系列Django路由與視圖

request 配置文件 hello 文章 Python全棧之路系列之Django路由與視圖路由說白了就是與視圖(函數)的對應關系,怎麽說呢,一個路由對應一個視圖,比如上面文章中所提到的那樣,當打開/users/路徑的時候會讓users這個函數來進行邏輯處理,把處理的結果再返回到前端。那麽dj

10Python全棧系列深淺拷貝標準庫系列datetime模塊

格式轉換 字符串 Python標準庫系列之datetime模塊Fast implementation of the datetime type.功能說明datetime.date.today()打印輸出當前的系統日期datetime.date.fromtimestamp(time.time())將時間

1Python全棧系列MySQL數據庫基本操作

大型數據庫 數據庫管理 數據庫軟件 程序員 sql數據庫 Python全棧之路系列之MySQL數據庫基本操作MySQL數據庫介紹MySQL是一種快速易用的關系型數據庫管理系統(RDBMS),很多企業都在使用它來構建自己的數據庫。MySQL由一家瑞典公司MySQL AB開發、運營並予以支持。

4Python全棧系列MYSQL外鍵

sql外鍵Python全棧之路系列之MySQL外鍵先來個例子來說明什麽是外鍵以及外鍵的作用,so,XO公司現正處於一種迅速發展的狀態,從最初的12人的團隊發展到現在的300人,那麽問題就來了,發展的越快,人員與部門就越來越多,這是老大要求我們做一個人員管理系統,用於查詢入職人員的信息等。起初我們想用一個表來實

9Python全站系列MySQL SL註入

sql數據庫 password 應用程序 用戶名 字符串 Python全棧之路系列之MySQL SQL註入SQL註入是一種代碼註入技術,過去常常用於攻擊數據驅動性的應用,比如將惡意的SQL代碼註入到特定字段用於實施拖庫攻擊等。SQL註入的成功必須借助應用程序的安全漏洞,例如用戶輸入沒有經過

3Python全棧系列MySQL表內操作

s表內操作qlPython全棧之路系列之MySQL表內操作先創創建一個表用於測試-- 創建數據庫 CREATE DATABASE dbname DEFAULT CHARSET utf8 COLLATE utf8_general_ci; -- 創建表 CREATE TABLE `tb` ( `id` int

pythoncollection系列

python之collection系列1、計數器(counter)Counter是對字典類型的補充,用於追蹤值的出現次數。ps:具備字典的所有功能 + 自己的功能c = Counter(‘abcdeabcdabcaba‘)print c輸出:Counter({‘a‘: 5, ‘b‘: 4, ‘c‘: 3, ‘

Fiddler大師系列(一)

wow detach field font rul col 打開 時有 情況 江湖傳言,Fiddler是捕獲客戶端與服務器之間的所有HTTP(S) 請求的利器,但是在具體使用過程中,發現使用Fiddler進行抓包時有一部分請求總是沒到,多方苦尋之下發現客戶端使用WinIN