对称加密算法


对称加密算法

文章插图
对称加密算法【对称加密算法】对称加密算法是套用较早的加密算法,技术成熟 。在对称加密算法中,数据发信方将明文(原始数据)和加密密钥(mi yao)一起经过特殊加密算法处理后,使其变成複杂的加密密文传送出去 。收信方收到密文后,若想解读原文,则需要使用加密用过的密钥及相同算法的逆算法对密文进行解密,才能使其恢复成可读明文 。在对称加密算法中,使用的密钥只有一个,发收信双方都使用这个密钥对数据进行加密和解密,这就要求解密方事先必须知道加密密钥 。
基本介绍中文名:对称加密算法
外文名:symmetric encryption algorithm
实质:加密算法
特点:技术成熟
处理对象:明文和加密密钥
简介对称加密(也叫私钥加密)指加密和解密使用相同密钥的加密算法 。有时又叫传统密码算法,就是加密密钥能够从解密密钥中推算出来,同时解密密钥也可以从加密密钥中推算出来 。而在大多数的对称算法中,加密密钥和解密密钥是相同的,所以也称这种加密算法为秘密密钥算法或单密钥算法 。它要求传送方和接收方在安全通信之前,商定一个密钥 。对称算法的安全性依赖于密钥,泄漏密钥就意味着任何人都可以对他们传送或接收的讯息解密,所以密钥的保密性对通信的安全性至关重要 。特点对称加密算法的特点是算法公开、计算量小、加密速度快、加密效率高 。不足之处是,交易双方都使用同样钥匙,安全性得不到保证 。此外,每对用户每次使用对称加密算法时,都需要使用其他人不知道的惟一钥匙,这会使得发收信双方所拥有的钥匙数量呈几何级数增长,密钥管理成为用户的负担 。对称加密算法在分散式网路系统上使用较为困难,主要是因为密钥管理困难,使用成本较高 。而与公开密钥加密算法比起来,对称加密算法能够提供加密和认证却缺乏了签名功能,使得使用範围有所缩小 。在计算机专网系统中广泛使用的对称加密算法有DES和IDEA等 。美国国家标準局倡导的AES即将作为新标準取代DES 。具体算法DES算法,3DES算法,TDEA算法,Blowfish算法,RC5算法,IDEA算法 。原理套用对称加密算法的优点在于加解密的高速度和使用长密钥时的难破解性 。假设两个用户需要使用对称加密方法加密然后交换数据,则用户最少需要2个密钥并交换使用,如果企业内用户有n个,则整个企业共需要n×(n-1) 个密钥,密钥的生成和分发将成为企业信息部门的恶梦 。对称加密算法的安全性取决于加密密钥的保存情况,但要求企业中每一个持有密钥的人都保守秘密是不可能的,他们通常会有意无意的把密钥泄漏出去——如果一个用户使用的密钥被入侵者所获得,入侵者便可以读取该用户密钥加密的所有文档,如果整个企业共用一个加密密钥,那整个企业文档的保密性便无从谈起 。DESCryptoServiceProviderRC2CryptoServiceProviderRijndaelManagedTripleDESCryptoServiceProvider//例加密文本档案(RijndaelManaged )byte[] key = { 24, 55, 102,24, 98, 26, 67, 29, 84, 19, 37, 118, 104, 85, 121, 27, 93, 86, 24, 55, 102, 24,98, 26, 67, 29, 9, 2, 49, 69, 73, 92 };byte[] IV ={ 22, 56, 82, 77, 84, 31, 74, 24,55, 102, 24, 98, 26, 67, 29, 99 };RijndaelManaged myRijndael = new RijndaelManaged();FileStream fsOut = File.Open(strOutName, FileMode.Create,FileAccess.Write);//strOutName档案名称及路径 FileStream fsIn = File.Open(strPath, FileMode.Open,FileAccess.Read);CryptoStream csDecrypt=new CryptoStream(fsOut,myRijndael.CreateEncryptor(key, IV),CryptoStreamMode.Write);//读加密文本BinaryReader br = new BinaryReader(fsIn);csDecrypt.Write(br.ReadBytes((int)fsIn.Length),0, (int)fsIn.Length);csDecrypt.FlushFinalBlock();csDecrypt.Close();fsIn.Close();fsOut.Close();//解密档案byte[] key = { 24, 55, 102, 24, 98, 26, 67, 29, 84, 19, 37, 118,104, 85, 121, 27, 93, 86, 24, 55, 102, 24, 98, 26, 67, 29, 9, 2, 49, 69, 73, 92};byte[] IV ={ 22, 56, 82, 77, 84, 31, 74, 24, 55, 102, 24, 98, 26,67, 29, 99 };RijndaelManaged myRijndael = new RijndaelManaged();FileStream fsOut = File.Open(strPath, FileMode.Open, FileAccess.Read);CryptoStream csDecrypt = new CryptoStream(fsOut, myRijndael.CreateDecryptor(key,IV), CryptoStreamMode.Read);StreamReader sr = new StreamReader(csDecrypt);//把档案读出来StreamWriter sw = new StreamWriter(strInName);//解密后档案写入一个新的档案sw.Write(sr.ReadToEnd());sw.Flush();sw.Close();sr.Close();fsOut.Close();用图片加密(RC2CryptoServiceProvider )FileStreamfsPic = new FileStream(pictureBox1.ImageLocation,FileMode.Open, FileAccess.Read); //加密档案流(textBox1.Text是档案名称及路径)FileStream fsText = new FileStream(textBox1.Text, FileMode.Open,FileAccess.Read);byte[] bykey = new byte[16]; //初始化Key IVbyte[] byIv = new byte[8];fsPic.Read(bykey, 0, 16);fsPic.Read(byIv, 0, 8);RC2CryptoServiceProvider desc = newRC2CryptoServiceProvider();//desc进行加密BinaryReader br = new BinaryReader(fsText);//从要加密的档案中读出档案内容FileStream fsOut = File.Open(strLinPath,FileMode.Create, FileAccess.Write); // strLinPath临时加密档案路径CryptoStream cs = new CryptoStream(fsOut, desc.CreateEncryptor(bykey,byIv), CryptoStreamMode.Write);//写入临时加密档案cs.Write(br.ReadBytes((int)fsText.Length),0, (int)fsText.Length);//写入加密流cs.FlushFinalBlock();cs.Flush();cs.Close();fsPic.Close();fsText.Close();fsOut.Close();用图片解密FileStream fsPic = new FileStream(pictureBox1.ImageLocation, FileMode.Open, FileAccess.Read); //图片流FileStream fsOut = File.Open(textBox1.Text,FileMode.Open, FileAccess.Read);//解密档案流byte[] bykey = new byte[16]; //初始化Key IVbyte[] byIv = new byte[8];fsPic.Read(bykey, 0, 16);fsPic.Read(byIv, 0, 8);string strPath = textBox1.Text;//加密档案的路径int intLent = strPath.LastIndexOf("\\")+ 1;int intLong = strPath.Length;string strName = strPath.Substring(intLent, intLong - intLent);//要加密的档案名称称string strLinPath = "C:\\"+ strName;//临时解密档案路径 FileStream fs = new FileStream(strLinPath, FileMode.Create,FileAccess.Write);RC2CryptoServiceProvider desc = newRC2CryptoServiceProvider();//desc进行解密CryptoStream csDecrypt = new CryptoStream(fsOut, desc.CreateDecryptor(bykey,byIv), CryptoStreamMode.Read);//读出加密档案BinaryReader sr = new BinaryReader(csDecrypt);//从要加密流中读出档案内容BinaryWriter sw = new BinaryWriter(fs);//写入解密流sw.Write(sr.ReadBytes(Convert.ToInt32(fsOut.Length)));//sw.Flush();sw.Close();sr.Close();fs.Close();fsOut.Close();fsPic.Close();csDecrypt.Flush();File.Delete(textBox1.Text.TrimEnd());//删除原档案File.Copy(strLinPath, textBox1.Text);//複製加密档案File.Delete(strLinPath);//删除临时档案加密算法基于“对称密钥”的加密算法主要有DES、TripleDES、RC2、RC4、RC5和Blowfish等 。对称密钥:DES TripleDES算法DES算法把64位的明文输入块变为数据长度为64位的密文输出块,其中8位为奇偶校验位,另外56位作为密码的长度 。首先,DES把输入的64位数据块按位重新组合,并把输出分为L0、R0两部分,每部分各长32位,并进行前后置换,最终由L0输出左32位,R0输出右32位,根据这个法则经过16次叠代运算后,得到L16、R16,将此作为输入,进行与初始置换相反的逆置换,即得到密文输出 。DES算法具有极高的安全性,到目前为止,除了用穷举搜寻法对DES算法进行攻击外,还没有发现更有效的办法,而56位长密钥的穷举空间为2^56,这意味着如果一台计算机的速度是每秒种检测100万个密钥,那幺它搜寻完全部密钥就需要将近2285年的时间,因此DES算法是一种很可靠的加密方法 。对称密钥:RC算法RC4算法的原理是“搅乱”,它包括初始化算法和伪随机子密码生成算法两大部分,在初始化的过程中,密钥的主要功能是将一个256位元组的初始数簇进行随机搅乱,不同的数簇在经过伪随机子密码生成算法的处理后可以得到不同的子密钥序列,将得到的子密钥序列和明文进行异或运算(XOR)后,得到密文 。由于RC4算法加密採用的是异或方式,所以,一旦子密钥序列出现了重複,密文就有可能被破解,但是目前还没有发现密钥长度达到128位的RC4有重複的可能性,所以,RC4也是目前最安全的加密算法之一 。对称密钥:BlowFish算法BlowFish算法是一个64位分组及可变密钥长度的分组密码算法,该算法是非专利的 。BlowFish算法使用两个“盒”:pbox[18]和sbox[4256],BlowFish算法有一个核心加密函式 。该函式输入64位信息,运算后以64位密文的形式输出 。用BlowFish算法加密信息,需要密钥预处理和信息加密两个过程 。BlowFish算法的原密钥pbox和sbox是固定的,要加密一个信息,需要选择一个key,用这个key对pbox和sbox进行变换,得到下一步信息加密所用到的key_pbox和key_sbox 。BlowFish算法解密,同样也需要密钥预处理和信息解密两个过程 。密钥预处理的过程和加密时完全相同 。信息解密的过程就是把信息加密过程的key_pbox逆序使用即可 。套用模式加密模式(英文名称及简写)中文名称Electronic Code Book(ECB)电子密码本模式Cipher Block Chaining(CBC)密码分组连结模式Cipher Feedback Mode(CFB)加密反馈模式Output Feedback Mode(OFB)输出反馈模式ECB:最基本的加密模式,也就是通常理解的加密,相同的明文将永远加密成相同的密文,无初始向量,容易受到密码本重放攻击,一般情况下很少用 。CBC:明文被加密前要与前面的密文进行异或运算后再加密,因此只要选择不同的初始向量,相同的密文加密后会形成不同的密文,这是目前套用最广泛的模式 。CBC加密后的密文是上下文相关的,但明文的错误不会传递到后续分组,但如果一个分组丢失,后面的分组将全部作废(同步错误) 。CFB:类似于自同步序列密码,分组加密后,按8位分组将密文和明文进行移位异或后得到输出同时反馈回移位暂存器,优点最小可以按位元组进行加解密,也可以是n位的,CFB也是上下文相关的,CFB模式下,明文的一个错误会影响后面的密文(错误扩散) 。OFB:将分组密码作为同步序列密码运行,和CFB相似,不过OFB用的是前一个n位密文输出分组反馈回移位暂存器,OFB没有错误扩散问题 。