參考文獻 web
綜述 算法
1)信息保密:加密技術;•安全
2)信息完整行(無篡改):數字指紋;函數
3)身份認證:數字簽名;ui
4)身份可靠性(公鑰可靠性):數字證書。this
保密性,完整性,端點認證 編碼
加密技術:(1)加密算法;(2)祕鑰交換。 加密
數據加密 url
• 單向加密設計
• 數字簽名
• 對稱加密
• 非對稱加密
• 密鑰交換
單向加密
• 別名:數字摘要、數字簽名。
• 確保數據的完整性,不被篡改。
• 算法基礎:hash。
• 理論基礎:雪崩效應。
• md5(標準密鑰長度128位)、sha1(標準密鑰長度160位)
• - (NSData *) MD5Sum •{
• • •
unsigned char hash[CC_MD5_DIGEST_LENGTH];
(void) CC_MD5( [self bytes], (CC_LONG)[self length], hash );
return ( [NSData dataWithBytes: hash length: CC_MD5_DIGEST_LENGTH] );
•}
• - (NSData *) SHA1Hash •{
單向加密使用場景一
• 只起到防篡改功能,不多單獨使用。• 單獨使用方案:(1)局部hash;(2)隨機hash。
單向加密的使用場景二
• 登陸又令(身份證號等敏感信息)。 • 敏感信息訪問。
單向加密的使用場景二 數字簽名
• 數字摘要+用戶的身份信息;用戶數據防篡改和身份認證; • 身份標示:商戶私鑰(字符串)。rsa私鑰。
• HMAC(Keyed-Hashing for Message Authentication)
• 目前,信息安全領域廣泛認同的算法是HMAC,它基於MD5或 者SHA-1,在計算散列值時將密鑰和數據同時做爲輸入,並採用 了二次散列迭代的方式,實際計算方法以下:
• HMAC(k,m)=Hash(CONCAT((k XOR opad) , Hash(CONCAT(k XOR ipad),m)))。其中k是密鑰,m是須要被簽名的消息。ipad/opad是標 準中定義好的2個常量。HMAC的特點是它不依賴於特定的Hash 算法
RSA簽名(DSA?)
• size_t hashBytesSize = CC_SHA256_DIGEST_LENGTH;
• //生成數字摘要
• uint8_t* hashBytes = malloc(hashBytesSize);
• if (!CC_SHA256([plainData bytes], (CC_LONG)[plainData length], hashBytes)) {
•
•}
• //用RSA進行簽名• SecKeyRawSign(key,
• kSecPaddingPKCS1SHA256,
return nil;
• hashBytes,
自定義簽名
• Sign(k,x)=Hash(CONCAT(k,x))。其中CONCAT是字符串鏈接函 數。
• 身份標示+原始數據。
• 將身份碼附着在明文後面做爲摘要輸入,進行摘要簽名。
• 此方案,是對明文進行簽名(有其餘附加操做),並對簽名的結 果進行摘要操做。
先簽名仍是先加密
• 假設用E(k,x)表示加密函數,Sign(k',x)表示簽名函數,保密性和完 整性我都想要,那麼就存在一個問題,先簽名仍是先加密?
• 一、先加密後簽名:令y=E(k,x),t=Sign(k',y),而後發送(y,t)。實際 例子:IPSec。
• 二、先簽名後加密:令t=Sign(k',x),y=E(k,t)。而後發送y。實際例 子:SSL。
• 三、各算各的。令y=E(k,x),t=Sign(k',x),而後發送(y,t)。實際例 子:SSH。
對稱加密算法• 特色:加解密私鑰相同,算法可逆。
• 分組加密算法:DES(Data Encryption Standard)、3DES、AES(Advanced Encryption Standard,支 持12八、19二、25六、512位密鑰的加密)、Blowfish。
• 流式加密算法。
對稱分組加密算法模型CBC模式
對稱加密算法要素
• private static final String AES_MODE = "AES/CBC/PKCS7Padding";
• 1)算法 AES;• 2)分組模式:CBC;• 3)填充方式:PKCS7Padding;
• byte[] cipherText = encrypt(key, ivBytes, message.getBytes(CHARSET));
• 4)密鑰:key;
• 5)ivBytes:初始化向量;
對稱加密算法要素
• CCCryptorStatus CCCryptorCreate(
/* kCCEncrypt, etc. */
/* kCCAlgorithmDES, etc. */
/* kCCOptionPKCS7Padding, etc. */ /* raw key material */
/* optional initialization vector */
• __OSX_AVAILABLE_STARTING(__MAC_10_4, __IPHONE_2_0);
= 1,
= 2,分組連接模式
= 3,密碼發反饋模式 = 4,
= 5, // Unimplemented for now (not included)
= 6, // Unimplemented for now (not included)
= 7, = 8, = 9,
• kCCModeCFB8 = 10,
AES 密鑰長度 分組長度• AES的區塊長度固定爲128 比特,密鑰長度則能夠是128,192
或256比特;
• AES加密數據塊分組長度必須爲128比特,密鑰長度能夠是128比 特、192比特、256比特中的任意一個(若是數據塊及密鑰長度不 足時,會補齊)。
填充方式
•
• • • • • • •
在Java進行DES、3DES和AES三種對稱加密算法時,常採用的 是NoPadding(不填充)、Zeros填充(0填充)、PKCS5Padding 填充。
2.4.1 ZerosPadding
所有填充爲0的字節,結果以下:F1 F2 F3 F4 F5 F6 F7 F8 //第一塊
F9 00 00 00 00 00 00 00 //第二塊2.4.2 PKCS5Padding 每一個填充的字節都記錄了填充的總字節數,結果以下:
F1 F2 F3 F4 F5 F6 F7 F8 //第一塊
• F9 07 07 07 07 07 07 07 //第二塊
• PKCS7 Padding:填充的內容是須要填充的字節數。若是最後一個 數據塊長度爲len,每一個塊的長度爲k,則要填充的內容爲:
• 01 -- if lth mod k = k-1 • 02 -- if lth mod k = k-2
對稱加密初始化向量
• 爲何須要初始化向量。
• 消除重複的明文致使重複密文的問題。
• 對於給定的私鑰 k,一個未使用初始化向量的簡單塊密碼將把相 同的明文輸入塊加密爲一樣的密文輸出塊。若是在明文流內有重 復的塊,那麼在密文流內也會有重複的塊。若是未經受權的用戶 知道有關明文塊的結構的全部信息,就可使用該信息解密已知 的密文塊並有可能得到您的密鑰。若要克服這個問題,可將上一 個塊中的信息混合到加密下一個塊的過程當中。這樣,兩個相同的 明文塊的輸出就會不一樣。因爲該技術使用上一個塊加密下一個 塊,所以使用了一個 IV 來加密數據的第一個塊。
加解密過程
• 簡單的講,整個正反向過程是這樣的:• 加密:Padding->CBC加密->Base64編碼• 解密:Base64解碼->CBC解密->Unpadding
非對稱加密(公鑰加密)
• 特色:、• 每一個用戶擁用一對密鑰加密:公鑰和私鑰。• 二、公鑰加密,私鑰解密;私鑰加密,公鑰解密。 • 三、公鑰傳輸的過程不安全,易被竊取和替換。• 加密速度慢。
理論基礎
• RSA算法基於一個十分簡單的數論事實:將兩個大素數相乘十分 容易,可是想要對其乘積進行因式分解卻極其困難,所以能夠將 乘積公開做爲加密密鑰。
• p:(隨機素數1)
• q:(隨機素數2)
• n:(素數積)
• φ(n):(歐拉函數,素數的歐拉函數爲:素數-1) • e:(加密因子)
• d:(解密因子)
密鑰長度
• 首先咱們說的「密鑰」是指誰?因爲RSA密鑰是(公鑰+模值)、 (私鑰+模值)分組分發的,單獨給對方一個公鑰或私鑰是沒有 任何用處,因此咱們說的「密鑰」實際上是它們二者中的其中一組。 但咱們說的「密鑰長度」通常只是指模值的位長度。目前主流可選 值:102四、204八、307二、4096...
• @result The block length of the key in bytes.
• @discussion If for example key is an RSA key the value returned by • this function is the size of the modulus.
• size_t SecKeyGetBlockSize(SecKeyRef key)
RSA填充模式與分組長度
RSA_PKCS1_PADDING
plaintext length should be smaller than RSA_size(rsa) - 11
RSA_PKCS1_OAEP_PADDING
plaintext length should be smaller than RSA_size(rsa) - 41
RSA_NO_PADDING
Assume caller performs padding. plaintext length should be equal to RSA_size(rsa)
爲何每次加密的數據不一樣 PKCS1填充模式
• 1.長度檢查, 若是 mLen > k-11, 輸出 「message too long」
• 2. EME-PKCS1-v1_5 編碼 a) 生成一個 僞隨機非零串PS , 長 度爲 k – mLen – 3, 因此至少爲8, 由於 k-mLen>11 b) 將PS, M,以及其餘填充串 一塊兒編碼爲 EM, 長度爲 k, 即: EM = 0×00 || 0×02 || PS || 0×00 || M
加解密算法設計(密鑰交換算法)• RSA交換對稱加密密鑰,AES使用交換到的私鑰加密通訊數據。
• 私鑰從私鑰空間產生,通訊雙方知道私鑰產生規則。將私鑰產生 時的輸入數據做爲通訊一部分傳輸。(目前使用的)
• DH 密鑰交換
• 其它:使用單向加密技術生成標準密鑰。GEN(str)= KEY(定 長)。
身份的不可抵賴性與證書體系
• 證書頒發機構與根證書。 • 證書的包含的內容。
end • 提問環節。