加解密

参考文献 

page1image1632.png page1image2552.png

综述 

 1)信息保密:加密技术;•

2)信息完整行(无篡改):数字指纹;

3)身份认证:数字签名;

4)身份可靠性(公钥可靠性):数字证书。

 保密性,完整性,端点认证 

加密技术:(1)加密算法;(2)秘钥交换。 

page1image1632.png page1image2552.png

数据加密 

• 单向加密

• 数字签名

• 对称加密

非对称加密 

• 密钥交换 

page1image1632.png page1image2552.png

单向加密 

• 别名:数字摘要、数字签名。

• 确保数据的完整性,不被篡改。

• 算法基础:hash。

• 理论基础:雪崩效应。

• md5(标准密钥长度128位)、sha1(标准密钥长度160位) 

page1image1632.png page1image2552.png

• - (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 •{ 

  • unsigned char hash[CC_SHA1_DIGEST_LENGTH];
  • (void) CC_SHA1( [self bytes], (CC_LONG)[self length], hash );
  • return ( [NSData dataWithBytes: hash length:CC_SHA1_DIGEST_LENGTH] ); 

page1image1632.png page1image2552.png

单向加密使用场景一 

• 只起到防篡改功能,很少单独使用。• 单独使用方案:(1)局部hash;(2)随机hash。 

page1image1632.png page1image2552.png

单向加密的使用场景二 

• 登录又令(身份证号等敏感信息)。 • 敏感信息访问。 

page1image1632.png page1image2552.png

单向加密的使用场景二 数字签名 

• 数字摘要+用户的身份信息;用户数据防篡改和身份认证; • 身份标示:商户私钥(字符串)。rsa私钥。 

page1image1632.png page1image2552.png

• 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 算法 

page1image1632.png page1image2552.png

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, 

page1image1632.png page1image2552.png

自定义签名 

• Sign(k,x)=Hash(CONCAT(k,x))。其中CONCAT是字符串连接函 数。 

• 身份标示+原始数据。 

• 将身份码附着在明文后面作为摘要输入,进行摘要签名。 

• 此方案,是对明文进行签名(有其他附加操作),并对签名的结 果进行摘要操作。 

page1image1632.png page1image2552.png

先签名还是先加密 

• 假设用E(k,x)表示加密函数,Sign(k',x)表示签名函数,保密性和完 整性我都想要,那么就存在一个问题,先签名还是先加密? 

• 1、先加密后签名:令y=E(k,x),t=Sign(k',y),然后发送(y,t)。实际 例子:IPSec。 

• 2、先签名后加密:令t=Sign(k',x),y=E(k,t)。然后发送y。实际例 子:SSL。 

• 3、各算各的。令y=E(k,x),t=Sign(k',x),然后发送(y,t)。实际例 子:SSH。 

page1image1632.png page1image2552.png

对称加密算法• 特点:加解密私钥相同,算法可逆。 

• 分组加密算法:DES(Data Encryption Standard)、3DES、AES(Advanced Encryption Standard,支 持128、192、256、512位密钥的加密)、Blowfish。 

• 流式加密算法。 

page1image1632.png page1image2552.png

对称分组加密算法模型CBC模式 

page1image3176.jpg 

 page1image2552.png page1image2552.png 

page1image1632.png page1image2552.png

对称加密算法要素 

• 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:初始化向量; 

page1image2104.png page1image2272.png page1image2552.png 

page1image1632.png page1image2552.png

对称加密算法要素 

• CCCryptorStatus CCCryptorCreate( 

  • CCOperation op,
  • CCAlgorithm alg,
  • CCOptions options,
  • const void *key,
  • size_t keyLength,
  • const void *iv,
  • CCCryptorRef *cryptorRef) /* RETURNED */

/* kCCEncrypt, etc. */
/* kCCAlgorithmDES, etc. */ 

/* kCCOptionPKCS7Padding, etc. */ /* raw key material */ 

/* optional initialization vector */ 

• __OSX_AVAILABLE_STARTING(__MAC_10_4, __IPHONE_2_0); 

page1image1632.png page1image2552.png

  • enum {
  • kCCModeECB
  • kCCModeCBC
    kCCModeCFB
  • kCCModeCTR
  • kCCModeF8
  • kCCModeLRW
  • kCCModeOFB
  • kCCModeXTS
  • kCCModeRC4

= 1,
= 2,分组链接模式 

= 3,密码发反馈模式 = 4, 

= 5, // Unimplemented for now (not included)
= 6, // Unimplemented for now (not included) 

= 7, = 8, = 9, 

• kCCModeCFB8 = 10, 

page1image1632.png page1image2552.png

AES 密钥长度 分组长度• AES的区块长度固定为128 比特,密钥长度则可以是128,192 

或256比特; 

• AES加密数据块分组长度必须为128比特,密钥长度可以是128比 特、192比特、256比特中的任意一个(如果数据块及密钥长度不 足时,会补齐)。 

page1image4368.png page1image4528.png page1image4688.png page1image4528.png page1image5008.png page1image4528.png page1image5328.png 

page1image1632.png page1image2552.png

填充方式 

• 

• • • • • • • 

在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 //第二块 

page1image1632.png page1image2552.png

• PKCS7 Padding:填充的内容是需要填充的字节数。如果最后一个 数据块长度为len,每个块的长度为k,则要填充的内容为: 

• 01 -- if lth mod k = k-1 • 02 -- if lth mod k = k-2 

page1image1632.png page1image2552.png

对称加密初始化向量 

• 为什么需要初始化向量。 

• 消除重复的明文导致重复密文的问题。 

• 对于给定的私钥 k,一个未使用初始化向量的简单块密码将把相 同的明文输入块加密为同样的密文输出块。如果在明文流内有重 复的块,那么在密文流内也会有重复的块。如果未经授权的用户 知道有关明文块的结构的所有信息,就可以使用该信息解密已知 的密文块并有可能获得您的密钥。若要克服这个问题,可将上一 个块中的信息混合到加密下一个块的过程中。这样,两个相同的 明文块的输出就会不同。由于该技术使用上一个块加密下一个 块,因此使用了一个 IV 来加密数据的第一个块。 

page1image1632.png page1image2552.png

加解密过程 

• 简单的讲,整个正反向过程是这样的:• 加密:Padding->CBC加密->Base64编码• 解密:Base64解码->CBC解密->Unpadding 

page1image1632.png page1image2552.png

非对称加密(公钥加密) 

• 特点:、• 每个用户拥用一对密钥加密:公钥和私钥。• 2、公钥加密,私钥解密;私钥加密,公钥解密。 • 3、公钥传输的过程不安全,易被窃取和替换。• 加密速度慢。 

page1image1632.png page1image2552.png

理论基础 

• RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分 容易,但是想要对其乘积进行因式分解却极其困难,因此可以将 乘积公开作为加密密钥。 

• p:(随机素数1)
• q:(随机素数2)
• n:(素数积)
• φ(n):(欧拉函数,素数的欧拉函数为:素数-1) • e:(加密因子) 

• d:(解密因子) 

page1image1632.png page1image2552.png

密钥长度 

• 首先我们说的“密钥”是指谁?由于RSA密钥是(公钥+模值)、 (私钥+模值)分组分发的,单独给对方一个公钥或私钥是没有 任何用处,所以我们说的“密钥”其实是它们两者中的其中一组。 但我们说的“密钥长度”一般只是指模值的位长度。目前主流可选 值:1024、2048、3072、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) 

page1image1632.png page1image2552.png

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) 

page1image1632.png page1image2552.png

为什么每次加密的数据不同 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 

page1image1632.png page1image2552.png

加解密算法设计(密钥交换算法)• RSA交换对称加密密钥,AES使用交换到的私钥加密通信数据。 

• 私钥从私钥空间产生,通信双方知道私钥产生规则。将私钥产生 时的输入数据作为通信一部分传输。(目前使用的) 

• DH 密钥交换 

• 其它:使用单向加密技术生成标准密钥。GEN(str)= KEY(定 长)。 

page1image2104.png page1image2272.png page1image2552.png 

page1image1632.png page1image2552.png

身份的不可抵赖性与证书体系

• 证书颁发机构与根证书。 • 证书的包含的内容。 

page1image1632.png page1image2552.png

end
• 提问环节。 

原文地址:https://www.cnblogs.com/feng9exe/p/7569393.html