参考文献
综述
1)信息保密:加密技术;•
2)信息完整行(无篡改):数字指纹;
3)身份认证:数字签名;
4)身份可靠性(公钥可靠性):数字证书。
保密性,完整性,端点认证
加密技术:(1)加密算法;(2)秘钥交换。
数据加密
• 单向加密
• 数字签名
• 对称加密
• 非对称加密
• 密钥交换
单向加密
• 别名:数字摘要、数字签名。
• 确保数据的完整性,不被篡改。
• 算法基础: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 •{
- 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] );
单向加密使用场景一
• 只起到防篡改功能,很少单独使用。• 单独使用方案:(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)表示签名函数,保密性和完 整性我都想要,那么就存在一个问题,先签名还是先加密?
• 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。
对称加密算法• 特点:加解密私钥相同,算法可逆。
• 分组加密算法:DES(Data Encryption Standard)、3DES、AES(Advanced Encryption Standard,支 持128、192、256、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(
- 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);
- 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,
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
非对称加密(公钥加密)
• 特点:、• 每个用户拥用一对密钥加密:公钥和私钥。• 2、公钥加密,私钥解密;私钥加密,公钥解密。 • 3、公钥传输的过程不安全,易被窃取和替换。• 加密速度慢。
理论基础
• RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分 容易,但是想要对其乘积进行因式分解却极其困难,因此可以将 乘积公开作为加密密钥。
• p:(随机素数1)
• q:(随机素数2) • n:(素数积) • φ(n):(欧拉函数,素数的欧拉函数为:素数-1) • e:(加密因子)• d:(解密因子)
密钥长度
• 首先我们说的“密钥”是指谁?由于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)RSA填充模式与分组长度
RSA_PKCS1_PADDING
plaintext length should be smaller than RSA_size(rsa) - 11RSA_PKCS1_OAEP_PADDING
plaintext length should be smaller than RSA_size(rsa) - 41RSA_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
• 提问环节。