编码格式:
信息从一种格式转化成另一种格式,双向。(并非加密,不涉及到密钥)
ASCII编码(8位)
Unicode编码(16位,32位)
GB2312编码
BIG5编码
Base64编码
Zip,WinZip……
散列运算(Hash):
不固定长度的信息计算成固定长度的散列值。应该是不可逆,快速,无散列碰撞(md4,md5,sha1都有这个问题)。
常见的加密算法问题表:(截止2009)
md4 散列长度128 不安全
md5 散列长度128 不安全
sha0 散列长度160 不安全
sha1 散列长度160 不太安全(山大的女教授已经验证了上述算法的碰撞问题)
sha256/224 散列长度256/224 安全
sha512/382 散列长度512/382 安全
数字签名:
散列加密的要点:运算前加盐!
利用散列值加密密码:构建更安全合理的安全网络应用。
对称加密:
加密解密都用同一个密钥。
概念IV:初始化向量(第一块儿人工指定)。
常见的对称加密算法:
DES 1976 容易破解 效率高
TripleDES 1978 不容易破解 效率中
AES(旧称Rijndael) 1998 不易破解 效率高 (长度可选128/192/256 建议使用256)
TwoFish 1998
非对称加密:
使用公密钥和私密钥
有单向的关系
私密钥可算出公密钥,但是公密钥算不出私密钥。(利用质数的运算原理,两个大质数的乘积的分解算法问题,2~质数的开方值。还有其他的圆周曲线算法等)
公开密钥加密,必须用私有密钥解密。(普通应用)
反过来,私有密钥加密,必须用公开密钥解密。(数字签名)
几种常见的非对称加密算法:
RSA 密钥长度1024/2048/5096 1977年 512以下不安全 效率低
DSA 密钥长度512/1024/2048/3072 1991年 安全 效率高
典型应用: https ssl
补充:随机数生成(不是利用时间种子的老随机数生成方法,没有保密性,老一代的随机数发生器不符合密码学的应用场景)
考虑到密码学的支持。
要使用System.Security.Cryptography命名空间中的随机数发生器!
byte[] random = new byte[1];
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
rng.GetBytes(random);
int i = Convert.ToInt32(random[0]);
总结:
如果您对上述介绍感到烦躁冗余的话,请参考下面几点建议:
哈希算法:推荐sha2(别忘了加盐啊)
对称加密算法:推荐tripledes,aes(没有老系统兼容问题的话,尤其推荐)
非对称加密算法:效率相对低,推荐DSA,并和对称加密配合使用
效率上 哈希算法>对称加密>>非对称加密