前几天由于需要去研究了一下加密算法!这里是一些资料! 分享下
加密将防止数据被查看或修改并在原本不安全的信道上提供安全的通信信道它达到以下目的
保密性防止用户的标识或数据被读取
数据完整性防止数据被更改
身份验证确保数据发自特定的一方
基本概念
散列(HASH)函数
散列(HASH)函数H也称哈希函数或杂凑函数等是典型的多到一的函数其输入为一可变长x(可以足够的长)输出一固定长的串h(一般为位位比输入的串短)该串h被称为输入x的Hash值(或称消息摘要Message Digest指纹密码校验和或消息完整性校验)计作h=H(x)为防止传输和存储的消息被有意或无意地篡改采用散列函数对消息进行运算生成消息摘要附在消息之后发出或与信息一起存储它在报文防伪中具有重要应用
消息摘要采用一种单向散列算法将一个消息进行换算在消息摘要算法中文件数据作为单向散列运算的输入这个输入通过HASH函数产生一个散列值如果改动了文件散列值就会相应地改变接收者即能检测到这种改动过的痕迹从理论上来讲攻击者不可能制造一个替用的消息来产生一个完全相同的消息摘要Hash函数可用于数字签名消息的完整性检测消息的起源认证检测等
散列函数是安全的是指它具有
一致性相同的输入产生相同的输出
随机性消息摘要外观是随机的以防被猜出源消息
唯一性几乎不可能找到两个消息产生相同的消息摘要
单向性即如果给出输出则很难确定出输入消息
Hash函数H一般满足以下几个基本要求
()输入x可以为任意长度输出数据串长度固定
()正向计算容易即给定任何x容易算出H(x)反向计算困难即给出一Hash值h很难找出一特定输入x使h=H(x)
()抗沖突性(抗碰撞性)包括两个含义一是给出一消息x找出一消息y使H(x)=H(y)是计算上不可行的(弱抗沖突)二是找出任意两条消息xy使H(x)=H(y)也是计算上不可行的(强抗沖突)
私钥加密
私钥加密又称为对称加密因为同一密钥既用于加密又用于解密私钥加密算法非常快(与公钥算法相比)特别适用于对较大的数据流执行加密转换
公钥加密(PKCS)和数字签名
公钥加密使用一个必须对未经授权的用户保密的私钥和一个可以对任何人公开的公钥用公钥加密的数据只能用私钥解密而用私钥签名的数据只能用公钥验证公钥可以被任何人使用该密钥用于加密要发送到私钥持有者的数据两个密钥对于通信会话都是唯一的公钥加密算法也称为不对称算法原因是需要用一个密钥加密数据而需要用另一个密钥来解密数据
数据加密/编码算法列表
常见用于保证安全的加密或编码算法如下
常用密钥算法
密钥算法用来对敏感数据摘要签名等信息进行加密常用的密钥算法包括
DES(Data Encryption Standard)数据加密标准速度较快适用于加密大量数据的场合
DES(Triple DES)是基于DES对一块数据用三个不同的密钥进行三次加密强度更高
RC和 RC用变长密钥对大量数据进行加密比 DES 快
IDEA(International Data Encryption Algorithm)国际数据加密算法使用 位密钥提供非常强的安全性
RSA由 RSA 公司发明是一个支持变长密钥的公共密钥算法需要加密的文件快的长度也是可变的
DSA(Digital Signature Algorithm)数字签名算法是一种标准的 DSS(数字签名标准)
AES(Advanced Encryption Standard)高级加密标准是下一代的加密算法标准速度快安全级别高目前 AES 标准的一个实现是 Rijndael 算法
BLOWFISH它使用变长的密钥长度可达位运行速度很快
其它算法如ElGamalDeffieHellman新型椭圆曲线算法ECC等
单向散列算法
单向散列函数一般用于产生消息摘要密钥加密等常见的有
MD(Message Digest Algorithm )是RSA数据安全公司开发的一种单向散列算法MD被广泛使用可以用来把不同长度的数据块进行暗码运算成一个位的数值
SHA(Secure Hash Algorithm)这是一种较新的散列算法可以对任意长度的数据运算生成一个位的数值
MAC(Message Authentication Code)消息认证代码是一种使用密钥的单向函数可以用它们在系统上或用户之间认证文件或消息HMAC(用于消息认证的密钥散列法)就是这种函数的一个例子
CRC(Cyclic Redundancy Check)循环冗余校验码CRC校验由于实现简单检错能力强被广泛使用在各种数据校验应用中占用系统资源少用软硬件均能实现是进行数据传输差错检测地一种很好的手段(CRC 并不是严格意义上的散列算法但它的作用与散列算法大致相同所以归于此类)
其它数据算法
其它数据算法包括一些常用编码算法及其与明文(ASCIIUnicode 等)转换等如 Base Quoted PrintableEBCDIC 等
算法的 NET 实现
常见的加密和编码算法都已经在 NET Framework中得到了实现为编码人员提供了极大的便利性实现这些算法的名称空间是SystemSecurityCryptography
SystemSecurityCryptography 命名空间提供加密服务包括安全的数据编码和解码以及许多其他操作例如散列法随机数字生成和消息身份验证
SystemSecurityCryptography 是按如下方式组织的
私钥加密
私钥加密又称为对称加密因为同一密钥既用于加密又用于解密私钥加密算法非常快(与公钥算法相比)特别适用于对较大的数据流执行加密转换
NET Framework 提供以下实现私钥加密算法的类
DESDESCryptoServiceProvider
RCRCCryptoServiceProvider
Rijndael(AES)RijndaelManaged
DESTripleDESCryptoServiceProvider
公钥加密和数字签名
公钥加密使用一个必须对未经授权的用户保密的私钥和一个可以对任何人公开的公钥用公钥加密的数据只能用私钥解密而用私钥签名的数据只能用公钥验证公钥可以被任何人使用该密钥用于加密要发送到私钥持有者的数据两个密钥对于通信会话都是唯一的公钥加密算法也称为不对称算法原因是需要用一个密钥加密数据而需要用另一个密钥来解密数据
NET Framework 提供以下实现公钥加密算法的类
DSADSACryptoServiceProvider
RSARSACryptoServiceProvider
哈希(Hash)值
哈希算法将任意长度的二进制值映射为固定长度的较小二进制值这个小的二进制值称为哈希值哈希值是一段数据唯一且极其紧凑的数值表示形式如果散列一段明文而且哪怕只更改该段落的一个字母随后的哈希都将产生不同的值要找到散列为同一个值的两个不同的输入在计算上是不可能的所以数据的哈希值可以检验数据的完整性
NET Framework 提供以下实现数字签名算法的类
HMACHMACSHA (HMAC 为一种使用密钥的 Hash 算法)
MACMACTripleDES
MDMDCryptoServiceProvider
SHASHAManagedSHAManagedSHAManagedSHAManaged
随机数生成
加密密钥需要尽可能地随机以便使生成的密钥很难再现所以随机数生成是许多加密操作不可分割的组成部分
在 NET Framework 中RNGCryptoServiceProvider 是随机数生成器算法的实现对于数据算法NET Framework 则在其它命名空间中实现如 Convert 类实现 Base 编码SystemText 来实现编码方式的转换等
简单的例程
首先需要引用命名空间SystemSecurityCryptography
MD加密
Dim md As MDCryptoServiceProvider
Dim bytValue() As Byte 要进行加密的字节数组
Dim bytHash() As Byte 加密后生成的字节数组
Dim result As String
md = New MDCryptoServiceProvider
将原始字符串转换成字节数组
bytValue = SystemTextEncodingUTFGetBytes(cpuid)
计算散列并返回一个字节数组
bytHash = mdComputeHash(bytValue)
mdClear()
字节数组转换成字符串
result=ConvertToBaseString(bytHash)
其他的也是类似的!可以自己去尝试下的!
从以上来看NET Framework 对于数据加密/编码还是支持比较好大大地方便了开发人员但美中不足的是NET Framework 中的数据加密算法仍然不够完全如 IDEABLOWFISH其它算法如ElGamalDeffieHellmanECC 等对于一些其它的数据校验算法支持也不够如 CRCSFV 等开发人员只能去从早期代码做移植或者寻找第三方厂商的实现