对称加密:就是只有唯一的密钥才能解密的加密算法。即解密和加密的钥匙是相同的。
只有通信双方才能知道密钥,才能解密。
发信方将明文和加密密钥一起经过特殊加密
算法的处理,使其变成加密密文
发送出去。
对称加密算法用来对敏感数据等信息进行加密,常用的算法包括:
1: DES(Data Encryption Standard):数据加密标准,速度较快,适用于加密大量数据的场合。
2:3DES(Triple DES):是基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高。
4:AES(Advanced Encryption Standard):高级加密标准,是下一代的加密算法标准,速度快,安全级别高。
对称加密算法的特点是算法公开、计算量小、加密速度快、加密效率高。
不足之处是:
1:交易双方都使用同样钥匙,安全性得不到保证。此外。
2:每对用户每次使用对称加密算法时,都需要使用其他人不知道的惟一钥匙,这会使得发收信双方所拥有的钥匙数量呈几何级数增长,密钥管理成为用户的负担。
3:对称加密算法在分布式网络系统上使用较为困难,主要是因为密钥管理困难
4:使用成本较高。而与公开密钥加密算法比起来,对称加密算法能够提供加密和认证,却缺乏了签名功能,使得使用范围有所缩小。
在计算机专网系统中广泛使用的对称加密算法有DES和IDEA等。美国国家标准局倡导的AES即将作为新标准取代DES。
对称加密算法的优点:加解密的高速度和使用长密钥时的难破解性。假设两个用户需要使用对称加密方法加密然后交换数据,则用户最少需要2个密钥并交换使用,如果企业内用户有n个,则整个企业共需要n×(n-1) 个密钥,密钥的生成和分发将成为企业信息部门的恶梦。
缺点:安全性低:对称加密算法的安全性取决于加密密钥的保存情况,但要求企业中每一个持有密钥的人都保守秘密是不可能的,他们通常会有意无意的把密钥泄漏出去——如果一个用户使用的密钥被入侵者所获得,入侵者便可以读取该用户密钥加密的所有文档,如果整个企业共用一个加密密钥,那整个企业文档的保密性便无从谈起。DESCryptoServiceProvider
那么常见的加密算法有哪些呢?
1.DES
DES算法全称为Data Encryption Standard,即数据加密算法,DES加密算法是IBM公司于1975年研究成功并公开发表的。DES算法的入口参数有三个:Key、Data、Mode。其中Key为8个字节共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密或被解密的数据。
2. 3DES
3DES(Triple DES)是三重数据加密算法(TDEA)密码的通称。它相当于是对每个数据块应用三次DES加密算法。由于计算机运算能力的增强,原版DES密码的密钥长度变得容易被暴力破解;3DES通过增加DES的密钥长度来避免类似的攻击,而不是设计一种全新的块密码算法。
3. AES
AES:又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。用来替代原先的DES。目前已然成为对称密钥加密中的算法之一。
4. RC2
RC2是由密码学家Ron Rivest设计的一种传统对称分组加密算法,它可作为DES算法的建议替代算法。它的输入和输出都是64比特。密钥的长度是从1字节到128字节可变。
5. RC4
RC4加密算法是大名鼎鼎的RSA三人组中的头号人物Ronald Rivest在1987年设计的密钥长度可变的流加密算法簇。由于RC4核心部分的S-box长度可为任意,该算法的速度可以达到DES加密的10倍左右,且具有很高级别的非线性。
6. RC5
RC5分组密码算法是1994由麻萨诸塞技术研究所的Ronald L. Rivest教授发明的,并由RSA实验室分析。它是参数可变的分组密码算法,三个可变的参数是:分组大小、密钥大小和加密轮数。在RC5算法中使用了三种运算:异或、加和循环。
非对称加密算法(asymmetric cryptographic algorithm)又名“公开密钥加密算法”,在这种密码学方法中,需要一对密钥,一是个私人密钥,另一个则是公开密钥。这两个密钥是数学相关,用某用户密钥加密后所得的信息,只能用该用户的解密密钥才能解密。如果知道了其中一个,并不能计算出另外一个。因此如果公开了一对密钥中的一个,并不会危害到另外一个的秘密性质。称公开的密钥为公钥;不公开的密钥为私钥。
非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。
非对称加密算法实现机密信息交换的基本过程是:甲方生成一对密钥并将其中的一把作为公用密钥向其它方公开;得到该公用密钥的乙方使用该密钥对机密信息进行加密后再发送给甲方;甲方再用自己保存的另一把专用密钥对加密后的信息进行解密。另一方面,甲方可以使用乙方的公钥对机密信息进行签名后再发送给乙方;乙方再用自己的私匙对数据进行验签。
非对称密码体制的特点:
1:算法强度复杂
2:安全性高:安全性依赖于算法与密钥但是由于其算法复杂,而使得加密解密速度没有对称加密解密的速度快。对称密码体制中只有一种密钥,并且是非公开的,如果要解密就得让对方知道密钥。所以保证其安全性就是保证密钥的安全,而非对称密钥体制有两种密钥,其中一个是公开的,这样就可以不需要像对称密码那样传输对方的密钥了。这样安全性就大了很多。
3:非对称加密算法的保密性比较好,它消除了最终用户交换密钥的需要。
工作原理
1.A要向B发送信息,A和B都要产生一对用于加密和解密的公钥和私钥。
2.A的私钥保密,A的公钥告诉B;B的私钥保密,B的公钥告诉A。
3.A要给B发送信息时,A用B的公钥加密信息,因为A知道B的公钥。
4.A将这个消息发给B(已经用B的公钥加密消息)。
5.B收到这个消息后,B用自己的私钥解密A的消息。其他所有收到这个报文的人都无法解密,因为只有B才有B的私钥。
主要算法
RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)。
实例:JSEncrypt (非对称加密)
<!DOCTYPE html>
<html>
<head>
<title>javascript非对称加密(RSA)JSEncrypt Example</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script src="http://libs.baidu.com/jquery/2.1.4/jquery.min.js"></script>
<script src="http://passport.cnblogs.com/scripts/jsencrypt.min.js"></script>
</head>
<body>
<div class="container">
<label for="privkey">Private Key</label><br/>//私钥
<textarea id="privkey" rows="15" cols="65">-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQDlOJu6TyygqxfWT7eLtGDwajtNFOb9I5XRb6khyfD1Yt3YiCgQ
WMNW649887VGJiGr/L5i2osbl8C9+WJTeucF+S76xFxdU6jE0NQ+Z+zEdhUTooNR
aY5nZiu5PgDB0ED/ZKBUSLKL7eibMxZtMlUDHjm4gwQco1KRMDSmXSMkDwIDAQAB
AoGAfY9LpnuWK5Bs50UVep5c93SJdUi82u7yMx4iHFMc/Z2hfenfYEzu+57fI4fv
xTQ//5DbzRR/XKb8ulNv6+CHyPF31xk7YOBfkGI8qjLoq06V+FyBfDSwL8KbLyeH
m7KUZnLNQbk8yGLzB3iYKkRHlmUanQGaNMIJziWOkN+N9dECQQD0ONYRNZeuM8zd
8XJTSdcIX4a3gy3GGCJxOzv16XHxD03GW6UNLmfPwenKu+cdrQeaqEixrCejXdAF
z/7+BSMpAkEA8EaSOeP5Xr3ZrbiKzi6TGMwHMvC7HdJxaBJbVRfApFrE0/mPwmP5
rN7QwjrMY+0+AbXcm8mRQyQ1+IGEembsdwJBAN6az8Rv7QnD/YBvi52POIlRSSIM
V7SwWvSK4WSMnGb1ZBbhgdg57DXaspcwHsFV7hByQ5BvMtIduHcT14ECfcECQATe
aTgjFnqE/lQ22Rk0eGaYO80cc643BXVGafNfd9fcvwBMnk0iGX0XRsOozVt5Azil
psLBYuApa66NcVHJpCECQQDTjI2AQhFc1yRnCU/YgDnSpJVm1nASoRUnU8Jfm3Oz
uku7JUXcVpt08DFSceCEX9unCuMcT72rAQlLpdZir876
-----END RSA PRIVATE KEY-----</textarea><br/>
<label for="pubkey">Public Key</label><br/>//公钥
<textarea id="pubkey" rows="15" cols="65">-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDlOJu6TyygqxfWT7eLtGDwajtN
FOb9I5XRb6khyfD1Yt3YiCgQWMNW649887VGJiGr/L5i2osbl8C9+WJTeucF+S76
xFxdU6jE0NQ+Z+zEdhUTooNRaY5nZiu5PgDB0ED/ZKBUSLKL7eibMxZtMlUDHjm4
gwQco1KRMDSmXSMkDwIDAQAB
-----END PUBLIC KEY-----</textarea><br/>
<div class="tool">
输入需要加密文字:<br/>
<textarea name="" id="needCrypt" cols="30" rows="10">测试XXXX</textarea>
<a href="javascript:void(0);" id="crypt-btn">加密</a><br/>
加密结果:<br/>
<textarea name="" id="resultCrypt" cols="30" rows="10">
</textarea>
<a href="javascript:void(0);" id="decrypt-btn">解密</a><br/>
解密结果:<br/>
<textarea name="" id="result" cols="30" rows="10">
</textarea>
</div>
<script type="text/javascript">
// Call this code when the page is done loading.
$(function() {
$("#crypt-btn").click(function(){
// Encrypt with the public key...
var encrypt = new JSEncrypt();
encrypt.setPublicKey($('#pubkey').val());//设置公钥
var encrypted = encrypt.encrypt($("#needCrypt").val());
document.getElementById("resultCrypt").innerText = encrypted;
});
$("#decrypt-btn").click(function(){
// Decrypt with the private key...
var decrypt = new JSEncrypt();
decrypt.setPrivateKey($('#privkey').val());//设置私钥
var uncrypted = decrypt.decrypt($("#resultCrypt").val());
document.getElementById("result").innerText = uncrypted;
});
});
</script>
</div>
</body>
</html>