各种加密算法简介及其Java实现

jopen 10年前

 1. 加密算法的介绍

        根据密钥类型不同将现代密码技术分为两类:对称加密算法(秘密钥匙加密)和非对称加密算法(公开密钥加密)。对称钥匙加密系统是加密和解密均采用同一把秘密钥匙,而且通信双方都必须获得这把钥匙,并保持钥匙的秘密。非对称密钥加密系统采用的加密钥匙(公钥)和解密钥匙(私钥)是不同的。

 

对称加密技术,常见的有:

DES(Data Encryption Standard):数据加密标准,速度较快,适用于加密大量数据的场合。

3DES(Triple DES):是基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高。

AES(Advanced Encryption Standard):高级加密标准,是下一代的加密算法标准,速度快,安全级别高;

 

常见的非对称加密算法如下:

RSA:由 RSA 公司发明,是一个支持变长密钥的公共密钥算法,需要加密的文件块的长度也是可变的;

DSA(Digital Signature Algorithm):数字签名算法,是一种标准的 DSS(数字签名标准);

ECC(Elliptic Curves Cryptography):椭圆曲线密码编码学。

  • 在管理方面:公钥密码算法只需要较少的资源就可以实现目的,在密钥的分配上,两者之间相差一个指数级别(一个是n一个是n2)。所以私钥密码算法不适应广域网的使用,而且更重要的一点是它不支持数字签名。
  •  在安全方面:由于公钥密码算法基于未解决的数学难题,在破解上几乎不可能。对于私钥密码算法,到了AES虽说从理论来说是不可能破解的,但从计算机的发展角度来看。公钥更具有优越性。
  • 从速度上来看:AES的软件实现速度已经达到了每秒数兆或数十兆比特。是公钥的100倍,如果用硬件来实现的话这个比值将扩大到1000倍。

2. 加密算法的选择:

       我们应该根据自己的使用特点来确定,由于非对称加密算法的运行速度比对称加密算法的速度慢很多,当我们需要加密大量的数据时,建议采用对称加密算法,提高加解密速度。

       对称加密算法不能实现签名,因此签名只能非对称算法。

       由于对称加密算法的密钥管理是一个复杂的过程,密钥的管理直接决定着他的安全性,因此当数据量很小时,我们可以考虑采用非对称加密算法。

在实际的操作过程中,我们通常采用的方式是:采用非对称加密算法管理对称算法的密钥,然后用对称加密算法加密数据,这样我们就集成了两类加密算法的优点,既实现了加密速度快的优点,又实现了安全方便管理密钥的优点。

       如果在选定了加密算法后,那采用多少位的密钥呢?一般来说,密钥越长,运行的速度就越慢,应该根据的我们实际需要的安全级别来选择,一般来说,RSA建议采用1024位的数字,ECC建议采用160位,AES采用128为即可。

 

3. 加密算法的未来:

         随着计算方法的改进,计算机运行速度的加快,网络的发展,越来越多的算法被破解。

          在2004年国际密码学会议(Crypto’2004)上,来自中国山东大学的王小云教授做的破译MD5、HAVAL-128、MD4和RIPEMD算法的报告,令在场的国际顶尖密码学专家都为之震惊,意味着这些算法将从应用中淘汰。随后,SHA-1也被宣告被破解。

         历史上有三次对DES有影响的攻击实验。1997年,利用当时各国 7万台计算机,历时96天破解了DES的密钥。1998年,电子边境基金会(EFF)用25万美元制造的专用计算机,用56小时破解了DES的密钥。 1999年,EFF用22小时15分完成了破解工作。因此。曾经有过卓越贡献的DES也不能满足我们日益增长的需求了。

         最近,一组研究人员成功的把一个512位的整数分解因子,宣告了RSA的破解。

          我们说数据的安全是相对的,可以说在一定时期一定条件下是安全的,随着硬件和网络的发展,或者是另一个王小云的出现,目前的常用加密算法都有可能在短时间内被破解,那时我们不得不使用更长的密钥或更加先进的算法,才能保证数据的安全,因此加密算法依然需要不断发展和完善,提供更高的加密安全强度和运算速度。

         纵观这两种算法一个从DES到3DES再到AES,一个从RSA到ECC。其发展角度无不是从密钥的简单性,成本的低廉性,管理的简易性,算法的复杂性,保密的安全性以及计算的快速性这几个方面去考虑。因此,未来算法的发展也必定是从这几个角度出发的,而且在实际操作中往往把这两种算法结合起来,也需将来一种集两种算法优点于一身的新型算法将会出现,到那个时候,电子商务的实现必将更加的快捷和安全。

 

现在不同的开发语言都多多少少支持各种加密算法,并且都在不断更新。在此提供一个简单的用DES算法加密的例子,该例子用JAVA编写。

 

更多的例子请参考:http://download.csdn.net/detail/lrenjundk/4192983,包括经典对称密钥加密算法,非对称密钥加密算法,数字签名的实现,以及测试运行时间的小程序,程序代码中有详细的注释

import java.security.NoSuchAlgorithmException;    import java.security.SecureRandom;        import javax.crypto.Cipher;    import javax.crypto.KeyGenerator;    import javax.crypto.SecretKey;        /**    * @author root    *    */    public class CryptTest {                /**        * 创建密钥        *         * @param algorithm        *          加密算法,可以用于DES,DESede,Blowfish        * @return SecretKey,对称密钥        */        public SecretKey createSecretKey(String algorithm){            KeyGenerator keygen;            SecretKey deskey = null;            try {                keygen = KeyGenerator.getInstance(algorithm);                deskey = keygen.generateKey();            } catch (NoSuchAlgorithmException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }                        return deskey;        }                /**        * 将二进制转化为16进制字符串        *         * @param b        *          二进制字节数组        * @return        */        public String byte2hex(byte[] b){            String hs = "";            String stmp = "";            for(int n = 0; n < b.length; n++){                stmp = (java.lang.Integer.toHexString(b[n] & 0XFF));                if(stmp.length() == 1){                    hs = hs + "0" + stmp;                }else{                    hs = hs + stmp;                }            }            return hs.toUpperCase();        }                /**        * 根据密钥进行DES 加密        *         * @param key        *           密钥        * @param info        *           要加密的信息        * @return        *           加密后的信息        */        public String encryptToDES(SecretKey key, String info){            String Algorithm = "DES";            //随机数生成,可以不写            SecureRandom secureRandom = new SecureRandom();            byte[] cipherByte = null;            try {                //等到加密/解密器                Cipher cl = Cipher.getInstance(Algorithm);                cl.init(Cipher.ENCRYPT_MODE, key, secureRandom);                cipherByte = cl.doFinal(info.getBytes());            } catch (Exception e) {                // TODO Auto-generated catch block                e.printStackTrace();            }            //返回密文的十六进制形式            return byte2hex(cipherByte);        }                        /**        * 测试        *         * @param args        */        public static void main(String[] args){            CryptTest cryptTest = new CryptTest();                        String testString = "hello world";                        //生成一个DES算法的密钥            SecretKey key = cryptTest.createSecretKey("DES");            //用DES算法加密testString            String strl = cryptTest.encryptToDES(key, testString);            System.out.println("使用DES加密,原文为:"+testString+"\n密文为:"+strl);        }            }  
</div> </div>